How to Measure ROAS Lift from Server-side Events
Step-by-step POC playbook to quantify server-side events ROAS lift: set iROAS as the KPI, run a device-based holdout, instrument Meta CAPI, TikTok Events API, and Google EC, and monitor daily.
You can’t manage what you don’t measure. If you’re sending server-side events to platforms like Meta, TikTok, and Google Ads, the right question isn’t “What uplift should I expect?”—it’s “How do I run a controlled test to quantify the lift for my brand?” This playbook walks through a device-based holdout (iOS vs Android/Desktop), defines a single success KPI, and gives you practical steps, payload examples, and daily monitoring so you can report an auditable result.
Key takeaways
Your single success metric is incremental ROAS (iROAS) measured with a controlled holdout.
Scope: Meta CAPI (Purchase, AddToCart), TikTok Events API (Purchase), Google Ads Enhanced Conversions.
Plan for statistics upfront: 95% confidence, 80% power, and a 10–20% minimum detectable effect (MDE).
Daily monitoring is non-negotiable: deliveries, match rate/EMQ, dedup %, purchases, spend, revenue by device.
Don’t claim generic uplift. Run the POC and publish the confidence interval for your own iROAS.
What you’ll measure: the KPI and the math
The KPI for “server-side events ROAS lift” is incremental ROAS (iROAS).
iROAS = Incremental Revenue ÷ Ad Spend
Incremental Revenue = (Treatment Revenue − Control Revenue), scaled if group sizes differ.
Report iROAS with a confidence interval. A simple approach is to compute per-device daily revenue and spend, estimate the treatment–control difference, then derive a CI using standard errors over the test window. When pre-periods are available, a difference-in-differences (DiD) model can strengthen inference by comparing changes in treatment vs control over time. See method overviews from Statsig: difference-in-differences causal inference and a practical calculator from Amplitude: sample size calculator.
Tip: If your conversion lag is long, use weekly aggregates to reduce noise and reflect revenue recognition more accurately.
Scope and prerequisites for the POC
We’ll instrument and test these channels:
Meta Conversions API: Purchase and AddToCart events. Deduplicate with the Pixel via matching
event_idand aligned timestamps. Include fbp/fbc and hashed identifiers to improve match quality. Consult Meta’s official docs.TikTok Events API: Purchase event via server-to-server. Use the same
event_idas the Pixel event to dedup.Google Ads Enhanced Conversions: Collect first-party user-provided data (UPD), normalize, hash with SHA-256, and attach to conversion events.
Consent and privacy
Use Shopify Customer Privacy APIs to honor visitors’ consent. Check current flags and load tracking conditionally.
Step 1 — Design your device-based holdout (iOS vs Android/Desktop) for server-side events ROAS lift
We’ll treat iOS as the “server-side treatment” cohort and Android/Desktop as the holdout (or vice versa, depending on your operational reality). Define the test plan:
Confidence level: 95% (90% acceptable for faster reads).
Power: 80%.
Minimum Detectable Effect (MDE): start with 10–20% relative lift.
Duration: plan for 4–8 weeks to absorb seasonality and conversion lag. If funnels are short, 14+ days is the minimum viable.
Sample size: estimate using Amplitude’s sample size calculator and adjust for expected variance.
Guard against bias and leakage
Balance cohorts: monitor sample composition (new vs returning, device mix, traffic sources) so treatment and control stay comparable.
Cross-device leakage: shoppers often switch devices; document policies to minimize spillovers (e.g., limit cross-device retargeting during the test or run placebo checks).
Parallel trends: compare pre-period curves; if trends diverge, consider DiD or stratify by traffic type.
A tiny planning table for event_id design and deduplication
Element | Recommendation |
|---|---|
event_id | Deterministic hash of order_id + timestamp or a UUID shared across Pixel and server |
event_time | Use UTC; keep server and browser timestamps closely aligned |
user_data | Hash email/phone (SHA-256), include external_id, client IP, user agent, fbp/fbc where available |
consent | Respect user choice; suppress events when marketing consent is not granted |
Step 2 — Instrument server-side events and dedup correctly
Meta Conversions API — Purchase (cURL example)
curl -X POST \
"https://graph.facebook.com/v18.0/<PIXEL_ID>/events" \
-H "Content-Type: application/json" \
-d '{
"data": [{
"event_name": "Purchase",
"event_time": 1736899200,
"event_id": "order-12345-1736899200",
"action_source": "website",
"user_data": {
"em": "<sha256_lowercase_trimmed_email>",
"ph": "<sha256_e164_phone>",
"client_ip_address": "203.0.113.42",
"client_user_agent": "Mozilla/5.0",
"fbp": "fb.1.1736899200.1234567890",
"fbc": "fb.1.1736899200.AbCdEfGhIj"
},
"custom_data": {
"currency": "USD",
"value": 129.00,
"content_ids": ["SKU-987"],
"content_type": "product"
}
}],
"test_event_code": "TEST123"
}'
Notes
Dedup requires
event_nameandevent_idto match between browser Pixel and CAPI, with tightly aligned times.Improve match rate (EMQ) with hashed identifiers and fbp/fbc as described in Meta documentation.
TikTok Events API — Purchase (JSON skeleton)
{
"event": "Purchase",
"event_id": "order-12345-1736899200",
"timestamp": "2026-01-15T00:00:00Z",
"properties": {
"currency": "USD",
"value": 129.00,
"content_ids": ["SKU-987"],
"content_type": "product",
"quantity": 1,
"description": "DTC hoodie"
},
"user": {
"em": "<sha256_lowercase_trimmed_email>",
"ph": "<sha256_e164_phone>"
}
}
Notes
Dedup with Pixel by sharing the same
event_id.
Google Ads — Enhanced Conversions (UPD basics)
Normalize and hash (SHA-256) user-provided data: lowercase/trim emails; E.164 phone format; name/address standardized.
Attach UPD to your conversion tag or forward via GTM server-side.
GTM server-side: provisioning and send
Set up a GTM server container, provision a custom domain, and forward events from web/app to the server container for stable server-to-platform delivery.
Step 3 — Verify and smoke test
Before you flip the switch across all traffic, run controlled tests:
Meta: In Events Manager, use Test Events to confirm receipt, parameter completeness, and dedup status.
TikTok: Use Events Manager/Test Events; validate dedup via shared
event_idand check event attribution dashboards.Google Ads EC: Verify hashed UPD in Tag Assistant and check EC diagnostics under Goals.
Consent: Confirm Shopify Customer Privacy flags are respected across all payloads.
Step 4 — Daily monitoring and guardrails
What to track daily during the POC:
Deliveries: server vs pixel events by device; investigate >10% day-over-day drops.
Match rate / EMQ (Meta): watch parameter completeness and EMQ scores.
Dedup %: fraction of Pixel+Server events merged via
event_id.Purchases and revenue by device cohort; include conversion lag awareness.
Platform-reported conversions and spend by device cohort.
Experiment telemetry: variance, interim power, and sample-size progress.
Alerting rules
Flag if EMQ or dedup % shifts materially (e.g., −10pp day-over-day).
Flag if Purchase deliveries fall >10% vs 7-day average.
Pause or extend if mid-test significance is met or unattainable given current variance.
Example POC dashboard (illustrative)
Disclosure: Attribuly is our product.

This kind of dashboard summarizes event health (deliveries, EMQ, dedup %) alongside experiment outcomes (purchases, spend, revenue, iROAS with CIs) for iOS vs Android/Desktop. Whether you build it in Looker/Data Studio or use a hosted solution, the goal is the same: daily visibility and actionable guardrails.
Step 5 — Analyze outcomes and decide
Compute lift and iROAS
Aggregate revenue and spend per device per day.
Compute treatment minus control for revenue; divide by treatment ad spend to get iROAS.
Estimate a confidence interval using the standard error of the treatment–control difference. If pre-period data is available, fit a DiD model to improve robustness.
Decision matrix
Significant positive iROAS (CI excludes 0): roll out server-side events wider and update bid strategies.
Inconclusive: extend duration or reduce MDE expectation; improve match rate and dedup.
Negative lift: audit consent handling, event_id parity, timestamp alignment, and platform diagnostics before pivoting.
Optional robustness checks
Placebo tests on unaffected events or cohorts.
Sensitivity to aggregation windows (daily vs weekly).
Parallel trend validation and DiD.
Troubleshooting essentials (quick reference)
Low match rate (Meta EMQ): Enrich
user_datawith hashed email/phone, external_id, fbp/fbc; confirm consent.Dedup failures: Ensure identical
event_idand aligned timestamps across Pixel and server; verify event_name parity.Timestamp/timezone skew: Use UTC and NTP-synced clocks.
Consent not passed: Implement Shopify Customer Privacy checks and conditional firing.
Enhanced Conversions mismatch: Normalize and SHA-256 hash UPD; validate in Tag Assistant and Google Ads diagnostics.
For additional context on dual-run validation and server vs browser capture, see Attribuly’s perspective on validating multi-touch attribution in 30 days and Shopify attribution trade-offs vs Segment+GA4.
Next steps
Finalize your test plan: confidence, power, MDE, sample size, duration.
Instrument and verify server-side events, then launch the device holdout.
Monitor daily, enforce guardrails, and report iROAS with confidence intervals.
If you prefer a hosted dashboard and implementation support for Meta CAPI, TikTok Events API, and Google EC, you can use Attribuly to streamline the POC setup.