marketing

Attribution across every touch you actually have.

Ad platforms grade their own homework. Your agent joins spend, sessions, and closed revenue across systems and computes attribution the way you define it — differently per question if the question calls for it.

Why it works here

Marketing attribution, the Contextually way.

Your model, not the platform's

First-touch, last-touch, time-decay, or a custom rule for this campaign — the agent writes the attribution logic per ask instead of accepting a vendor default.

Spend to revenue, end to end

Ad spend joins to sessions joins to CRM opportunities joins to invoices. The full path lives in one program run, not four CSV exports.

Comparable on demand

Run two attribution models against the same window and return the comparison — the argument-settling table nobody had time to build.

The flow of data
bigquery.ad_spend_q2 188,204 rows snowflake.sessions_q2 4,881,203 rows postgres.opportunities 1,904 rows contextually runtime attribute · time_decay 7d read-only · audited CAC by channel 812 tokens → context
The program, case by case
goal → channel attribution for Q2 closed revenue, time-decay model
spend = sql("bigquery", "SELECT channel, cost, day FROM ad_spend_q2") touch = sql("snowflake", "SELECT anon_id, channel, ts FROM sessions_q2") won = sql("postgres", "SELECT anon_id, amount FROM opportunities WHERE stage = won") attr = attribute(touch, won, model="time_decay", halflife="7d") return blend(attr, spend, metric="cac_by_channel")
joined 4,881,203 touches to 1,904 closed deals returned CAC by channel table · 812 tokens → context
Get started

See it on your data.

Book a demo and we'll run marketing attribution against systems like yours — your stores, your policies, live — and map the path to a deployment in your VPC.