Back to all integrations
Ads & analytics

Meta Ads

Sending server-side conversions and offline events to Meta so ad delivery optimizes against real closed business.

On this page
What it connectsHow to connect itWhat data movesWorked exampleLimits and gotchas
Need this wired up?

Bring your stack to a call and we will connect it, test every field in both directions, and hand it over documented.

Book a call
01

What it connects

On the Meta side sit an ad account, its campaigns, and the two objects that receive your outcome data: a pixel or dataset that accepts server-side events through the Conversions API, and the offline-event mechanism used for sales that happen away from the browser. Meta's delivery system optimizes toward whatever events it receives, matching each one to a person using the identifiers you supply (a click identifier, a browser identifier, or hashed contact details) and it has no other knowledge of your business.

On the AppBO side sit the contact record, the pipeline, and the facts: who replied, who booked, who attended, who bought and for how much. Lead ads and website forms tell Meta that someone expressed interest; only you know whether that interest became money.

Wiring the two together serves two purposes that are worth separating. The first is resilience: browser-based pixel tracking is degraded by ad blockers, tracking restrictions and cookie consent, so sending the same events server-side recovers signal that the browser loses. The second is closed-loop optimization: sending the later stages (qualified, booked, purchased, with value) lets Meta find more people who behave like your buyers rather than more people who fill in forms. The cost is that you are now sending customer data to an advertising platform, which makes consent, hashing and your privacy notice part of the implementation rather than an afterthought.

02

How to connect it

  1. Settle the event model before touching any settings. Decide which named events you will send, which one is the optimization target, and which are observed only. Decide where value is attached, and attach it to exactly one event per customer journey.
  2. Confirm the ad account, pixel or dataset and Page all sit under the business's own Meta Business account, and that you have the access needed to configure the dataset.
  3. Create or identify the pixel or dataset that will receive events. Note its identifier, and generate the access token the server-side connection needs. Treat that token as a credential.
  4. Decide how the browser pixel and the server-side events will coexist. Sending both is usually right, but every event you send twice needs a shared event identifier so Meta can deduplicate: otherwise your conversions double.
  5. Install the pixel on your funnels, landing pages and websites if it is not already there, and confirm it fires on the pages you expect.
  6. Create a custom field on the contact for the click identifier Meta appends to ad destination URLs, and configure every form, booking widget and chat entry point to capture it from the URL on first touch. Capture the browser identifier too where the platform supports it; together they are the strongest match signals available.
  7. In the sub-account, open the integrations area and connect Meta, then supply the pixel or dataset identifier and the access token where the platform asks for them.
  8. Map each platform event to a Meta event name. Use Meta's standard event names where one fits, because the standard events are what the optimization objectives are built around, and reserve custom events for things no standard event describes.
  9. Decide which identifiers accompany each event. The click identifier when you have it; hashed email and hashed phone as additional match keys; and nothing that is not hashed as Meta's specification requires.
  10. Confirm your legal position before sending contact-derived identifiers. Check consent capture, confirm what your privacy notice says, and apply any regional restrictions. If consent was not given, do not send the identifiers.
  11. Set the value and currency on the purchase or won event from the real deal value on the opportunity, with a validated fallback so a blank never goes out.
  12. Build the workflows that send events, triggered on the stage change or appointment outcome that genuinely marks each milestone, each guarded so the same contact cannot send the same event twice.
  13. Set the event time to the moment the conversion happened, not the moment of upload, and note the maximum age Meta accepts for a server-side or offline event. Check the current figure in Meta's documentation, because an event older than that is discarded.
  14. For sales with no digital touch at all, use the offline-event path and decide whether that is a scheduled upload or an event-by-event send.
  15. Verify in Meta's Events Manager. Use the test-event tool to confirm events arrive with the payload you expect, then check the event-match-quality indicator for each event. A low score means your identifiers are too thin for Meta to match the person.
  16. Check deduplication: fire a pixel event and its server-side twin for the same action and confirm Events Manager reports one conversion, not two.
  17. Run the whole path with a real test: click your own ad, submit a form, move the contact through the stages, and confirm each event appears attributed to the campaign.
  18. Leave the new event as an observed secondary signal for a few weeks, confirm the volumes and values look sane, and only then point a campaign's optimization at it.
03

What data moves

Meta to the platform

  • The click identifier appended to ad destination URLs, captured into a contact field at first touch.
  • Campaign, ad set and ad parameters where your ad URLs carry them.
  • The browser identifier set by the pixel, where the platform captures it.
  • Nothing about who the person is. Meta does not reveal the identity behind a click.

Platform to Meta

  • Server-side conversion events: the event name, the event time, a unique event identifier for deduplication, the action source, and the value and currency where relevant.
  • Match identifiers with each event: the click identifier, the browser identifier, and hashed email and phone where consent permits.
  • Offline conversion events for sales that happen with no browser involved.
  • Custom properties on an event, such as a service category or a lead-quality band, where you want Meta to be able to distinguish them.
  • Nothing that alters campaigns. This integration reports outcomes; it does not build audiences, set budgets or pause ads.

What does not move

  • Spend, impressions, reach, frequency and cost figures into the platform. Ad performance reporting is a separate concern.
  • Events for contacts with no usable identifier. Without a click identifier, browser identifier or permitted hashed detail, Meta cannot match the person and the event is effectively lost.
  • Events older than Meta's accepted window, which are discarded rather than queued.
  • Unhashed personal data. Meta's specification requires hashing of contact identifiers, and sending raw values is both a policy breach and a rejection.
  • Lead-ad submissions. Those arrive through the Pages connection, not this one.
  • Attribution credit. Meta decides how to attribute within its own windows; you supply the event, not the credit.
  • Audience and custom-audience membership, and lookalike creation.
04

Worked example

Scenario: a cosmetic clinic running Meta lead ads moves from optimizing for leads to optimizing for completed treatments.

  1. The clinic's ad account, pixel and Page are confirmed as owned by the clinic's own Meta Business account. A dataset access token is generated for server-side sending.
  2. The event model is agreed: a lead event when the form is submitted, a schedule event when a consultation is booked, and a purchase event carrying the real treatment value when the treatment is paid for. Purchase will eventually be the optimization target.
  3. The pixel is confirmed as firing on the funnel pages, and a custom field is created on the contact for Meta's click identifier, captured by the funnel form, the booking widget and the chat widget.
  4. The platform's Meta connection is configured with the dataset identifier and token. Each workflow that sends an event is set to generate a unique event identifier so the pixel's own event and the server-side event deduplicate.
  5. Consent is reviewed: the funnel's consent language is updated, and the workflows are set to include hashed email and phone only when the consent field is set.
  6. A prospect clicks a lead ad and submits the form. The click identifier is stored. The pixel fires a lead event in the browser and the platform sends the matching server-side lead event with the same event identifier.
  7. Events Manager shows one lead, not two, and reports a strong event-match-quality score because both the click identifier and the hashed email accompanied the event.
  8. A consultation is booked. A workflow sends the schedule event with the click identifier and the appointment time as the event time.
  9. She attends, decides on a treatment, pays a deposit and books the procedure. When the balance is paid, the opportunity is marked won with the full value on the record.
  10. A workflow sends the purchase event, with the real value, the currency, the event time set to the payment date, and the stored identifiers.
  11. A second prospect who came from the same campaign never answers the phone. No schedule or purchase event is ever sent for her, which is exactly the signal Meta needs.
  12. After a month the clinic compares the two ad sets: one produced many cheap leads and almost no treatments, the other produced fewer, costlier leads and most of the revenue.
  13. The campaign's optimization is switched to the purchase event with value optimization, and budget is shifted to the ad set that actually produced treatments.
  14. One client cancels and is refunded. The team sends the corresponding adjustment so the delivery system is not taught to pursue that outcome, and notes the cancellation in the clinic's own reporting as well.
  15. A monthly check of Events Manager catches the event-match-quality score falling on the schedule event, traced to a new booking page that was not capturing the click identifier.
05

Limits and gotchas

Rate limiting

Meta rate limits the Conversions API per dataset and per application, and a bulk backfill is the operation that hits it. Batch events rather than sending them one at a time, pace a historical upload, and read the throttling information Meta returns in response headers instead of guessing a ceiling; the current limits are published in Meta's developer documentation. A throttled send should be queued and retried with backoff rather than dropped, because a lost purchase event is a lost optimization signal.

Retries and idempotency

The event identifier is the idempotency mechanism, and it does double duty: it deduplicates a retried server-side send, and it deduplicates the server-side event against its browser-pixel twin. Generate it deterministically from the thing that happened (the contact and the milestone) rather than randomly per attempt, or a retry will count twice. Meta deduplicates within a window rather than forever, so an event resent days later is a new conversion. Guard the workflow as well, so a replayed trigger does not send at all.

Field-mapping traps

Standard event names are case-sensitive and spelling-sensitive, and a near-miss creates a custom event that no optimization objective is looking at. Everything appears to work while nothing improves. Hashing must follow Meta's specification exactly, including normalization of the value before hashing; a correctly hashed but un-normalized email matches nothing. Phone numbers need full international format before hashing. Value and currency must be consistent, and a value sent in the wrong currency unit distorts value-based optimization. The action source field tells Meta where the event happened and affects attribution, so set it honestly.

Duplicate creation

Double-counted conversions are the characteristic failure of this integration: pixel and server-side events sent without a shared identifier, two workflows firing on overlapping triggers, or a re-enterable pipeline stage. Duplicate contacts in the CRM produce duplicate events with the same identifiers, which also damages match quality. Clean the duplicates before judging the numbers, and check Events Manager's deduplication reporting rather than trusting the configuration.

Sandbox versus live

Events Manager's test-event tool is the sandbox, and it is good: it shows the exact payload received, flags malformed fields and reports match quality without affecting reporting. What it cannot show is how delivery responds, which needs real volume. Follow the same pattern as any ad-platform change. Send as an observed event first, confirm sanity, then optimize against it.

Authentication expiry

The dataset access token is the fragile part. It can be revoked, it can expire depending on how it was generated, and it dies with the business-account access of the person who created it. Business-account ownership changes and admin removals break it in the same way. The symptom is events silently failing while campaigns keep spending, so watch the event volume in Events Manager as the health signal rather than the platform's connection badge, and keep more than one business-account administrator.

What commonly breaks

  • Pixel and server-side events both firing with no shared event identifier, doubling every conversion.
  • A misspelled standard event name quietly becoming a custom event.
  • Hashing done without Meta's normalization, producing events that match nobody.
  • Event time set to the upload time, pushing an old conversion outside the accepted window.
  • The click identifier never captured, because a landing page sits outside the platform.
  • Consent ignored, with hashed contact details sent for people who declined. A compliance problem rather than a technical one.
  • Value sent on several events in one journey, inflating return on ad spend until nobody trusts the dashboard.
  • Optimization pointed at a low-volume event, so campaigns never leave the learning phase.
  • Refunds and cancellations never adjusted.
  • The dataset token stored and then rotated for security, with nobody updating the integration.

Connect it with us.

We wire the integration, map the fields, test both directions and hand it over with the SOPs your team needs to run it.

Book a call