
Security News
Axios Supply Chain Attack Reaches OpenAI macOS Signing Pipeline, Forces Certificate Rotation
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.
@adkit.so/meta-pixel-react
Advanced tools
React wrapper for Meta Pixel tracking with TypeScript support
The most powerful and developer-friendly Meta Pixel integration for React.
Built on top of @adkit.so/meta-pixel, this package provides a seamless, type-safe Meta Pixel experience with advanced features like event deduplication, multiple pixel support, and beautiful debug logging.
Use @adkit.so/meta-pixel-next instead! It provides:
<MetaPixel /> component - no Provider neededNEXT_PUBLIC_META_PIXEL_ID)npm install @adkit.so/meta-pixel-next
This package tracks PageView on initial load only. It does NOT automatically track PageView when navigating between pages in a Single Page Application (SPA).
React apps use client-side routing (React Router, etc.) which doesn't trigger full page reloads. The Meta Pixel script only fires PageView once when the page loads.
Option 1: Use the Next.js package (recommended for Next.js)
npm install @adkit.so/meta-pixel-next
Option 2: Manually track PageView on route changes
// With React Router
import { useEffect } from 'react'
import { useLocation } from 'react-router-dom'
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function RouteChangeTracker() {
const location = useLocation()
const meta = useMetaPixel()
const isFirstRender = useRef(true)
useEffect(() => {
// Skip first render (initial PageView is auto-tracked)
if (isFirstRender.current) {
isFirstRender.current = false
return
}
// Track PageView on route change
if (meta.isLoaded()) {
meta.track('PageView')
}
}, [location.pathname])
return null
}
// Add to your App
function App() {
return (
<MetaPixelProvider pixelIds="YOUR_PIXEL_ID">
<RouteChangeTracker />
<YourRoutes />
</MetaPixelProvider>
)
}
npm install @adkit.so/meta-pixel-react
import { MetaPixelProvider, useMetaPixel } from '@adkit.so/meta-pixel-react'
// 1. Wrap your app
function App() {
return (
<MetaPixelProvider pixelIds="YOUR_PIXEL_ID">
<YourApp />
</MetaPixelProvider>
)
}
// 2. Track events anywhere
function ProductPage() {
const meta = useMetaPixel()
function handlePurchase() {
meta.track('Purchase', { value: 99.99, currency: 'USD' })
}
return <button onClick={handlePurchase}>Buy Now</button>
}
That's it! 🎉
npm install @adkit.so/meta-pixel-react
yarn add @adkit.so/meta-pixel-react
pnpm add @adkit.so/meta-pixel-react
Wrap your app with the MetaPixelProvider component:
import { MetaPixelProvider } from '@adkit.so/meta-pixel-react'
function App() {
return (
<MetaPixelProvider
pixelIds="YOUR_PIXEL_ID"
autoTrackPageView={true}
debug={false}
enableLocalhost={false}
>
<YourApp />
</MetaPixelProvider>
)
}
| Option | Type | Default | Description |
|---|---|---|---|
pixelIds | string | string[] | required | Single pixel ID or array of pixel IDs |
autoTrackPageView | boolean | true | Automatically track PageView on initialization |
debug | boolean | false | Enable styled console logs with background colors |
enableLocalhost | boolean | false | Enable tracking on localhost (useful for testing) |
children | ReactNode | required | Your React components |
<MetaPixelProvider
pixelIds={['PIXEL_ID_1', 'PIXEL_ID_2', 'PIXEL_ID_3']}
debug={true}
enableLocalhost={true}
>
<App />
</MetaPixelProvider>
// .env.local
META_PIXEL_ID=123456789012345
REACT_APP_META_PIXEL_ID=123456789012345
// App.tsx
<MetaPixelProvider pixelIds={import.meta.env.META_PIXEL_ID}>
<App />
</MetaPixelProvider>
The useMetaPixel() hook provides direct access to the Meta Pixel instance with all tracking methods. It must be used within a MetaPixelProvider.
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function ProductPage() {
const meta = useMetaPixel()
function handleAddToCart() {
meta.track('AddToCart', {
content_name: 'Wireless Headphones',
content_ids: ['SKU_789'],
value: 149.99,
currency: 'USD'
})
}
return <button onClick={handleAddToCart}>Add to Cart</button>
}
import { useEffect } from 'react'
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function ProductPage({ product }) {
const meta = useMetaPixel()
useEffect(() => {
// Track page view when component mounts
meta.track('ViewContent', {
content_name: product.name,
content_ids: [product.id],
value: product.price,
currency: 'USD'
})
}, [product.id])
return <div>{product.name}</div>
}
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function CheckoutPage() {
const meta = useMetaPixel()
async function handlePurchase() {
const orderId = await processOrder()
meta.track(
'Purchase',
{
value: 299.99,
currency: 'USD',
content_ids: ['SKU_123']
},
{
eventID: `order-${orderId}` // Prevents duplicates
}
)
}
return <button onClick={handlePurchase}>Complete Purchase</button>
}
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function MyComponent() {
const meta = useMetaPixel()
function trackIfReady() {
if (meta.isLoaded()) meta.track('Purchase', { value: 99.99, currency: 'USD' })
else console.log('Pixel not loaded yet')
}
return <button onClick={trackIfReady}>Buy Now</button>
}
When debug={true}, you'll see beautiful styled console logs:
Example output:
[Meta Pixel] Initializing Meta Pixel... { pixelIds: [...], autoTrackPageView: true }
[Meta Pixel] ✓ Meta Pixel initialized successfully
[Meta Pixel] Tracking standard event: "Purchase" { data: {...}, eventData: {...} }
<MetaPixelProvider
pixelIds="YOUR_PIXEL_ID"
debug={true}
>
<App />
</MetaPixelProvider>
All Meta Pixel standard events are supported with full TypeScript autocomplete. These events help you track important actions on your website and optimize your ad campaigns.
| Event | Description | Common Use Cases |
|---|---|---|
AddPaymentInfo | Payment info added | Checkout flow |
AddToCart | Item added to shopping cart | E-commerce |
AddToWishlist | Item added to wishlist | E-commerce |
CompleteRegistration | User completed registration | Sign-ups, account creation |
Contact | User contacted business | Contact forms |
CustomizeProduct | Product customization started | Product configurators |
Donate | Donation made | Non-profits |
FindLocation | Location finder used | Store locators |
InitiateCheckout | Checkout process started | E-commerce funnels |
Lead | Lead submitted | Lead generation forms |
Purchase | Purchase completed | Transaction confirmation |
Schedule | Appointment scheduled | Booking systems |
Search | Search performed | Site search |
StartTrial | Trial started | SaaS applications |
SubmitApplication | Application submitted | Job boards, loan applications |
Subscribe | Subscription started | Newsletters, subscriptions |
ViewContent | Content viewed | Product pages, blog posts |
You can find the official list of standard events here.
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function EcommerceExample() {
const meta = useMetaPixel()
function trackPurchase() {
meta.track('Purchase', {
value: 299.99,
currency: 'USD',
content_ids: ['SKU_12345'],
content_type: 'product',
num_items: 1
})
}
function trackLead() {
meta.track('Lead', { content_name: 'Newsletter Signup', content_category: 'Marketing' })
}
function trackSearch(query: string) {
meta.track('Search', { search_string: query })
}
return (
<div>
<button onClick={trackPurchase}>Complete Purchase</button>
<button onClick={trackLead}>Sign Up</button>
<input onChange={(e) => trackSearch(e.target.value)} placeholder="Search..." />
</div>
)
}
All event parameters are optional but help improve ad targeting and conversion tracking. Here are the most common ones:
| Parameter | Type | Description | Example |
|---|---|---|---|
value | number | Monetary value of the event | 99.99 |
currency | string | ISO 4217 currency code | 'USD', 'EUR', 'GBP' |
content_ids | string[] | Product IDs or SKUs | ['SKU_123', 'SKU_456'] |
content_type | string | Type of content | 'product', 'product_group' |
content_name | string | Name of page/product | 'Blue T-Shirt' |
content_category | string | Category of page/product | 'Apparel', 'Electronics' |
contents | Array<{id, quantity}> | Detailed product information | [{id: 'SKU_123', quantity: 2}] |
num_items | number | Number of items | 3 |
search_string | string | Search query | 'running shoes' |
status | boolean | Registration/subscription status | true |
predicted_ltv | number | Predicted lifetime value of customer | 450.00 |
You can find the list of properties here.
import { useState, useEffect } from 'react'
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function ProductPage() {
const meta = useMetaPixel()
const [product] = useState({
id: 'SKU_789',
name: 'Wireless Headphones',
price: 149.99,
category: 'Electronics'
})
// Track page view when component mounts
useEffect(() => {
meta.track('ViewContent', {
content_ids: [product.id],
content_type: 'product',
content_name: product.name,
content_category: product.category,
value: product.price,
currency: 'USD'
})
}, [product.id])
function handleAddToCart() {
meta.track('AddToCart', {
content_ids: [product.id],
content_type: 'product',
content_name: product.name,
value: product.price,
currency: 'USD'
})
}
async function handlePurchase() {
const orderId = await processOrder()
meta.track(
'Purchase',
{
content_ids: [product.id],
content_type: 'product',
value: product.price,
currency: 'USD',
num_items: 1
},
{
eventID: orderId // For deduplication
}
)
}
return (
<div>
<h1>{product.name}</h1>
<p>${product.price}</p>
<button onClick={handleAddToCart}>Add to Cart</button>
<button onClick={handlePurchase}>Buy Now</button>
</div>
)
}
Track custom events specific to your business:
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function PricingPage() {
const meta = useMetaPixel()
function trackPricingView() {
meta.trackCustom('PricingPageViewed', { plan: 'enterprise', duration: 'annual' })
}
function trackVideoComplete() {
meta.trackCustom('VideoWatched', { video_id: 'intro_2024', watch_percentage: 100 })
}
return (
<div>
<button onClick={trackPricingView}>View Pricing</button>
<video onEnded={trackVideoComplete}>Your video</video>
</div>
)
}
Prevent duplicate event tracking by using unique event IDs. This is crucial when tracking conversions from both client and server (Conversions API):
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function CheckoutPage() {
const meta = useMetaPixel()
async function processOrder() {
const orderId = await createOrder()
// Use order ID as event ID to prevent duplicates
meta.track(
'Purchase',
{
value: 299.99,
currency: 'USD',
content_ids: ['SKU_123']
},
{
eventID: `order-${orderId}`
}
)
// Even if this fires multiple times or from server too,
// Meta will deduplicate based on eventID
}
return <button onClick={processOrder}>Complete Order</button>
}
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function RegisterPage() {
const meta = useMetaPixel()
const { user } = useAuth()
async function handleRegistration() {
// Only track if pixel is loaded
if (!meta.isLoaded()) {
console.warn('Meta Pixel not loaded yet')
return
}
// Track registration with user context
meta.track('CompleteRegistration', {
status: true,
content_name: user.accountType,
value: user.predictedLTV
})
}
return <button onClick={handleRegistration}>Sign Up</button>
}
import { useState, FormEvent } from 'react'
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function ContactForm() {
const meta = useMetaPixel()
const [formData, setFormData] = useState({ name: '', email: '' })
async function handleSubmit(e: FormEvent) {
e.preventDefault()
// Track the lead
meta.track('Lead', {
content_name: 'Contact Form Submission',
content_category: 'Contact',
value: 10.00 // Estimated lead value
})
await submitForm(formData)
}
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
placeholder="Name"
required
/>
<input
type="email"
value={formData.email}
onChange={(e) => setFormData({ ...formData, email: e.target.value })}
placeholder="Email"
required
/>
<button type="submit">Submit</button>
</form>
)
}
import { useState } from 'react'
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function SearchBar() {
const meta = useMetaPixel()
const [query, setQuery] = useState('')
function handleSearch(e: FormEvent) {
e.preventDefault()
meta.track('Search', { search_string: query })
performSearch(query)
}
return (
<form onSubmit={handleSearch}>
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search products..."
/>
<button type="submit">Search</button>
</form>
)
}
While the Provider pattern is recommended for most React applications, we offer alternative patterns if you prefer different approaches:
import { MetaPixelProvider, useMetaPixel } from '@adkit.so/meta-pixel-react'
function App() {
return (
<MetaPixelProvider pixelIds="YOUR_PIXEL_ID">
<Component />
</MetaPixelProvider>
)
}
function Component() {
const meta = useMetaPixel()
meta.track('Purchase', { value: 99, currency: 'USD' })
}
Pros: Clean React Context pattern, explicit initialization, works well with other providers
import { useMetaPixel } from '@adkit.so/meta-pixel-react'
function App() {
// Initialize once at root
useMetaPixel({ pixelIds: 'YOUR_PIXEL_ID' })
return <Component />
}
function Component() {
// Use anywhere without config
const meta = useMetaPixel()
meta.track('Purchase', { value: 99, currency: 'USD' })
}
Pros: No wrapper component, minimal code, still uses hooks
import { initMetaPixel, useMetaPixel } from '@adkit.so/meta-pixel-react'
// In main.tsx or index.tsx
initMetaPixel({ pixelIds: 'YOUR_PIXEL_ID' })
// Then in your components
function Component() {
const meta = useMetaPixel()
meta.track('Purchase', { value: 99, currency: 'USD' })
}
Pros: Can initialize outside components, useful for entry files like main.tsx
Full type safety with exported types:
import type {
StandardEvent,
EventData,
EventMetaData,
MetaPixelConfig
} from '@adkit.so/meta-pixel-react'
const config: MetaPixelConfig = { pixelIds: 'YOUR_PIXEL_ID', debug: true }
function trackEvent(event: StandardEvent, data: EventData) {
const meta = useMetaPixel()
meta.track(event, data)
}
All methods, events, and parameters have complete TypeScript definitions with IntelliSense support in your IDE.
debug={true} to see detailed logsenableLocalhost={true} for local testingMake sure your components are wrapped with MetaPixelProvider:
// ✅ Correct
<MetaPixelProvider pixelIds="YOUR_PIXEL_ID">
<Component />
</MetaPixelProvider>
// ❌ Wrong - Hook called outside Provider
<Component />
eventID to prevent duplicatesMake sure you have the latest version:
npm update @adkit.so/meta-pixel-react
// ✅ Correct
<MetaPixelProvider pixelIds={['ID_1', 'ID_2']}>
<App />
</MetaPixelProvider>
// ❌ Incorrect
<MetaPixelProvider pixelIds="ID_1,ID_2">
<App />
</MetaPixelProvider>
Learn more about Meta Pixel from official Facebook resources:
For a complete step-by-step guide on installing and configuring Meta Pixel, check out our detailed tutorial:
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
MIT
Made with ❤️ by Adkit
If this package helped you, please consider giving it a ⭐️ on GitHub!
FAQs
React wrapper for Meta Pixel tracking with TypeScript support
We found that @adkit.so/meta-pixel-react demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.

Security News
Open source is under attack because of how much value it creates. It has been the foundation of every major software innovation for the last three decades. This is not the time to walk away from it.

Security News
Socket CEO Feross Aboukhadijeh breaks down how North Korea hijacked Axios and what it means for the future of software supply chain security.