If you run Meta ads and your only tracking is the Meta Pixel on WordPress, your ad account is learning from an incomplete picture. Ad blockers, browser privacy features and iOS changes mean a meaningful share of conversions never reach Meta from the browser. The Conversions API (CAPI) sends the same events from your server, where nothing blocks them. Together, the two give Meta enough signal to optimise properly.
This guide installs both on WordPress, keeps them from double-counting, and verifies the result. It assumes Google Tag Manager is already on the site — if not, the GTM on WordPress guide is the first step — and that you have decided which events matter, per the conversion tracking guide.
What you are building
| Layer | Where it runs | What it catches | What it misses |
|---|---|---|---|
| Meta Pixel | Visitor’s browser | Page views, clicks, browser-side signals (fbp/fbc cookies) | Anything an ad blocker or privacy setting stops |
| Conversions API | Your server (WordPress) or a server container | Form submissions, bookings, purchases — reliably | Browser-only signals unless you pass them along |
The two overlap on purpose. The event ID is what lets Meta merge them into one conversion.
Step 1: Get your Pixel ID and create an access token
In Meta Events Manager, select the Pixel (or create one), note the Pixel ID, and under Settings → Conversions API generate an access token. Store the token somewhere safe; it is a credential, not a setting to paste into a page.
Step 2: Install the Pixel through Tag Manager
- In GTM, add a new tag. Use the community “Facebook Pixel” template from the gallery or a Custom HTML tag with the base Pixel code.
- Enter the Pixel ID. Trigger: Initialization – All Pages (or, with consent mode, only after ad-storage consent is granted).
- Add event tags for the standard events you care about: Lead on your
form_submitandbook_calltriggers, Contact onphone_click, Purchase from WooCommerce’s data layer if you sell online. Use Meta’s standard event names; the ad account understands those. - Pass an
eventIDparameter with every event tag. Generate it in the data layer push — a timestamp plus a random string is enough — and store it so the server side can send the same value.
Step 3: Add the Conversions API
Three practical routes, depending on your setup:
Route A — a WordPress plugin with CAPI support
Meta’s official “Meta Pixel for WordPress” plugin and several tracking plugins can send server events for common form plugins and WooCommerce. Enter the Pixel ID and access token in the plugin, enable the events you need, and it posts them from the server on submission. Simplest option; least control over custom events.
Route B — Tag Manager server container
A server-side GTM container (hosted on Google Cloud or a third-party host) receives events from the browser container and forwards them to Meta via the Conversions API tag. More setup and a small hosting cost, but everything stays in one tagging system and you can forward the same events to other platforms. Right for businesses spending seriously on ads.
Route C — the CRM sends the events
If form submissions already go to a CRM such as GoHighLevel, the CRM can fire the Conversions API event when the lead is created — and, better, when the lead is later marked won. That last part is the real prize: Meta learning from customers rather than form fills. The wiring between the form and the CRM is described in connecting WordPress forms to your CRM.
Whichever route, the server event must include the customer parameters Meta uses to match (hashed email and phone, the fbp/fbc cookie values, IP and user agent) and the same event_id the browser sent. The official Conversions API documentation lists the parameters; plugins handle the hashing for you.
Step 4: De-duplicate
This is the step most setups skip, and the reason Events Manager shows twice as many leads as you have. Rule: the browser Pixel and the server send the same event name with the same event_id. Meta then keeps one. In Events Manager, the event’s details page shows a “Deduplicated” badge when it is working. If you see both a browser and a server event with different IDs, the fix is on the data-layer side: generate the ID once, use it twice.
Step 5: Consent
For UK and EU visitors, the Pixel needs consent before it fires. With Google Consent Mode v2 in GTM, gate the Pixel tags on ad_storage being granted. Server events are also subject to consent — do not send CAPI events for visitors who declined. Meta’s own “Limited Data Use” flags cover some US state requirements; your consent tool usually handles the setting.
Step 6: Verify in Events Manager
- Open Events Manager → Test events, enter your site, and browse it in a private window on a phone.
- Submit the form. You should see Lead once, with “Browser · Server” (or a deduplicated indicator) if both layers fired.
- Tap the phone number: Contact.
- Check Diagnostics for warnings about missing parameters or event ID mismatches, and fix them now — they only get harder to trace later.
- Give it a day, then look at the event’s Event match quality score. Higher means better matching; adding hashed email and phone to server events raises it.
Common problems and fixes
| Symptom | Cause | Fix |
|---|---|---|
| Leads counted twice | No shared event ID | Generate once, send from browser and server |
| Pixel fires twice per page | Pixel in GTM and in a plugin/theme | Keep one installation (GTM) |
| Lead fires on failed submissions | Trigger on button click | Trigger on form success event |
| Low event match quality | Server events lack email/phone/fbp | Pass hashed customer data and cookies |
| No events from EU visitors | Consent denied (correct) or consent tool blocking everything | Check consent mode configuration |
| Ads optimise for form fills, not customers | Only Lead is sent | Send a Purchase/custom event when the CRM marks won |
The upgrade that matters most Sending a conversion when a lead becomes a customer — from the CRM — teaches Meta what a good lead looks like. It is worth more than any pixel tweak, and it is why the form-to-CRM connection and the tracking setup should be planned together.
FAQ
Do I still need the Meta Pixel if I use the Conversions API?
Yes. Use both. The Pixel captures browser signals the server does not have; the Conversions API captures events browsers block. Send the same event ID from both so Meta counts each conversion once.
Is the Meta Pixel plugin for WordPress good enough?
Meta’s official plugin installs the Pixel and can send server events for some form plugins, and it is fine for simple sites. Tag Manager gives more control over which events fire and when, and avoids a second tracking system if you already run GTM.
Why does Events Manager show my Lead event twice?
The browser Pixel and the Conversions API are both reporting it without a matching event ID, so Meta cannot de-duplicate. Send the same event_id with both, and the count drops to one.
Does the Conversions API need a developer?
Not necessarily. Several WordPress plugins and GoHighLevel’s native integration send server events without code. A developer is useful when you need custom events or event IDs shared between browser and server.
Running Meta ads and unsure what the account is actually learning from? Book a call — I will check the Pixel, the API and the de-duplication in Events Manager with you, live.