Skip to main content
3.0 Attribution

Trace every dirham
from spend to swipe

Per-branch reload + redemption attribution. Per-campaign ROAS. Net-new vs cannibalized branch tracking. Cohort migration in real time.

Attribution model

Every event carries its context bundle

Branch, till, campaign tag, cohort. Every wallet event arrives pre-attributed. Attribution joins are queries against existing data, not a separate ETL pipeline.

Olaya
Tahlia
Diriyah

Per-branch

Top-up + redemption + net stored value by branch. Branch-of-issuance vs branch-of-debit, separated.

boost_dormant_14d3.2×
cross_branch_3rd2.7×
birthday_credit4.1×

Per-campaign

Each campaign tag flows from rule fire → wallet event → till swipe. Closes the loop.

Apr 2026 cohortSAR 312 LTV
Mar 2026 cohortSAR 287 LTV
Repeat rate62%

Per-cohort

LTV, repeat rate, frequency by enrollment cohort. Real-time updates.

Composition

Sits on every event the network emits

Wallet writes context; incentives tag campaigns; customers join identity; inventory joins SKU; brain reads it all back to the operator in plain language.

branch_id till_id campaign_tag customer_id

Reads from wallet

Every wallet event carries branch, till, campaign tag. Attribution doesn't compute these. It indexes them.

Net new at Diriyah+ 184
Cannibalized from Olaya− 0
Cannibalized from Tahlia− 0

Feeds brain

Operator asks 'did Diriyah cannibalize Olaya' and brain queries attribution + cohort flow, answers in twelve seconds.

Dashboard

Per-branch attribution, latency under 200ms

Real-time dashboard for the operator who needs to call 'did Diriyah's opening cannibalize Olaya?' in twelve minutes, not after the month-end close.

Cohort flow

Net new versus shifted, separated

When a customer first appears at branch X, they belong to X's cohort. Subsequent cross-branch visits are tracked as loyalty events, not as new revenue.

cohort.first_seenDiriyah · Apr 18
cohort.cross_visitOlaya · May 02
cohort.cross_visitTahlia · May 11

First-seen tracking

Every customer's first wallet event sets their home-branch cohort. Subsequent visits are cross-branch loyalty.

Diriyah ← net new+ 184
Olaya ↔ Tahlia± 0
Network growth+ 254

Migration matrix

See the network rebalance in real time. Which branch is growing, which is consolidating, which is just rotating.

"Branch-level attribution made our newest opening call in twelve minutes. No spreadsheet. No cohort guesswork. Just the number."

Operations · GCC retail group

"For the first time we know which campaigns drive incremental revenue and which just shift it around."

CFO · GCC coffee chain

Built for the future. Available today.

Tech specs
3.1

Attribution model

Every wallet event (top-up, redemption, refund) carries a context bundle: which branch, which till, which campaign, which customer cohort. The attribution layer joins these bundles into per-branch, per-campaign, per-cohort views.

The model is honest by default. A new-branch opening that pulls customers from existing branches shows as cannibalization, not as "new revenue." The numbers tell the operator the truth.

Attribution dimensions

Property Function
Branch

Per-branch top-up + redemption + net stored value. Branch-of-issuance vs branch-of-debit.

Till

Per-till transaction count + value. Useful for operator staffing decisions.

Campaign

Per-campaign tag → wallet events → till swipes. Closes the loop.

Cohort

Per-cohort LTV, repeat rate, frequency. Cohorts defined by enrollment date, tier, segment.

Net new vs cannibalized

Customer first-seen tracking. A "new" customer is one whose first wallet event is at branch X.

Time window

Any of the above, scoped to a rolling window (1d, 7d, 30d, 90d, YTD, custom).

Tech specs
3.2

Composition

Attribution sits on top of wallet + incentives. Every wallet event passes through; every incentive rule that fires gets attributed.

It feeds inventory (per-SKU per-customer attribution), brain (operator agent reads attribution views), and customer intelligence (cohort definitions are attribution outputs).

Composition points

Property Function
Wallet → Attribution

Every wallet event passes its context bundle (branch, till, campaign tag) into the attribution layer.

Incentives → Attribution

Every rule fire is attributed. Closes the spend→swipe loop.

Inventory → Attribution

Per-SKU per-customer attribution. Which products move with which campaigns.

Brain → Attribution

Operator agent reads attribution views for "what happened" questions.

Customers → Attribution

Cohort definitions are attribution outputs. New-customer-first-seen tracking lives here.

Tech specs
3.3

Dashboard

Per-branch + per-campaign + per-cohort views, filterable by time window. Latency from event to attribution render: under 200ms. Aggregations pre-computed; per-customer detail loads on demand.

Designed for the operator who needs to call "did Diriyah's opening cannibalize Olaya?" in twelve minutes, not after the month-end close.

Dashboard surfaces

Property Function
Branch breakdown

Top-ups, redemptions, net stored value, customer count by branch.

Campaign performance

Per-campaign tag → wallet events → till swipes. ROAS per campaign.

Net-new feed

Live feed of first-seen customers per branch in the current window.

Cannibalization view

Customer migration matrix across branches. Net new vs pulled-from-existing.

Cohort progression

Frequency, repeat rate, LTV by enrollment cohort.

Custom views

Operator-configurable saved views with shareable URLs.

Tech specs
3.4

Cohort flow

When a customer first appears at branch X, they belong to branch-X's cohort. Their subsequent visits to other branches are tracked as cross-branch loyalty events.

This separates "net new revenue" from "shifted revenue". It answers whether the newest opening is GROWING the network or just MOVING customers within it.

Cohort flow events

Property Function
cohort.first_seen

Customer's very first wallet event. Sets their home-branch cohort.

cohort.cross_visit

Customer visited a branch other than their home-branch. Cross-loyalty event.

cohort.shift

Customer's most-visited branch changed. Operator can see the network rebalance.

cohort.dormant

Customer fell below activity threshold. Triggers re-engagement attribution.

cohort.churn

Customer crossed the churn definition window. Final cohort exit event.