What an attribution table is
An attribution table is a composite table built from raw events. For every conversion it finds the visits that came before it, within a lookback window, and precomputes how much credit each visit earns under five models. Because the credit is stored as ordinary metrics, any tile (Table, Bar, Line, KPI) can show it.
| Model | Credit |
|---|---|
| First Touch | All credit to the first visit in the path |
| Last Touch | All credit to the last visit |
| Linear | Shared equally across all visits |
| Position-Based | 40% to the first, 40% to the last, 20% shared across the visits between. With two visits, 50% each |
| Time Decay | More credit to visits closer to the conversion, halving every Time-Decay Half-Life days |
This is different from the Attribution tile, which counts users per channel on the fly with a fixed last-touch rule.
Before you start
You need one of:
- a GA4 BigQuery export and a Google service account with BigQuery Data Viewer and BigQuery Job User on the project. Queries are billed to that project.
- a Lens event table with one row per event, such as Echo events, with a user ID, a session ID and an event name.
Create the table
- Go to Configure > Data Tables, click + New Table and choose Attribution Table under Composite Tables.
- Under Details, enter a Table Name.
- Under Data Source, pick where raw events come from: - GA4 BigQuery Export: pick the Service Account (or the default TagPipes service account), then enter the Project ID and GA4 Export Dataset. Touches use GA4's session source, medium, campaign and channel group. - Lens Event Table: pick the Source Table, then the User ID Field, Session ID Field, Event Name Field and Channel Field. Source Field, Medium Field and Campaign Field are optional. Each session's first event decides its channel, source, medium and campaign.
- Under Conversion, enter the exact Conversion Event, for example
purchase. Optionally: - Only When: click Add Condition to narrow the conversion, for examplefulfillment_typeisdelivery. - Keep These Conversion Fields: up to 10, comma separated. Each becomes aconv_column you can filter tiles by, so one table answers delivery, pickup and all orders. - Revenue Field: without it, credit is counted in conversions only. - De-duplicate On: a conversion repeated with the same value counts once, such as a transaction ID. - Click Check Setup (below).
- Set the Attribution Rules (below), a Sync Schedule and, optionally, a Notifications group to email when a sync fails.
- Click Create Table. The first sync is queued straight away.
Check Setup
Check Setup reads the last 7 days of data and saves nothing. It shows:
| Line | Tells you |
|---|---|
| Conversions, last 7 days | How many conversion events matched. Zero means the table would be empty |
| Converting users | How many users converted |
| field filled | For each kept conversion field, how often it has a value |
| Sessions with no channel | Visits that will read as (not set) |
| Events GA4 dates on another day than zone | GA4 export only: how many events fall on a different day in your chosen Report Days In zone |
| BigQuery scanned per sync | GA4 export only: what each build reads, with an estimated cost per sync and per month at the chosen schedule |
Warnings appear underneath, for example when a kept field is blank on most conversions. See BigQuery Cost for how the estimate is worked out.
Attribution rules
| Setting | Default | What it does |
|---|---|---|
| Lookback Window | 30 days | How far before a conversion a visit still counts as a touch. 7, 14, 30, 60 or 90 days |
| Conversions Kept | Last 90 days | The history the table holds: 30, 60, 90, 180 or 365 days. Rebuilt in full on every sync |
| Direct Visits | Count Them | Count Them gives direct visits credit like any other. Skip When Possible ignores direct when another channel touched |
| Channel Values That Mean Direct | Direct, (direct) | Comma separated, case-insensitive. A blank channel reads as (not set) |
| Time-Decay Half-Life (days) | 7 | A touch this many days before the conversion gets half the weight of one on the day |
| Most Touches Per Conversion | 50 | Keeps the latest ones when a path is longer |
| Report Days In | Inherit from Property | The day each conversion is counted on. For a GA4 export, use the GA4 property's time zone |
| Step Names | Source / Medium as recorded | GA4 only. Pick a custom grouping on source_medium, source, medium, campaign or channel to give steps friendly names |
| Channel Group | GA4 Default | GA4 only. Primary Group uses the GA4 property's own primary channel group; visits it does not cover use the default. Changing it needs a sync |
What the table contains
Each row is one touch on one conversion. Visits that did not convert are also stored, so conversion rates can be worked out.
| Columns | Examples |
|---|---|
| Touch | Channel, Source, Medium, Campaign, Source / Medium, Step, Touch #, Touches in Path |
| Path | Path (Channel), Path (Source / Medium), Path (Campaign), Path (Steps), First-Touch Channel, Last-Touch Channel. A path keeps its last 10 steps |
| Credit | Conversions and Revenue for each of the five models |
| Rates | Conv. Rate per model (credit divided by Sessions), Conv. Rate (Visitors) |
| Totals | Conversions, Revenue, Touches, Sessions, Visitors, Converting Visitors, Avg Days to Convert, Avg Touches per Conversion |
Visitors, Converting Visitors and Conv. Rate (Visitors) count one path per visitor and are filled for GA4 export tables; use them with the path columns.
Credit adds up across rows, so a Bar tile of Conversions (Linear) by Channel is a linear attribution report.
Troubleshooting
| Symptom | Fix |
|---|---|
| "Fill in ... first" when checking | A required field is empty. Fill the fields named in the message. |
| No conversions matched | The event name or a condition does not match exactly. Check the spelling and case. |
| Many sessions with no channel | The channel field is often blank in the source. Pick another field, or expect a large (not set) row. |
| Days do not match GA4 | Set Report Days In to the GA4 property's time zone. |
| "Unknown time zone" | Pick a zone from the Report Days In list. |