Meta CAPI: Conversions API Gateway vs self-hosted vs GTM server
There are three common ways to run the Meta Conversions API, and they trade setup effort against control. Here is which one fits which team.
There are three ways to run Meta's Conversions API: Meta's hosted Conversions API Gateway, a server-side GTM container you run yourself, or a direct integration from your backend. They differ in effort, cost, and — most importantly — in where the events originate, which determines how accurate they are. Direct backend integration is the most accurate because it fires from the system of record; the Gateway is the fastest to deploy; server-side GTM is the right answer if you already run one.
The three options
Conversions API Gateway
Meta's hosted service. You point a subdomain at it, it receives browser events, and it forwards them to Meta server-side. Deployment is largely guided.
Good: running quickly, no infrastructure to operate, handles deduplication and identifier forwarding sensibly by default.
Less good: a recurring hosting cost, limited payload customisation, and — the important one — it forwards browser events. If the browser event never happened because a blocker stopped it, the Gateway has nothing to forward. It improves durability of delivery, not coverage of blocked events.
Server-side GTM
Your server container receives events and forwards them to Meta alongside GA4, Google Ads, TikTok, and anything else.
Good: one pipeline for every vendor, full payload control, and the marginal cost of adding Meta is near zero if the container already exists.
Less good: you are operating a server container. If you do not already have one, standing it up for Meta alone is disproportionate — when it is justified.
Direct from your backend
Your application posts to Meta's Graph API when the event actually occurs — when an order is written, a payment captured, a lead qualified.
Good: the most accurate option by a clear margin, because it fires from the system of record rather than from a page render. Immune to blockers, page abandonment, and confirmation-page refreshes. You control retries, error handling, and exactly which data leaves.
Less good: real engineering work, owned by a team with other priorities. Retries, idempotency, and monitoring are yours.
| Gateway | Server-side GTM | Direct backend | |
|---|---|---|---|
| Setup effort | Low | Moderate | High |
| Ongoing cost | Subscription | Hosting | Engineering time |
| Event origin | Browser, relayed | Browser, relayed | System of record |
| Payload control | Limited | Full | Full |
| Other vendors | Meta only | All | Per integration |
| Accuracy ceiling | Good | Good | Highest |
The distinction that actually matters
Both the Gateway and server-side GTM relay events that started in the browser. Direct backend integration originates them server-side.
This is not a subtle difference:
- A browser purchase event fires when a confirmation page renders. If the user closes the tab first, it never fires.
- A backend purchase event fires when payment is captured. It always fires.
So the Gateway and server-side GTM improve delivery — the event, once created, is much more likely to arrive at Meta. Direct integration improves creation — the event exists regardless of what the browser did.
For most businesses the practical answer is both: a browser pixel for identity and click context, and a backend send for the authoritative record, deduplicated against each other.
Whichever you choose, these decide success
Deduplication. Same event name, same event_id, from both browser and server, close together in time. Generate the ID once at the source — an order ID plus event name works well.
Browser context forwarded to the server. The _fbp cookie, the _fbc click cookie, the visitor's IP, and the visitor's user agent. Read them in the browser, store them with the order, forward them. Server implementations that send the server's own IP and user agent match almost nobody — this is the most common and most expensive mistake.
Hashed identifiers, normalised first. Lowercase and trim email, E.164 for phone, then SHA-256. Never send raw personal data.
Consent respected. Server-side transport does not change the legal basis. Gate sends on consent state.
Meta Pixel vs Conversions API covers each of these in detail.
Choosing
- Already running server-side GTM? Add Meta there. The marginal cost is close to zero and you get one pipeline for every vendor.
- No server container, and no engineering capacity? The Gateway, and accept the payload limitations.
- Engineering capacity and meaningful spend? Direct backend integration, keeping the browser pixel for identity. This is where the accuracy ceiling is.
- On a major commerce platform? Check the native integration first — Shopify and others handle a competent CAPI implementation for you, and it may be enough.
The wrong reason to choose any of them is a promise of recovering everything blockers cost you. All three improve measurement; none resurrect events whose browser context was never captured.
FAQ
Is the Conversions API Gateway worth the cost?
If you have no server container and no engineering capacity, yes — it is the fastest route to a working CAPI implementation. If you already run server-side GTM, it is redundant.
Does the Gateway recover events blocked by ad blockers?
Not really. It relays events that originated in the browser, so an event a blocker prevented never reaches it. Only a backend integration firing from your system of record covers that case.
Can I run the Conversions API without any server infrastructure?
Yes — platform integrations for Shopify, WooCommerce and others handle it, as does the hosted Gateway. Both trade payload control for convenience.
Which option gives the best Event Match Quality?
Whichever forwards the most identifiers correctly. Direct backend integration usually wins because you control the payload completely, but a well-configured Gateway forwarding the browser cookies, IP, and user agent performs well too.
Do I still need the browser pixel with any of these?
Yes. The pixel sets _fbp and captures _fbc from the ad click. Without those identifiers, server events — from any of the three options — match far worse.
Confirm your Meta Pixel is initialising before you add a server layer: the free tracking audit checks it on any URL.
See where your tracking stands
Run the same 13-check audit referenced in this post against any URL. No signup, results in seconds.