Track your sales
Send every paid order to Meta as a server event, deduplicated against the pixel, so your campaigns learn from real purchases.
Meta only optimizes toward sales it can see. Browsers, ad blockers and privacy settings hide a share of them from the pixel. Server events (Meta calls them the Conversions API) fix that: your store tells CamClo about each paid order, CamClo forwards it to Meta with the buyer details Meta matches on, and Meta counts it once. Set-up is two pastes for Shopify, two tags for a custom site, or two pastes and one webhook for WooCommerce. Open the Tracking Doctor from Settings, your Meta account, to get your own copy of every tag and URL.
At a glance
- Where
- Ad Studio, Settings, your Meta account, Tracking Doctor, Fix it step
- Shopify
- Paste one pixel, create one webhook, turn Shopify's own Meta sharing off
- Custom site
- Paste a base tag on every page and a purchase tag on the confirmation page
- WooCommerce
- Paste a base tag and a purchase tag, then create one order webhook
- What Meta gets
- One Purchase per order with hashed email, phone, name, address, plus the browser and click ids
- What CamClo keeps
- Event name, order id, value, currency and yes-or-no flags. Never the person. Rows expire after 90 days
- Google Ads
- The same relay sends each order to Google with the click id; see the Google Ads section
- Cost
- Free. No Meta review needed on your side
If Shopify's Facebook & Instagram app, Facebook for WooCommerce or another pixel app already sends server events, turn that sharing off before you use CamClo's, or leave CamClo's off. Two sources make Meta count every sale twice.
Shopify
No app, no theme edits. The pixel runs on every page and in the checkout. The webhook sends each paid order from Shopify's servers, so the Purchase reaches Meta even when the browser blocked everything.
- 1
Turn on server events
In the Tracking Doctor pick Shopify, enter your store's myshopify.com domain (Settings, Domains in Shopify shows it) and click Turn on server events.
- 2
Paste the CamClo pixel
Shopify admin: Settings, Customer events, Add custom pixel. Name it CamClo pixel, click Add pixel, replace the editor's code with the pixel from the Doctor, click Save, then Connect. Leave Permission on Marketing and Analytics so it follows each visitor's consent choice. Open your store once: the pixel counter in the Doctor should move. The pixel sends page views, product views, searches, add to carts, checkouts and payment details to Meta from CamClo's server, with the same id as the browser copy, so each counts once. Pasted an earlier CamClo pixel? Replace it with the current one.
- 3
Create the order webhook
Shopify admin: Settings, Notifications, Webhooks, Create webhook. Event Order payment, format JSON, latest API version, URL copied from the Doctor. Create one more with the same URL and Event Order creation, so cash on delivery orders count when they are placed (each order still counts once). Save, then copy the signing secret shown at the bottom of the Webhooks page into the Doctor and save it. Optional: two more webhooks with the same URL for Refund create and Order cancellation so net revenue stays right.
- 4
Make CamClo the only source
If the Facebook & Instagram app is installed: Settings, Apps and sales channels, Facebook & Instagram, App settings, turn Share data off. Catalog and shop features keep working. Remove any other pixel app.
- 5
Verify
Place a test order, then press Done, verify it in the Doctor. The order shows in What we have taken in as sent, and in Meta Events Manager within minutes.
It works with one switch, but it sends less identity and merchants report lower match scores with it. If you prefer it anyway, set it to Maximum in that app and leave CamClo's server events off.
Custom site or any other platform
Two ways. Option A needs no developer: two tags. Option B is for whoever runs your backend: one request per paid order. Both start with Turn on server events in the Doctor and your store address, which is the only site the tags may report from.
- 1
Option A, base tag
Paste the base tag once before
</head>on every page. It loads the Meta pixel, remembers which ad brought the visitor, and definescamcloTrack, which fires the pixel and sends the same event to CamClo with one shared id. Squarespace: Settings, Developer Tools, Code Injection, Header. BigCommerce: Storefront, Script Manager, placement Head. - 2
Option A, purchase tag
Paste the purchase tag on the order confirmation page, after the base tag. Fill in the order id, total and currency; email, phone, name and address are optional but lift the match score. Squarespace and BigCommerce fill their own order variables for you. Wix has its own Meta integration: use that instead and leave CamClo's server events off.
- 3
Option B, your backend
When an order is paid, POST JSON to the Any backend URL from the Doctor. Required:
event_namePurchase,event_id= the order id,value,currency, and at least one of email, phone, external_id, fbp, fbc, or ip plus user_agent. Senduser_agentandsource_urlso Meta counts it as a website event. Up to 100 events per request; the same event id sent twice is ignored. The Doctor has curl, Node and PHP samples and a note you can hand to your developer. - 4
Verify
Open your site or place a test order, then press Done, verify it. Optional: Send a test event from the Doctor proves the relay works without touching your reporting.
The Doctor also offers ViewContent, AddToCart, InitiateCheckout and Lead tags. Meta learns from these before the purchase. Paste them where the action happens. Under What CamClo sends you can switch any event except orders off, for example while another tool still sends it, and choose whether an order counts when it is placed or when it is paid (Shopify, WooCommerce, BigCommerce and Webflow). The base tag picks up product views, searches, add to cart and checkout by itself on WooCommerce, Wix, Ecwid, BigCommerce, Magento, Squarespace and Webflow; each event there is marked Automatic or Needs a tag.
Under What CamClo sends you can leave some orders out of ad bidding: below a minimum value, outside the countries you choose, from sources such as your own emails, with chosen discount codes, or (on Shopify) from repeat customers. Meta gets them as OtherPurchase, which bidding ignores, and Google Ads does not get them. They still count in your own sales. Fewer sales to learn from means slower learning, and the Doctor says when your filters leave out a large share.
WooCommerce
Two pastes in WordPress and one webhook, all processed by CamClo. The base tag remembers the ad click and reports the funnel; the purchase tag on the order-received page passes the browser id and click id along; the webhook sends each paid order from your server with the buyer details.
- 1
Turn on server events
In the Tracking Doctor pick WooCommerce, enter your store address and click Turn on server events.
- 2
Paste the base tag
Before
</head>on every page, with a headers-and-footers plugin or in your child theme's header. - 3
Paste the purchase tag
It is PHP. Paste it into a code snippets plugin (PHP, run everywhere) or your child theme's
functions.php. WooCommerce fills the order id, total, currency, email, phone, name and address for you. - 4
Create the order webhook
WordPress admin: WooCommerce, Settings, Advanced, Webhooks, Add webhook. Status Active, topic Order updated, delivery URL from the Doctor, any long random string as the secret, API version WP REST API Integration v3. Paste the same secret into the Doctor. Orders count when they are placed (cash on delivery and bank transfers too) or when paid, as you choose under What CamClo sends.
- 5
Optional, for Safari: the cookie keeper
Safari forgets cookies a page sets after 7 days (a day after an ad click). Paste the Cookie keeper PHP from the Doctor the same way as the purchase tag: your own server then sets those cookies again and Safari keeps them for a year, so a shopper who comes back weeks later is still matched to the ad. On Shopify nothing is needed: CamClo remembers the click against Shopify's own visitor id.
- 6
Make CamClo the only source
If Facebook for WooCommerce is installed, switch its Conversions API option off or remove the plugin. Otherwise Meta counts every sale twice.
- 7
Verify
Place a test order, then press Done, verify it in the Doctor.
Facebook for WooCommerce can send orders to Meta on its own. It bypasses CamClo, so you lose the first-party order count beside Meta's figures and the click attribution. If you keep it, leave CamClo's server events off.
Google Ads
The same relay serves Google. Your store reports each paid order to CamClo (the tags, the Shopify pixel and webhook, the WooCommerce webhook, or your backend) and CamClo sends it to Google matched to the ad click that brought the buyer, with contact details hashed and each order counted once. Refunds go back as adjustments. A store already relaying to Meta in the same workspace can feed Google from the same tags. It lives in Ad Studio, Settings, your Google account, Tracking Doctor, Server-side step.
- 1
Turn on auto-tagging
Google adds a click id (gclid) to every ad click only when auto-tagging is on. The Doctor shows the account's setting and turns it on with one click. Without it no server-side sale can be matched to the ad that caused it.
- 2
Have one enabled conversion action
Sales are sent to your primary conversion action. Create one in the Doctor's Create step if the account has none; the relay will not turn on without somewhere to send.
- 3
Answer the consent question
Google needs to know whether it may use the data for ads. Pick My site collects consent where the law requires it when your site does; Send click ids only when it collects none; Decide per order to send only orders that carry a consent flag and withhold the rest.
- 4
Install the same way as for Meta
Shopify: paste the CamClo pixel and create the Order payment and Order creation webhooks (plus Refund create and Order cancellation, same URL). WooCommerce: paste the two tags and create the Order updated webhook. Custom site: the base tag on every page and the purchase tag on the confirmation page, or your backend posts each order with the gclid the buyer landed with. The base tag keeps the click id for 90 days so a purchase days later still carries it.
- 5
Watch the ledger
Sales sent to Google lists every order with its status: confirmed by Google, awaiting Google, withheld for missing consent, or failed with the reason. Confirmed sales appear in Google Ads within a few hours.
Each ad link carries utm_source, utm_medium, utm_campaign, utm_content, utm_term and CamClo's own campaign, ad group and ad ids, so analytics and the relay both know which ad brought the buyer. Campaigns are published to reach people in the places you picked, not people elsewhere who merely show interest in them, unless the plan says your buyers really are elsewhere (travel, relocation, gifting into a place).
What we send and what we keep
Sent to Meta: email, phone, first name, last name, city, state, zip and country, each hashed. The browser id and click id, the buyer's ip and browser, the order value, currency and product ids.
Hashed on the way: the tags hash email and phone in the browser when they can, so contact details never leave your site in clear text.
Kept by CamClo: event name, order id, value, currency, time and which fields were present. Refunds are recorded for your net revenue and never sent to Meta.
Attribution: every ad link carries the campaign, ad set and ad ids. The tags remember them for 28 days, so the campaign page can show your store's own orders by click beside Meta's attributed count.
Troubleshooting
Check the pixel shows Connected in Customer events and that server events are on. Open your store in a normal window; consent banners and ad blockers can hold it back on a quiet day.
Read the reason on the row. A Purchase without value and currency is refused. A wrong signing secret makes every Shopify delivery fail: paste it again from the bottom of the Webhooks page.
Another source is sending the same order. Turn off Shopify's Share data or the other pixel app, or give both events the same id.
Update the store address in the Doctor. Only pages on that address may report through the tags.
Every URL and tag you installed changes. Paste the new pixel and update the webhook URL.