No attribution source captured on order_completed
You spend on paid acquisition but can’t tie orders back to the campaigns that drove them, which makes ROAS a guess, not a measurement.
Fixing this typically lifts paid-channel ROAS visibility 2-3x and gives Meta and Google the clean conversion signal they need to optimize against.
order_completed fired 3,847 times in the last 30 days attribution_source present on 0 events (0.0%) utm_source (on signup) present on 2,104 events (54.7%) referrer (on signup) present on 1,201 events (31.2%)
attribution_source on 100% of order_completed events first_touch_source on 100% of order_completed events last_touch_source on 100% of order_completed events
Attribution exists at signup but never makes it onto the order. Every paid channel, Meta, Google, TikTok, affiliate, is flying blind on true ROAS because the conversion event has no source. You’re likely over-attributing to email and under-attributing to everything else.
Stitch attribution at order time: pull first_touch and last_touch from the customer record onto the order event. Add attribution_source as a required property on order_completed going forward. Backfill the last 30 days from your warehouse if you have the raw touches.
- 01Open the Shopify App Store and install Triple Whale (or your preferred attribution app).
- 02Connect Meta, Google, TikTok, and Klaviyo from inside Triple Whale's setup. This wires first-touch and last-touch attribution onto every order automatically.
- 03In Klaviyo, add the new "First Touch Source" customer property to your post-purchase flows so they branch on acquisition channel.
- 01Open the Shopify App Store and install Triple Whale (or your preferred attribution app).
- 02Connect Meta, Google, TikTok, and Klaviyo from inside Triple Whale's setup. This wires first-touch and last-touch attribution onto every order automatically.
- 03In Klaviyo, add the new "First Touch Source" customer property to your post-purchase flows so they branch on acquisition channel.
// At order time, attach attribution from the customer record.
const touches = await customers.getAttributionTouches(customer.id);
analytics.track('order_completed', {
order_id: order.id,
total: order.total,
is_first_order: customer.lifetime_orders === 0,
attribution_source: touches.last.source,
first_touch_source: touches.first.source,
last_touch_source: touches.last.source,
});After deploying this snippet to a staging environment, trigger the underlying action and confirm the event or field now appears in your analytics debugger (or warehouse) with the properties listed in the evidence block above. Do not merge to production until the assertion passes.