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.
| Table | Granularity | Purpose |
|---|---|---|
int_ga4_attribution_touchpoints_session | One row per traffic touch (one per ga4_sessions row) plus one row per matched conversion event | The flat touchpoint stream in session mode. |
int_ga4_attribution_touchpoints_source_change | One row per intra-session source run plus one row per matched conversion event | The 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.
| Column | Description |
|---|---|
journey_id | Unique ID - FARM_FINGERPRINT(user_identifier || '_' || journey_number). |
user_identifier | Identity key value (user_pseudo_id by default, else journey.user_identifier coalesced to user_pseudo_id). |
user_identifier_type | Name of the identity-key column (e.g. user_pseudo_id). |
journey_number | 0-based sequence of this journey in the user's history. |
journey_start_date | Date of the first touch (partition column). |
journey_start_timestamp_utc | UTC timestamp of the first touch. |
journey_end_date | Date of the last touch. |
journey_length_days | Elapsed days, first to last touch. |
days_to_conversion | Days from first touch to the closing conversion; NULL for ongoing/lapsed journeys. |
user_pseudo_ids | Distinct user_pseudo_id values in the journey. |
device_categories | Distinct device categories across traffic touches. |
default_channel_groups | Distinct default channel groups across traffic touches. |
ends_in_sale | TRUE if the journey has a closing conversion. |
journey_length_steps | Number of traffic (non-conversion) touches. |
revenue | Revenue across ALL conversion touches (closing + micro). Does not reconcile to models.attributed_revenue (closing only) - use closing_revenue for that. |
closing_conversion_count | Closing conversion touches (0 or 1 by construction). |
micro_conversion_count | Non-closing (micro) conversion touches. |
closing_revenue | Revenue from closing conversions only (0 when none). |
micro_revenue | Revenue from non-closing (micro) conversions (0 when none). |
closing_conversion_date | Closing conversion date; NULL for ongoing/lapsed. Reports use this as conversion_date. |
closing_conversion_name | Closing conversion name; NULL for ongoing/lapsed. |
touches | Array 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. |
conversions | Array 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_ongoing | TRUE if no boundary closed the journey (still accumulating). |
is_final | Data-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.
| Column | Description |
|---|---|
touch_date | Date of the credited traffic touch (partition column). |
conversion_date | Date of the closing conversion the credit is for. |
closing_conversion_name | Closing conversion name - segment by conversion type ('(no touchpoint)' on the synthetic zero-touch row). |
model_name | Attribution model. participation overcounts - compare fractional models only. |
source / medium / campaign / default_channel_group / device_category | Channel dimensions of the touch ('(no touchpoint)' for a zero-touch journey). |
attributed_revenue | Closing revenue apportioned to this touch (additive). SUM reconciles to closing revenue per fractional model; participation overcounts. |
attributed_conversions | Share of the closing conversion on this touch (fractional for standard models, 1.0 each for participation; additive). |
credited_touches | Credited 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.
| Column | Description |
|---|---|
channel_chain | The path - ordered >-delimited channels; part of the grain. |
path_length | Channels in the path (constant per channel_chain). |
path_length_bucket | path_length bucketed: 1, 2, 3, 4-5, 6+. |
first_channel / last_channel | First / last channel in the path. |
num_distinct_channels | Distinct channels in the path (path_length counts repeats; this does not). |
journeys | Journeys on this path (additive). |
closed_journeys / ongoing_journeys / lapsed_journeys | Journeys that closed / still open / closed without a sale. |
no_touch_journeys | Journeys with zero traffic touches (chain = '(no touchpoint)'). |
sum_traffic_touches | SUM of traffic touches (additive). |
total_conversion_count | SUM of all conversion touches, closing + micro (additive). |
closing_conversion_count / micro_conversion_count | SUM of closing / non-closing conversions. |
total_revenue / micro_revenue | SUM of closing-conversion / micro-conversion revenue. |
sum_journey_length_days | SUM of journey length in days. |
sum_days_to_conversion | SUM 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.
| Column | Description |
|---|---|
path_length | Channels in the path (the grain; raw integer - bucket in BI). |
path_length_bucket | Convenience bucket over path_length (1, 2, 3, 4-5, 6+); descriptor, not grain. |
journeys | Journeys at this path length (additive). |
closed_journeys / ongoing_journeys / lapsed_journeys | conversion_rate = closed_journeys / journeys. |
no_touch_journeys | Zero-traffic-touch journeys (fall in path_length 1). |
total_conversion_count / closing_conversion_count / micro_conversion_count | Additive conversion counts. |
total_revenue / micro_revenue | SUM of closing / micro revenue. |
sum_journey_length_days / sum_days_to_conversion | Additive 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).
| Column | Description |
|---|---|
channel | The participating channel (a value of the configured journey.channel_grouping). |
journeys_participated | Journeys whose path includes this channel (any position; once per journey, overlaps across channels). |
journeys_as_first / journeys_as_last | Journeys where this channel is first / last (the closing channel). |
journeys_assisted | Journeys where this channel participated but was not the closing channel. |
closed_journeys_participated / _as_first / _as_last / _assisted | The same four counts restricted to closing journeys. |
single_touch_journeys | Journeys 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_journeys | Closing journeys where this channel was the only touch. |
single_touch_revenue | Closing revenue of single-touch journeys on this channel. |
participated_revenue | Closing revenue of journeys this channel participated in (influence, not credit). |
assisted_revenue | Closing revenue of journeys this channel assisted (not the closing channel). |
micro_conversion_count / micro_revenue / closing_conversion_count | Conversions/revenue in journeys this channel participated in (influence; double-counts). |
sum_traffic_touches | SUM of traffic-touch counts across participating journeys (additive). Avg path length = sum_traffic_touches / journeys_participated. |
sum_journey_length_days | SUM of journey length in days (additive). Avg = sum_journey_length_days / journeys_participated. |
sum_days_to_conversion | SUM 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.
| Column | Description |
|---|---|
from_channel | Source node - a channel, or '(start)'. |
to_channel | Destination node - a channel, or a terminal node: '(conversion: <name>)' if closed, else '(no conversion)'. |
transitions | Times this consecutive pair occurs (edge weight; repeats within a journey counted). |
closed_transitions | Transitions within journeys that ended in a closing conversion. |
journeys_with_transition | Distinct journeys containing this edge (vs transitions, which counts repeats). |
closed_journeys_with_transition | Distinct 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.
| Column | Description |
|---|---|
lag_bucket | days_to_conversion bucketed: 0 (same day), 1 day, 2-7 days, 8-30 days, 31+ days (the grain). |
lag_bucket_order | Integer sort key (1-5) for chronological chart ordering. |
closed_journeys | Closing journeys in this bucket. |
closing_conversion_count | SUM of closing conversions in this bucket (= closed_journeys when one closing per journey). |
revenue | SUM of closing-conversion revenue in this bucket. |
sum_days_to_conversion | SUM 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.
| Column | Description |
|---|---|
conversion_name | The micro-conversion (the grain). |
event_count | Occurrences of this micro-conversion (additive). |
event_revenue | Revenue on this micro-conversion's own touches (additive). |
journeys_with | Journeys containing this micro-conversion. conv_rate_with = closed_journeys_with / journeys_with. |
closed_journeys_with | Journeys with this micro-conversion that reached a closing conversion - compare conv_rate_with to the overall rate for lift. |
closing_conversion_count_with | Closing conversions in journeys containing this micro-conversion (additive). |
closing_revenue_with | Closing revenue of journeys containing this micro-conversion (final outcome, not the micro's own revenue). Summing across conversion_name double-counts a journey. |
journeys_without | Same-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_without | Of those, journeys that reached a closing conversion. |
closing_conversion_count_without | Closing conversions in same-day journeys without this micro-conversion (additive). |
closing_revenue_without | Closing 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.
| Column | Description |
|---|---|
field_name | Column path of the field (nested fields as dotted paths). |
table_name | Dashboard table the field belongs to. |
data_type | BigQuery data type of the field. |
description | Column description as set on the table (NULL when the column has none). |