All examples
snowflake

Marketing Attribution Lineage

First-touch attribution joining sessions, conversions, and campaigns. The lineage shows which session columns become which attribution columns.

The lineage

sessionsconversionscampaignsranked (CTE)v_first_touch
sessions + conversions + campaigns join into v_first_touch.

The SQL

CREATE TABLE sessions (
  session_id STRING,
  user_id STRING,
  campaign_id STRING,
  started_at TIMESTAMP
);

CREATE TABLE conversions (
  conversion_id STRING,
  user_id STRING,
  amount NUMBER(12,2),
  converted_at TIMESTAMP
);

CREATE TABLE campaigns (
  campaign_id STRING,
  channel STRING,
  campaign_name STRING
);

CREATE OR REPLACE VIEW v_first_touch AS
WITH ranked AS (
  SELECT
    s.user_id,
    s.session_id,
    s.campaign_id,
    s.started_at,
    ROW_NUMBER() OVER (PARTITION BY s.user_id ORDER BY s.started_at) AS rn
  FROM sessions s
)
SELECT
  c.conversion_id,
  c.user_id,
  c.amount AS conversion_amount,
  cm.channel AS first_touch_channel,
  cm.campaign_name AS first_touch_campaign
FROM conversions c
JOIN ranked r ON r.user_id = c.user_id AND r.rn = 1
JOIN campaigns cm ON cm.campaign_id = r.campaign_id;

What the lineage shows

  • first_touch_channel traces back through ranked → sessions → campaigns.
  • conversion_amount is a clean pass-through from conversions.amount.
  • Window functions are tracked as part of the lineage of the projected columns.