Skip to main content

Revenue Attribution

Revenue attribution ties dollars to the campaigns and journeys that earned them. This page states the exact semantics — what counts, in which currency, how refunds affect it, and over what window — so every number in a report is defensible.

Measured vs. modeled

The two halves of "attributed revenue" have different epistemic weight, and Hober keeps them separate:

  • The revenue is measured. Amounts come from your own order data — the value property on a conversion event (for Shopify, the order's total_price). Hober never estimates or extrapolates an amount.
  • The attribution is modeled. Which message gets the credit is decided by a stated model: last-touch over a configurable window (default 7 days), where an engagement (open or click) beats a mere delivery, and touches after the conversion are never credited. One conversion earns exactly one credit.

When a Hober surface shows revenue, the amount is a fact and the assignment is a model. Both halves are inspectable: the conversion configuration is editable in Insights → Conversion events, and the credited source appears on every rollup.

What counts as revenue

A conversion event counts revenue when its definition names a value property (the event property carrying the amount, in major units — 19.99) and, optionally, a currency property (an ISO 4217 code like USD). Amounts without a recognizable currency are recorded and reported in a separate "uncurrencied" bucket rather than guessed.

For Shopify, the Track Shopify revenue preset configures this in one click: order_placed with total_price and currency, plus its refund counterpart (below). Attribution is forward-only from connector activation — historical orders are not backfilled, because pre-existing orders cannot be honestly attributed to messages that never targeted them.

Configure one money event per funnel. If two definitions that can fire for the same purchase (say, a checkout event and an order event) both carry a value property, that purchase's revenue counts once per event — the dashboard warns when this is set up.

Refunds

Refunds make revenue net down, with two rules that keep reports stable:

  • A refund is recorded when it happens, as a negative amount dated at the refund, and credited to the same campaign or journey as the original order (matched by order id). A July order refunded in August reduces August's net — July's report never changes after the fact.
  • Reports show gross, refunded, and net per currency, so the netting is visible rather than silent. Refunds adjust revenue but are never counted as conversions.

There is no time limit on netting: a refund reduces its campaign's lifetime net whenever it arrives. (Operationally, the order-id match looks back 180 days; older refunds are recorded and flagged rather than matched.)

For Shopify, refunds/create drives netting (partial refunds net exactly what was returned). A cancelled order nets only when it was voided — never charged — because a cancelled paid order refunds through refunds/create, and counting both would double the netting.

Currencies

Revenue is reported per currency, never summed across currencies. A tenant selling in USD and PEN sees two totals, each netted independently. Amounts recorded before currency capture existed appear in the "uncurrencied (legacy)" bucket.

Alongside the per-currency truth, surfaces may show one normalized figure: the per-currency nets converted into your reporting currency (Settings → Display preferences; defaults to your billing currency) at current exchange rates, marked with ≈. It is an approximation by definition — re-opening a report on another day may move the normalized figure slightly as rates move, while the per-currency amounts never change. The legacy bucket cannot be converted and is excluded from the normalized total. Ranking of top campaigns and journeys uses the same conversion, so a big earner in a small currency no longer outranks a bigger earner at face value.

Where it appears

  • Insights funnels — attributed revenue per campaign or journey.
  • Campaign reports — campaign totals and, for multi-message campaigns, revenue per message.
  • Holdout lift — revenue per treated and holdout group plus the size-normalized revenue lift: net per 1,000 recipients per arm and an estimated incremental revenue (a model, labeled as such — see Holdout Groups & Lift).
  • Client reports — top campaigns and journeys by revenue in the shared white-label report.

API

Revenue fields appear as arrays of per-currency slices:

"revenue": [
{ "currency": "USD", "gross_cents": 10000, "refunded_cents": 4000, "net_cents": 6000 }
]

See the Insights API reference for the full response shapes.