Skip to main content

Output tables

The module produces two intermediate touchpoint tables, two core tables (journeys and models), and six reports. Journeys, models and reports materialize in your outputs dataset (superform_outputs_*); the intermediate touchpoint tables materialize in the transformations dataset (superform_transformations_*).

Intermediate touchpoints​

You normally consume the journeys table and the reports, not these. Only one is built, depending on touchpoint.mode.

TableGranularityPurpose
int_ga4_attribution_touchpoints_sessionOne row per traffic touch (one per ga4_sessions row) plus one row per matched conversion eventThe flat touchpoint stream in session mode.
int_ga4_attribution_touchpoints_source_changeOne row per intra-session source run plus one row per matched conversion eventThe flat touchpoint stream in source_change mode.

ga4_attribution_journeys​

Granularity: one row per user journey (journey_id), from first touch to its closing conversion or boundary. Traffic and conversion touches are stored as nested arrays.

ColumnDescription
journey_idUnique ID - FARM_FINGERPRINT(user_identifier || '_' || journey_number).
user_identifierIdentity key value (user_pseudo_id by default, else journey.user_identifier coalesced to user_pseudo_id).
user_identifier_typeName of the identity-key column (e.g. user_pseudo_id).
journey_number0-based sequence of this journey in the user's history.
journey_start_dateDate of the first touch (partition column).
journey_start_timestamp_utcUTC timestamp of the first touch.
journey_end_dateDate of the last touch.
journey_length_daysElapsed days, first to last touch.
days_to_conversionDays from first touch to the closing conversion; NULL for ongoing/lapsed journeys.
user_pseudo_idsDistinct user_pseudo_id values in the journey.
device_categoriesDistinct device categories across traffic touches.
default_channel_groupsDistinct default channel groups across traffic touches.
ends_in_saleTRUE if the journey has a closing conversion.
journey_length_stepsNumber of traffic (non-conversion) touches.
revenueRevenue across ALL conversion touches (closing + micro). Does not reconcile to models.attributed_revenue (closing only) - use closing_revenue for that.
closing_conversion_countClosing conversion touches (0 or 1 by construction).
micro_conversion_countNon-closing (micro) conversion touches.
closing_revenueRevenue from closing conversions only (0 when none).
micro_revenueRevenue from non-closing (micro) conversions (0 when none).
closing_conversion_dateClosing conversion date; NULL for ongoing/lapsed. Reports use this as conversion_date.
closing_conversion_nameClosing conversion name; NULL for ongoing/lapsed.
touchesArray of traffic touches, chronological (empty for a zero-touch conversion). Per-touch fields: touch_start_time, touch_id, session_id, user_pseudo_id, device_category, source, medium, campaign, default_channel_group.
conversionsArray of conversion touches (closing + non-closing), chronological. Per-conversion fields: touch_start_time, event_id, session_id, user_pseudo_id, conversion_name, revenue, is_closing.
is_ongoingTRUE if no boundary closed the journey (still accumulating).
is_finalData-freshness flag - TRUE once all touches are past the 72h late-data window.

ga4_attribution_models​

Granularity: one row per credited traffic touch × model × closing conversion, aggregated to touch_date × conversion_date × closing_conversion_name × model_name × channel dimensions. Additive - see Attribution models.

ColumnDescription
touch_dateDate of the credited traffic touch (partition column).
conversion_dateDate of the closing conversion the credit is for.
closing_conversion_nameClosing conversion name - segment by conversion type ('(no touchpoint)' on the synthetic zero-touch row).
model_nameAttribution model. participation overcounts - compare fractional models only.
source / medium / campaign / default_channel_group / device_categoryChannel dimensions of the touch ('(no touchpoint)' for a zero-touch journey).
attributed_revenueClosing revenue apportioned to this touch (additive). SUM reconciles to closing revenue per fractional model; participation overcounts.
attributed_conversionsShare of the closing conversion on this touch (fractional for standard models, 1.0 each for participation; additive).
credited_touchesCredited touch-rows at this grain (pre-aggregation, not distinct touch_ids). position_based with 2 touches (no middle) renormalizes to 50/50.

Reports​

All six reports are additive and partitioned on journey_start_date. They derive from the journeys table; store counts and SUM numerators, and compute rates/averages in BI (see Additivity).

With dimensions configured, every report also carries one column per dimension and per custom channel grouping, as part of its grain. The value is per journey - the first traffic touch's by default, or per the dimension's pick - and '(no touchpoint)' for zero-touch journeys. See Where dimensions land.

ga4_attribution_channel_chain_report​

Granularity: one row per journey_start_date × conversion_date × channel_chain × closing_conversion_name. The full ordered channel path and its outcomes.

ColumnDescription
channel_chainThe path - ordered >-delimited channels; part of the grain.
path_lengthChannels in the path (constant per channel_chain).
path_length_bucketpath_length bucketed: 1, 2, 3, 4-5, 6+.
first_channel / last_channelFirst / last channel in the path.
num_distinct_channelsDistinct channels in the path (path_length counts repeats; this does not).
journeysJourneys on this path (additive).
closed_journeys / ongoing_journeys / lapsed_journeysJourneys that closed / still open / closed without a sale.
no_touch_journeysJourneys with zero traffic touches (chain = '(no touchpoint)').
sum_traffic_touchesSUM of traffic touches (additive).
total_conversion_countSUM of all conversion touches, closing + micro (additive).
closing_conversion_count / micro_conversion_countSUM of closing / non-closing conversions.
total_revenue / micro_revenueSUM of closing-conversion / micro-conversion revenue.
sum_journey_length_daysSUM of journey length in days.
sum_days_to_conversionSUM of first-touch-to-conversion days, closed journeys.

ga4_attribution_journey_summary_report​

Granularity: one row per journey_start_date × conversion_date × path_length × closing_conversion_name. Journey metrics by path length.

ColumnDescription
path_lengthChannels in the path (the grain; raw integer - bucket in BI).
path_length_bucketConvenience bucket over path_length (1, 2, 3, 4-5, 6+); descriptor, not grain.
journeysJourneys at this path length (additive).
closed_journeys / ongoing_journeys / lapsed_journeysconversion_rate = closed_journeys / journeys.
no_touch_journeysZero-traffic-touch journeys (fall in path_length 1).
total_conversion_count / closing_conversion_count / micro_conversion_countAdditive conversion counts.
total_revenue / micro_revenueSUM of closing / micro revenue.
sum_journey_length_days / sum_days_to_conversionAdditive day sums for derived averages.

ga4_attribution_channel_assist_report​

Granularity: one row per journey_start_date × conversion_date × channel × closing_conversion_name. Per-channel participation and assist - an influence view (values double-count across the channels of a journey; for credit use the models table).

ColumnDescription
channelThe participating channel (a value of the configured journey.channel_grouping).
journeys_participatedJourneys whose path includes this channel (any position; once per journey, overlaps across channels).
journeys_as_first / journeys_as_lastJourneys where this channel is first / last (the closing channel).
journeys_assistedJourneys where this channel participated but was not the closing channel.
closed_journeys_participated / _as_first / _as_last / _assistedThe same four counts restricted to closing journeys.
single_touch_journeysJourneys where this channel was the only touch (path_length 1). Multi-touch variants derive by subtraction, e.g. journeys_as_first - single_touch_journeys.
closed_single_touch_journeysClosing journeys where this channel was the only touch.
single_touch_revenueClosing revenue of single-touch journeys on this channel.
participated_revenueClosing revenue of journeys this channel participated in (influence, not credit).
assisted_revenueClosing revenue of journeys this channel assisted (not the closing channel).
micro_conversion_count / micro_revenue / closing_conversion_countConversions/revenue in journeys this channel participated in (influence; double-counts).
sum_traffic_touchesSUM of traffic-touch counts across participating journeys (additive). Avg path length = sum_traffic_touches / journeys_participated.
sum_journey_length_daysSUM of journey length in days (additive). Avg = sum_journey_length_days / journeys_participated.
sum_days_to_conversionSUM of first-touch-to-conversion days across closed journeys (additive). Avg = sum_days_to_conversion / closed_journeys_participated.

ga4_attribution_channel_transition_report​

Granularity: one row per journey_start_date × conversion_date × from_channel × to_channel. Sankey/flow edges between consecutive channels.

ColumnDescription
from_channelSource node - a channel, or '(start)'.
to_channelDestination node - a channel, or a terminal node: '(conversion: <name>)' if closed, else '(no conversion)'.
transitionsTimes this consecutive pair occurs (edge weight; repeats within a journey counted).
closed_transitionsTransitions within journeys that ended in a closing conversion.
journeys_with_transitionDistinct journeys containing this edge (vs transitions, which counts repeats).
closed_journeys_with_transitionDistinct closing journeys containing this edge.

ga4_attribution_conversion_lag_report​

Granularity: one row per journey_start_date × conversion_date × closing_conversion_name × lag_bucket (closed journeys only). Time-to-conversion distribution.

ColumnDescription
lag_bucketdays_to_conversion bucketed: 0 (same day), 1 day, 2-7 days, 8-30 days, 31+ days (the grain).
lag_bucket_orderInteger sort key (1-5) for chronological chart ordering.
closed_journeysClosing journeys in this bucket.
closing_conversion_countSUM of closing conversions in this bucket (= closed_journeys when one closing per journey).
revenueSUM of closing-conversion revenue in this bucket.
sum_days_to_conversionSUM of first-touch-to-closing days (additive).

ga4_attribution_micro_conversion_report​

Granularity: one row per journey_start_date × conversion_name, where conversion_name is a micro-conversion (a conversions[] entry not in journey.closing_conversions). Micro-conversion volume and its lift on final outcomes. Every configured micro-conversion gets a row on every journey date (zero-filled on dates it did not fire), so its with/without split always covers the full journey population.

ColumnDescription
conversion_nameThe micro-conversion (the grain).
event_countOccurrences of this micro-conversion (additive).
event_revenueRevenue on this micro-conversion's own touches (additive).
journeys_withJourneys containing this micro-conversion. conv_rate_with = closed_journeys_with / journeys_with.
closed_journeys_withJourneys with this micro-conversion that reached a closing conversion - compare conv_rate_with to the overall rate for lift.
closing_conversion_count_withClosing conversions in journeys containing this micro-conversion (additive).
closing_revenue_withClosing revenue of journeys containing this micro-conversion (final outcome, not the micro's own revenue). Summing across conversion_name double-counts a journey.
journeys_withoutSame-day journeys not containing this micro-conversion (day total minus journeys_with). conv_rate_without = closed_journeys_without / journeys_without. with + without ties back to the total journey count.
closed_journeys_withoutOf those, journeys that reached a closing conversion.
closing_conversion_count_withoutClosing conversions in same-day journeys without this micro-conversion (additive).
closing_revenue_withoutClosing revenue of same-day journeys without this micro-conversion, computed as the day's rounded total minus closing_revenue_with so the pair adds back exactly. Over many days the per-day rounding can drift a cent or two from the unrounded grand total; the counts are integers and reconcile exactly.

ga4_attribution_field_dictionary​

Granularity: one row per table_name × field_name across the seven dashboard tables (ga4_attribution_models and the six reports). Read from INFORMATION_SCHEMA.COLUMN_FIELD_PATHS after those tables rebuild, so it always reflects the current columns - including the config-driven dimension and metric columns and their descriptions. Meant for a dashboard field glossary; not partitioned, clustered by table_name.

ColumnDescription
field_nameColumn path of the field (nested fields as dotted paths).
table_nameDashboard table the field belongs to.
data_typeBigQuery data type of the field.
descriptionColumn description as set on the table (NULL when the column has none).