Skip to main content

Revenue Attribution

Joryio ties ecommerce orders back to the campaigns and journeys that drove them, so you can see the revenue each one generated. Revenue attribution is a special case of conversion attribution: revenue is simply the value of the purchases a message is credited with.

Attribution models​

An attribution model decides which touch gets credit when a customer engaged more than once before buying:

ModelWho gets credit
Last touch (default)The most recent engagement before the order. A click always beats an open.
Last clickOnly a click can earn credit; opens never count.
First touchThe earliest engagement in the window.

Revenue and conversions on a campaign/journey page are computed under the same model, so they reconcile - the revenue is the value of the conversions the model credits.

Where the model is set​

  • Workspace default - Settings → Revenue attribution: the default model and whether opens count (opens are weaker and noisier than clicks; on by default).
  • Per campaign / journey - each can override the model (and the window) in its Conversion Settings. So an app-install campaign and an order campaign can attribute differently.
  • Compare models - E-Commerce → Overview → Compare models shows net revenue by source under each model side by side, so you can see how the picture shifts, without changing anything.

Changing a setting applies to new orders immediately and re-credits existing orders in the background (or use Recompute now).

Click-through vs assisted​

Every attributed order is earned in one of these ways:

HowMeaningConfidence
Click-through (Direct)The shopper clicked a tracked link in your message and bought (deterministic - the order carries Joryio's id).Strong
Assisted clickThe shopper clicked a message within the window before buying.Strong
Opened onlyThe shopper opened but did not click (counts only when count opens is on; shown in amber).Weak

Click-through only: some teams trust only the deterministic click-and-buy, excluding the windowed/assisted effect. That view is available as the Attribution → Click-through only filter on the Orders page, a toggle on the Overview attribution card, and the Direct figure on a campaign's analytics.

Why assisted (window) catches more than click-through​

Window attribution keys on the person (their identity), not a cookie or device - real orders carry the customer's email - so a purchase is credited even when they bought without clicking, came back a day later, or clicked on one device and bought on another. Click-through is stricter: click, browse and buy all in one session with the link intact.

The attribution window​

A touch only earns credit if it happened within the conversion window before the order. This comes from the campaign/journey's Conversion Settings; unset defaults to 7 days (168 hours). The same window drives conversion counts, so revenue and conversions share it.

Each campaign and journey is judged by its own window, everywhere. A journey set to 30 days keeps a touch that is three weeks old; a campaign set to 3 days does not - and the order row and the campaign's own analytics page now agree about it. (Before August 2026 the per-order credit always used the 7-day default, so a journey with a longer window could count a conversion on its own page that the order did not show.)

Refunds​

Every figure is net of refunds. Refund amounts sync from Shopify and WooCommerce (and a custom integration can send totalRefunded on the Orders API). A partial refund reduces the order's net revenue; a fully-refunded order contributes nothing to its campaign's credit.

Incremental revenue (uplift)​

When a campaign has a control group (a held-back variant that receives no message), the analytics view also shows Incremental revenue - the revenue the campaign actually caused, measured against the control:

Incremental revenue = (treated revenue-per-recipient − control revenue-per-recipient) × treated recipients

This is the causal number - it strips out purchases the shopper would have made anyway, and can be negative (a genuine finding). See A/B testing for configuring a control group.

The money is the headline, the percentage is context. A percentage on its own cannot be acted on: +200% across 40 recipients might be €300, while −3% across 100,000 might be −€40,000. The first reads like a win and the second like a rounding error, and only one of them is worth your afternoon.

"Not enough data yet"​

Uplift is only shown once there is enough evidence to stand behind it. Until then you see "Not enough data yet" and the underlying per-recipient amounts, but no lift figure.

This is not caution for its own sake. With a small control group the number is decided by a handful of individual purchases: on a 10-person control where one person bought, a single different shopping decision moves the result from +50% to −50%. A figure like that is reporting one customer's Tuesday, not your campaign.

Joryio tests the conversion rate - "did more people buy?" - because that is a proportion and can be tested properly. Revenue per recipient is far noisier (most recipients spend nothing and one order can be fifty times the median), so it is reported beside the verdict as context rather than as proof. Both groups need a minimum number of conversions - not recipients - before a result is reported, because a 20,000-person control that produced two buyers carries about as much information as a two-person one.

You will see one of two messages when there is no figure:

  • Not enough data yet - keep going, the answer may still arrive.
  • No difference detected - the test ran and the difference did not hold up. More time will not change this one.

Those are different advice, which is why they are worded differently.

Where you see it​

  • Orders - per-order attribution (which campaign/journey, how, and when), with the click-through filter. See the Orders guide.
  • E-Commerce Overview - the "Where revenue came from" card (campaigns / journeys / unattributed), Compare models, and the click-through toggle.
  • Analytics -> What worked - every campaign with a control group, ranked by the extra conversions it caused. Campaigns still gathering evidence are listed separately rather than at the bottom of the ranking. The figures deliberately do not add up to a workspace total: each campaign is measured against a control group that still received everything else you sent, so the effects overlap and summing them counts the same sale twice.
  • Campaigns - a Revenue section on the campaign analytics page: the model-aware attributed revenue (reconciling with conversions), orders, revenue per recipient, the Direct/Window breakdown, and (with a control group) uplift.
  • Journeys - a revenue pill in the journey analytics summary row, labeled with the model.

For the click-through path to fire, the links you send carry Joryio's identifiers so the resulting order can be traced back. Joryio appends them to every tracked link:

  • jr_cid / jr_jid - opaque, encrypted tokens that resolve to the campaign / journey on order sync. The real internal id is never exposed, and the tokens are tamper-proof (AES-256-GCM) so a forged value can't misattribute an order.
  • Standard utm_source / utm_medium / utm_campaign (and optional utm_content / utm_term) for your own analytics tools.

Control these under Settings → General → Link tagging (a workspace default), with an optional per-campaign override. Templates support the variables channel, campaign.name and campaign.id. Turning tagging off disables click-through attribution.

note

Click-through attribution requires the storefront to record the landing URL on the order (Shopify's landing_site; WooCommerce's Order Attribution; on Magento the Joryio Connect extension captures it). Assisted (window) attribution only needs the purchase to be identified (which real orders are, via email) and to fall inside the window - so it works even where the landing URL isn't captured.

Multi-currency​

When a campaign's orders span more than one currency, totals are shown with a ≈ and marked approximate - Joryio does not silently convert currencies. Per-currency figures are exact; a single combined figure is a rough proxy until base-currency normalization is enabled.