Testing & troubleshooting
Test your destinations
On Websites → your site, under the destinations, Test all destinations sends one synthetic test purchase to every configured destination and shows what each platform answered: a verdict per platform, side by side. Save your changes first; you can run it again after a few seconds.
| Verdict | Meaning |
|---|---|
| ✅ | the platform accepted the event (for GA4: the payload is valid, see below) |
| ⏭️ | skipped, with the reason; often expected (no click ID on a PageView, no consent) |
| ❌ | rejected: the platform's own error message is shown |
The test never shows up in your SetRoasFlow numbers: not on the Delivery page, not in your usage, not in your customer profiles. What happens on the platform's side depends on the platform, and not every platform has a test mode:
| Destination | What the test does there |
|---|---|
| Google Ads | validate-only: checked, never recorded |
| sent in test mode: not counted | |
| GA4 | sent to Google's validation endpoint: checks the event's structure, not your Measurement ID or API secret |
| Meta, TikTok, Snapchat, Pinterest | with a Test event code saved on the destination, it lands in the platform's test events view. Without one, it is a real event and counts in your reporting. |
| Klaviyo | no test mode: creates a test profile and event |
| HubSpot | no test mode: creates or updates a real contact |
| Mixpanel | no test mode: the event is recorded |
LinkedIn, X, Mailchimp and ActiveCampaign receive audiences, not events, so they are not part of this test.
Before testing Meta, TikTok, Snapchat or Pinterest, add a Test event code (you find it in the platform's test events tool), then remove it when you are done: while it is set, your real events go to the test view too. After testing Klaviyo or HubSpot, you can delete the contact [email protected].
A ✅ on GA4 means the event is well formed, not that it reached your property. To confirm GA4 end to end, open your site and check the visit in GA4's Realtime report.
Testing on a real page
Add ?srf_test=1 to any URL on your site to switch the snippet to test mode on that page. Events go through the same per-platform behaviour as the table above, and stay out of your Delivery page, usage and profiles. The dashboard doesn't show test-mode events yet: check them in each platform's test events view.
To see an event on the Delivery page, send a real one. Trigger a genuine, non-test event from your site: a normal page view or purchase. Test events never appear there, so an empty Delivery page right after testing is expected, not a fault.
Reading the Delivery page
One row per event. Each row stacks the per-platform outcome for every destination together, so a single purchase sent to four platforms is one row showing four results, each either delivered, or failed with the exact error the platform returned.
When a delivery fails, the row shows an Explain button. It takes the platform's raw error (often a bare code or a cryptic string) and turns it into plain language: what actually went wrong, and what to change to fix it. See AI helpers.
Last 24 hours shows the delivery rate per destination. A destination sitting below 100% is worth opening.
Match quality (0–10) measures how well your events can be matched to real people. Email is the strongest signal by far, then phone, then a stable customer ID. A score of 2–3 means you're sending conversions the platform mostly can't attribute; the fix is to pass user_data (see Install the tracking), not to send more events.
Common problems
Nothing on the Delivery page
- Is the snippet live? Open your site (or the demo store) and check a PageView appears in Overview within a few seconds. The Installation page has the snippet and a copy button.
- Is at least one destination connected and active?
- Are you looking at test events? Events sent with
?srf_test=1or Test all destinations never appear on the Delivery page. - Has the site reached its monthly event limit? Check Plan & usage: past the limit, events are still counted but no longer forwarded.
- Smart tracking toggles (on your site's page, under Websites): is the event family switched off for this site?
Events arrive, the platform shows nothing
Almost always a Test event code left in place (Meta, TikTok, Snapchat, Pinterest). With one set, events go to the platform's test view and never reach reporting. Clear it on the destination.
Purchases counted twice
The event is fired both automatically and manually, without an order_id. Add order_id to your manual call. It's the deduplication key.
A platform returns 401 or 403
Token expired, revoked, or missing a scope. Regenerate it on the platform and re-save. Meta tokens generated for the Conversions API don't always carry ads_management, which audiences need.
A destination is Active but audiences say "Missing …"
Expected. Events and audiences use different APIs at the same provider, and audiences need one extra field. The message names it. See Segments & audience activation.
Fewer conversions than my platform's own pixel
Compare like with like: events from visitors who haven't given consent are not sent at all, while the platform's own pixel may still count some of them.
If you also run the platform's own pixel on the site, the two only count once when both send the same event_id. SetRoasFlow doesn't link them for you: pass your own event_id to both calls, or read the one SetRoasFlow used from window._srf_last_event_ids (for example window._srf_last_event_ids.Purchase).
Let us watch it for you
You should not have to remember to check. Alerts compares each hour with the same hour on the previous days, and tells you when something is genuinely off: events collapsing, or a platform suddenly rejecting deliveries. A quiet night doesn't trigger anything, because a quiet night is normal for your store.
Add a Slack webhook under Alerts and it reaches you where you actually look.
Getting help
Include your Project ID, the platform, and roughly when it happened: with those we can find the exact delivery. [email protected]