Data AnalyticsCustomer and product analytics

Attribution windows: why marketing reports disagree

PK
Pankit Kumar
Sr. Data Scientist at Parexel (a Goldman Sachs–backed company) · 20 September 2026 · 3 min read
Technically reviewed by Ishaan Sharma
In this article (5 sections)

Two marketing reports can contain the same conversions and assign different channel credit because they use different lookback windows, attribution rules or identity evidence. Reconcile the conversion population first, then compare how each report allocates credit.

Attribution is an allocation rule applied to observed touchpoints. It does not by itself estimate how many conversions would disappear if a channel were removed.

Define an explicit teaching model

Use last eligible touch before conversion. A touch is eligible when it belongs to the same known user and falls in the interval from conversion time minus the lookback duration, inclusive, to conversion time, exclusive. If no touch qualifies, retain an unattributed conversion.

This original example compares seven and thirty elapsed days. It is a standalone rule, not a claim about the exact behavior or available settings of any particular advertising platform.

Three users convert on January 15, 2026 at 12:00 UTC:

UserObserved touches
U1Organic on January 5; email on January 14
U2Paid search on January 1
U3Paid social on January 16, after conversion

U1 receives email credit under both windows. U2 is unattributed under seven days and assigned paid-search credit under thirty. U3 remains unattributed because its only touch occurs after the conversion.

Reproduce the allocation and conserve conversions

python
from collections import Counter
from datetime import datetime, timedelta

def timestamp(value):
    return datetime.fromisoformat(value.replace('Z','+00:00'))

conversions = [('V1','U1','2026-01-15T12:00:00Z'),
               ('V2','U2','2026-01-15T12:00:00Z'),
               ('V3','U3','2026-01-15T12:00:00Z')]
touches = [('T1','U1','2026-01-05T12:00:00Z','organic'),
           ('T2','U1','2026-01-14T12:00:00Z','email'),
           ('T3','U2','2026-01-01T12:00:00Z','paid_search'),
           ('T4','U3','2026-01-16T12:00:00Z','paid_social')]

def attribute(days):
    result = {}
    for conversion,user,when in conversions:
        end = timestamp(when)
        eligible = [(timestamp(at),touch,channel) for touch,who,at,channel in touches
                    if who == user and end-timedelta(days=days) <= timestamp(at) < end]
        eligible.sort()
        if len(eligible)>1 and eligible[-1][0] == eligible[-2][0]:
            raise ValueError('latest-touch timestamp tie needs an explicit policy')
        result[conversion] = eligible[-1][2] if eligible else 'unattributed'
    return result

seven, thirty = attribute(7), attribute(30)
assert seven == {'V1':'email','V2':'unattributed','V3':'unattributed'}
assert thirty == {'V1':'email','V2':'paid_search','V3':'unattributed'}
assert sum(Counter(seven.values()).values()) == len(conversions) == 3
assert sum(Counter(thirty.values()).values()) == 3
print({'seven_day':dict(Counter(seven.values())),
       'thirty_day':dict(Counter(thirty.values()))})

The total remains three conversions in both reports. Only allocation changes. Keeping unattributed outcomes visible prevents a channel report from silently losing conversions that lack eligible touches.

The code rejects an unresolved latest-touch timestamp tie instead of relying on arbitrary input order. Real pipelines also need unique conversion IDs, touch deduplication and stable identity rules.

Reconcile settings in a useful order

First compare conversion IDs, dates, currencies and amounts. Then compare reporting timezone, event-time versus processing-time treatment, identity coverage, lookback boundaries, eligible interaction types and attribution model.

Click-through and view-through interactions are not interchangeable. A platform may also model outcomes that are absent from a first-party event export. Document those differences before expecting exact reconciliation.

Google's attribution settings documentation distinguishes attribution models from lookback settings. Product settings can change, so verify the configuration actually used for the report rather than assuming a default from an old tutorial.

Do not interpret reallocated credit as new demand

Extending U2's window moves one observed conversion to paid search. It does not create another conversion or establish that the January 1 touch caused the outcome. A longer window may include more genuinely relevant interactions and more incidental ones.

For budget decisions, combine attribution with appropriate incrementality evidence and commercial constraints. A randomized channel intervention or another defensible causal design answers a different question from last-touch allocation.

Also distinguish acquisition attribution from conversion attribution. A customer's original acquisition channel and the latest eligible touch before a later purchase can legitimately differ.

Exercise: place a touch exactly seven elapsed days before conversion and another exactly at conversion time. Verify the inclusive lower and exclusive upper boundaries, then write the alternative contract if the business requires different behavior.

NeuraPath's Data Analytics with Generative AI course connects marketing data preparation with interpretable reporting. A credible attribution analysis conserves outcomes and explains why credit moved.

Continue learning

This article is part of the Customer and product analytics sequence. Use the neighbouring tasks when you need the prerequisite or the next application.

PK
Pankit Kumar
Lead Instructor, NeuraPath Academy

Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.

This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.

Explore Data Analytics with Generative AI
Counselling is free · no obligation

Not sure which programme fits?

Tell us your background and we will map it to the right entry point — including saying so when a cheaper programme is the better fit. A counsellor replies within one working day.