Skip to main content

Attribution models

ga4_attribution_models apportions each closing conversion's revenue and conversion count across the traffic touches of its journey, once per model. The table is one row per touch_date × conversion_date × model × channel dimensions, and it is additive - sum attributed_revenue / attributed_conversions at any grain.

Models are configured under attribution_models in the config. The table only builds once journey.closing_conversions is set.

Model types

typeCredit ruleParameters
first_touch100% to the first traffic touch-
last_touch100% to the last traffic touch-
linearSplit evenly across all traffic touches-
position_basedfirst_weight to first, last_weight to last, the rest split across the middlefirst_weight, last_weight (default 0.4 / 0.4)
time_decayMore credit to touches closer to the conversion (exponential)half_life_days (default 7)
participationFull credit to every touch-

Notes:

  • position_based with only two touches (no middle) renormalizes to 50/50 between first and last.
  • You can configure the same type more than once with different parameters and distinct names (e.g. two position_based variants); they appear side by side in model_name.

Fractional credit vs influence

The first five models are fractional: the credit for a single conversion sums to exactly 1.0 across its touches. So SUM(attributed_revenue) for any fractional model reconciles to total closing revenue - it is true attribution, safe to compare across channels.

participation is different on purpose. It gives every touch full credit, so a journey with 4 touches contributes 4× its revenue. It does not reconcile and it overcounts - it answers "which channels were involved?", not "who gets the credit?". Treat it as an influence metric.

Don't sum participation against fractional models

participation overcounts by design. Compare it only to itself (or to the assist/influence reports), never alongside first_touch / linear / etc. in a "total credit" view.

The same influence-vs-credit distinction applies to two reports:

  • ga4_attribution_channel_assist_report - participated_revenue / assisted_revenue double-count across the channels of a journey (influence), unlike the fractional attributed_revenue in the models table.
  • ga4_attribution_micro_conversion_report - closing_revenue_with is the journey's final outcome, so summing it across micro-conversions double-counts a journey.

Additivity

Every report in this module follows one rule: store additive building blocks, derive rates in BI.

  • Counts (journeys, closed_journeys, closing_conversion_count, ...) and SUM numerators (sum_days_to_conversion, total_revenue, sum_traffic_touches, ...) are stored.
  • Rates and averages are not stored, because they do not roll up - an average of averages is wrong. Compute them in your BI tool from the stored parts, e.g.:
    • conversion rate = closed_journeys / journeys
    • avg days to conversion = sum_days_to_conversion / closed_journeys
    • avg revenue per closing conversion = total_revenue / closing_conversion_count

Because only additive parts are stored, these derived metrics stay correct at any aggregation level - by day, channel, path length, or all-up. See each table's columns in Output tables.