Server events
A browser tag can be stopped by an ad blocker, a closed tab or a slow page. A server event leaves from your WordPress site, straight to the platform’s API. Pixel Tracking sends the same event both ways with the same event ID, and the platform keeps one.
Which platforms
Section titled “Which platforms”| Platform | API | Plugin |
|---|---|---|
| Meta | Conversions API | Free |
| OpenAI Ads | Conversions API | Free |
| TikTok | Events API | Pro |
| GA4 | Measurement Protocol | Pro |
| Conversions API | Pro | |
| Snapchat | Conversions API | Pro |
| Conversions API | Pro |
Google Ads has Enhanced conversions instead: hashed customer data that goes with the browser conversion. Microsoft Ads, LinkedIn, Clarity, Tag Manager and Umami are browser only.
Set up Meta Conversions API
Section titled “Set up Meta Conversions API”-
Make sure the Meta pixel works in the browser first.
-
On the Dashboard, open the Meta row and click Open platform card.
-
In the Server side panel, turn on Conversions API and paste the Access token generated for this Pixel ID.
-
While testing, put the code from the Test events tab of Meta Events Manager in Test event code (Connection panel). Watch the events arrive there.
-
Click Save changes, then Run the check on the Dashboard. The Meta CAPI funnel row should say on.
-
Clear Test event code before going live.
With the Conversions API on, Meta gets the purchase from the server queue, and PageView, ViewContent, AddToCart, InitiateCheckout and custom events through a first-party endpoint on your own site, with the same event ID as the browser. Which of those go to the server is set per event in the Transport panel on the Events tab.
The access token stays on the server. It never appears in the page, the log or the server events screen. A saved token shows as Secret saved. Leave empty to keep it. To remove it, tick Delete the saved secret and save.
What the purchase carries
Section titled “What the purchase carries”The server purchase for Meta includes, hashed with SHA-256: email, phone, first and last name, city, state, postcode, country and an external ID (the customer’s user ID, or their email for guests). It also sends the customer’s IP address and browser user agent from the order, and the _fbp and _fbc browser IDs when the visitor had them. Phone numbers are normalised to the international format, using the billing country when the number was typed without a country code.
Personal identifiers are sent only while Advanced matching is on (Consent tab, Server-side panel). It is on by default.
Set up the OpenAI Conversions API
Section titled “Set up the OpenAI Conversions API”On the OpenAI Ads card, turn on Conversions API and paste the API key. Leave Validate only on for a first test: OpenAI checks the payload and stores nothing. Turn it off before going live.
Send the purchase on order status (on by default) sends the purchase from the server when the order reaches a paid status, and the browser skips it.
When the purchase is sent
Section titled “When the purchase is sent”The server purchase is queued when the order reaches one of the Statuses that count as a purchase on the WooCommerce tab: on payment, on the thank-you page, or on a later status change. One row is created per destination. A second trigger for the same order never queues it twice.
If Hold the purchase for unpaid orders until they are completed is on, a cash on delivery, cheque or bank transfer order waits until it is completed or marked paid.
Before a row is sent, the order status is checked again. A row for an order that is no longer in an allowed status is skipped.
The queue
Section titled “The queue”Server events go through a queue, so checkout never waits for a platform to answer. The Server tab shows the queue and its settings.
Delivery and retention panel:
- Deliver in the background: on by default. Delivery runs through Action Scheduler, or WP-Cron when Action Scheduler is not there. Off means events are sent during the visitor’s request instead.
- Maximum attempts: 1 to 5, default 3. A failing delivery is retried with a growing delay, from one minute up to twelve hours.
- Keep sent rows (days): default 7.
- Keep failed rows (days): default 30.
- Highest value a custom event may carry: custom events send the value from their definition, never one the browser reports. This caps it. 0 means no cap.
- Meta, first-party requests per minute per visitor: 10 to 300, default 60. It protects the public endpoint the browser posts funnel events to.
The server events list
Section titled “The server events list”The Server events panel on the Server tab lists the latest rows, with counters for Waiting, Sent, Failed, Skipped and No consent.
Each row shows When, Event, Destination, Order, Source, Status and Detail. Detail holds the platform’s answer, the HTTP code and the attempt number. Any row that was not sent has a Retry button.
The Source column says where the order came from: Google Ads, Meta Ads, organic or direct. It is read from the ad click ID first, then the stored source and medium, then WooCommerce’s own order attribution.
Filter the list by Event, Destination and Status, or tick Only orders that came from an ad, then click Show. Clear the filters resets them.
Tokens never reach this screen. When a platform echoes the request back in its error message, the token is removed before the row is saved.
Deduplication
Section titled “Deduplication”Each event gets one event ID, and the browser and the server send the same one.
- The purchase event ID is derived from the order, so it is the same in the browser and on the server, and stays the same if the thank-you page is reloaded. Once computed it is stored on the order.
- Funnel events share their ID between the browser tag and the first-party endpoint.
- Send once per platform (WooCommerce tab): after the browser sends the purchase, it tells your site which platforms it reached, and the order records them. On a reload of the thank-you page, those platforms get nothing again.
- Each platform also keeps its own server state, so a sent row cannot be sent twice from the Retry button.
GA4 cannot deduplicate. With Pro, its purchase takes one road only: Purchase transport on the GA4 card is either Browser gtag or Server, Measurement Protocol.
Reddit deduplicates on a conversion ID rather than an event ID; Pro sends it in the form Reddit expects.
Consent on the server
Section titled “Consent on the server”A server event leaves after the visitor has gone, so it cannot read their cookie. Apply the consent stored on the order (Consent tab, Server-side panel, on by default) records the visitor’s decision at checkout and applies it when the event is sent. Rows refused this way show as No consent. See Consent.
Privacy tools
Section titled “Privacy tools”The plugin registers with WordPress’s Export Personal Data and Erase Personal Data tools, so a data request also covers what Pixel Tracking keeps on orders.