# How to Change Your Attribution Lookback Window

Learn how to configure attribution lookback windows for your business. Includes recommended windows by industry, A/B testing methodology, and common mistakes to avoid.

- Canonical: https://mbuzz.co/articles/attribution-lookback-window
- Published: 2026-05-01
- Last updated: 2026-07-23
- Author: Holly Mehakovic, mbuzz (https://mbuzz.co)

---

> **TL;DR:** A lookback window defines how far back in time you search for touchpoints to credit for a conversion. Set it based on your sales cycle: 7 days for impulse e-commerce, 30 days for considered purchases, 60-90 days for B2B SaaS, and 90+ days for enterprise. Too short misses early touchpoints; too long dilutes credit across noise. Test window changes with A/B experiments before committing.


## What Lookback Windows Do

A lookback window defines **how far back in time** your attribution model searches for touchpoints to credit.

<div class="not-prose my-8 bg-white border border-slate-200 rounded-lg overflow-hidden">
  <div class="px-5 py-3 border-b border-slate-200 bg-slate-50">
    <p class="text-xs font-bold text-slate-500 tracking-[0.15em]">LOOKBACK WINDOW EXAMPLE &middot; 30 DAYS</p>
  </div>
  <div class="px-5 py-6">
    <div class="grid grid-cols-4 gap-2 sm:gap-3 text-center">
      <div>
        <div class="text-[10px] sm:text-xs text-slate-500 font-mono mb-2">Day &minus;45</div>
        <div class="bg-slate-100 text-slate-500 px-2 py-3 rounded-md text-xs sm:text-sm font-semibold opacity-60">Blog</div>
        <div class="text-[10px] text-slate-400 italic mt-1.5">outside window</div>
      </div>
      <div>
        <div class="text-[10px] sm:text-xs text-slate-500 font-mono mb-2">Day &minus;30</div>
        <div class="bg-emerald-100 text-emerald-800 border border-emerald-300 px-2 py-3 rounded-md text-xs sm:text-sm font-semibold">Email</div>
        <div class="text-[10px] text-emerald-700 mt-1.5">in window</div>
      </div>
      <div>
        <div class="text-[10px] sm:text-xs text-slate-500 font-mono mb-2">Day &minus;15</div>
        <div class="bg-emerald-100 text-emerald-800 border border-emerald-300 px-2 py-3 rounded-md text-xs sm:text-sm font-semibold">Retargeting</div>
        <div class="text-[10px] text-emerald-700 mt-1.5">in window</div>
      </div>
      <div>
        <div class="text-[10px] sm:text-xs text-slate-500 font-mono mb-2">Day 0</div>
        <div class="bg-indigo-500 text-white px-2 py-3 rounded-md text-xs sm:text-sm font-bold">Purchase</div>
        <div class="text-[10px] text-indigo-700 mt-1.5 font-semibold">conversion</div>
      </div>
    </div>
    <div class="mt-4 pt-4 border-t border-slate-100">
      <div class="flex items-center gap-2 mb-1">
        <span class="inline-block w-3 h-3 rounded-sm bg-emerald-300"></span>
        <span class="text-xs text-slate-600"><strong>30-day window covers Day &minus;30 to Day 0</strong></span>
      </div>
      <p class="text-xs text-slate-500 italic leading-snug">Email and Retargeting fall inside the window and get credit. The Blog visit on Day &minus;45 is treated as if it never happened.</p>
    </div>
  </div>
</div>

The window determines which touchpoints are "in scope" for attribution. Touchpoints outside the window get zero credit—they're treated as if they never happened.

## Recommended Windows by Business Type

| Business Type | Typical Sales Cycle | Recommended Window |
|--------------|--------------------|--------------------|
| **Impulse E-commerce** | 1-3 days | 7 days |
| **Considered E-commerce** | 7-14 days | 30 days |
| **DTC/Subscription** | 14-30 days | 30-45 days |
| **Low-ticket SaaS** | 7-21 days | 30 days |
| **Mid-market SaaS** | 30-60 days | 60 days |
| **Enterprise SaaS/B2B** | 60-180 days | 90 days |
| **Enterprise Sales** | 180+ days | 90-180 days |


**Rule of thumb:** Set your window to capture 90% of conversions based on time from first touchpoint.

## How to Analyze Your Conversion Timing

### Step 1: Calculate Time-to-Conversion Distribution

```sql
-- Time from first touchpoint to conversion
SELECT
  NTILE(100) OVER (ORDER BY days_to_convert) AS percentile,
  days_to_convert
FROM (
  SELECT
    conversion_id,
    EXTRACT(DAY FROM conversion_at - first_touchpoint_at) AS days_to_convert
  FROM conversions
  WHERE conversion_at >= CURRENT_DATE - INTERVAL '90 days'
) t;
```

### Example Distribution

| Percentile | Days to convert | Cumulative % | Window recommendation |
|---|---|---|---|
| 50th | 3 | 50% | Minimum: 7 days |
| 75th | 12 | 75% | Conservative: 14 days |
| 85th | 21 | 85% | Recommended: 21–30 days |
| 90th | 28 | 90% | Extended: 30 days |
| 95th | 45 | 95% | Maximum: 45 days |
| 99th | 72 | 99% | Edge case only |

A 30-day window captures 90%+ of conversions for this distribution.

*[Chart omitted from the text version: Time-to-conversion histogram with cumulative-percent line and a recommended-window cutoff marker.]*


### Step 2: Compare Credit Distribution at Different Windows

See how channel credit changes with different windows:

```sql
-- Compare attribution at 7, 30, 60 day windows
WITH conversions AS (
  SELECT * FROM conversions WHERE conversion_at >= CURRENT_DATE - 90
)
SELECT
  channel,
  SUM(CASE WHEN touchpoint_age_days <= 7 THEN credit ELSE 0 END) AS window_7d,
  SUM(CASE WHEN touchpoint_age_days <= 30 THEN credit ELSE 0 END) AS window_30d,
  SUM(CASE WHEN touchpoint_age_days <= 60 THEN credit ELSE 0 END) AS window_60d
FROM attribution_details
JOIN conversions USING (conversion_id)
GROUP BY channel;
```

### Example Comparison

| Channel | 7-day | 30-day | 60-day | Change (7→30) |
|---|---|---|---|---|
| Email | 38% | 28% | 24% | **−10%** loses share |
| Branded Search | 25% | 20% | 17% | **−5%** loses share |
| Paid Social | 12% | 22% | 27% | **+10%** gains share |
| Organic Search | 15% | 18% | 20% | **+3%** gains share |
| Display | 10% | 12% | 12% | **+2%** gains share |

Short windows over-credit closers (email, branded search). Longer windows give more credit to introducers (paid social, display).

## The Trade-off: Short vs Long Windows

### Short Windows (7-14 days)

**Pros:**
- Credit is concentrated on immediately relevant touchpoints
- Less noise from old, potentially irrelevant touches
- Matches platform defaults (easier to reconcile)
- Good for fast-cycle businesses

**Cons:**
- Misses early-funnel touchpoints
- Over-credits closers, under-credits introducers
- May not reflect true customer journey length
- First-touch data becomes unreliable

**Best for:** Impulse purchases, short sales cycles, within-channel optimization

### Long Windows (60-90+ days)

**Pros:**
- Captures full customer journey
- Fair credit to early-funnel channels
- Better for B2B with long cycles
- First-touch data is accurate

**Cons:**
- May credit irrelevant old touchpoints
- Signal gets diluted across many touches
- Harder to act on (touches from 3 months ago)
- More complexity to analyze

**Best for:** B2B, enterprise sales, high-consideration purchases

> **Note:**
> **The Goldilocks principle:** Your window should be long enough to capture your sales cycle but short enough that credited touchpoints were actually influential. For most businesses, this means 2-3x your median time-to-conversion.

## Different Windows for Different Purposes

### By Funnel Stage

| Stage | Recommended Window | Rationale |
|-------|-------------------|-----------|
| **ToFU (First-touch)** | 60-90 days | Discovery can happen early |
| **MoFU (Linear)** | 30-60 days | Active consideration period |
| **BoFU (Last-touch)** | 14-30 days | Final decision is recent |

This is the tiered approach from [funnel stage attribution](/articles/funnel-stage-attribution).

### By Channel

Some tools support channel-specific windows:

| Channel | Suggested Window | Why |
|---------|-----------------|-----|
| **Display** | 60+ days | Awareness → consideration takes time |
| **Paid Social** | 30-60 days | Often first touch, needs longer window |
| **Email** | 14-30 days | Timely triggers, shorter relevance |
| **Retargeting** | 7-14 days | By definition, recent engagement |
| **Branded Search** | 7 days | Intent is immediate |

**Caveat:** Channel-specific windows add complexity. Only use if you have clear evidence that channels operate on different timelines.

## How to Test Window Changes

### A/B Testing Windows

Don't change windows blindly—test first:

```ruby
# Window A/B test design
def design_window_test
  {
    test_type: :holdout,
    duration: "6-8 weeks",

    treatment: {
      name: "New 45-day window",
      window_days: 45
    },
    control: {
      name: "Current 30-day window",
      window_days: 30
    },

    success_metrics: {
      primary: "Forecast accuracy (predicted vs actual revenue)",
      secondary: [
        "Channel ROAS stability",
        "Budget decision confidence"
      ]
    },

    sample: "Split by conversion_id modulo",
    analysis: "Compare attributed ROAS and forecast accuracy"
  }
end
```

### What to Compare

When testing windows, measure:

| Metric | What It Tells You |
|--------|-------------------|
| **Touchpoint coverage** | What % of conversions have touchpoints in window? |
| **Average touchpoints** | How many touches per journey are captured? |
| **Channel credit shift** | Which channels gain/lose credit? |
| **Forecast accuracy** | Does longer window predict better? |
| **Decision confidence** | Are insights more actionable? |

```sql
-- Compare touchpoint coverage by window
SELECT
  lookback_window,
  COUNT(*) AS total_conversions,
  SUM(CASE WHEN has_touchpoints THEN 1 ELSE 0 END) AS with_touchpoints,
  ROUND(100.0 * SUM(CASE WHEN has_touchpoints THEN 1 ELSE 0 END) / COUNT(*), 1) AS coverage_pct,
  ROUND(AVG(touchpoint_count), 1) AS avg_touchpoints
FROM (
  SELECT
    c.conversion_id,
    lw.days AS lookback_window,
    COUNT(t.id) > 0 AS has_touchpoints,
    COUNT(t.id) AS touchpoint_count
  FROM conversions c
  CROSS JOIN (VALUES (7), (30), (60), (90)) AS lw(days)
  LEFT JOIN touchpoints t
    ON c.visitor_id = t.visitor_id
    AND t.occurred_at BETWEEN c.converted_at - INTERVAL '1 day' * lw.days AND c.converted_at
  GROUP BY c.conversion_id, lw.days
) t
GROUP BY lookback_window
ORDER BY lookback_window;
```

### Example Test Results

**Window A/B test results — 8 weeks**

| Metric | 30-day | 45-day | Difference |
|---|---|---|---|
| Touchpoint coverage | 82% | 91% | **+9%** |
| Avg touchpoints / journey | 3.2 | 4.1 | **+0.9** |
| Paid Social credit | 18% | 24% | **+6%** |
| Email credit | 28% | 23% | **−5%** |
| Forecast accuracy | ±18% | ±12% | **Better** |

**Recommendation: extend to a 45-day window** — captures more first-touch data, better reflects true journey length, and improves forecast accuracy.

## Common Window Mistakes

### Mistake 1: Using Platform Defaults Blindly

Google Ads uses 30 days. Meta uses 7 days. Neither matches your actual customer journey—they're designed to favor their platform.

**Fix:** Analyze your own time-to-conversion data and set windows based on your business.

### Mistake 2: Same Window for All Purposes

First-touch analysis needs longer windows than last-touch analysis.

**Fix:** Use tiered windows: longer for ToFU, shorter for BoFU.

### Mistake 3: Never Reviewing Window Settings

Customer journeys change. New products, new channels, market shifts.

**Fix:** Review window settings annually or when making major business changes.

### Mistake 4: Changing Windows Without Comparison

Switching from 30 to 60 days will drastically change your attribution data. If you don't compare side-by-side, you'll misinterpret the shift.

**Fix:** Run both windows in parallel for 4-6 weeks before switching.

### Mistake 5: Chasing Window Optimization

Spending months finding the "perfect" 43-day window is not valuable. Windows are approximate—get in the right range and move on.

**Fix:** Use your business category default, validate it's reasonable, and focus on more impactful work.

## Implementation

### Configuring in Common Tools

| Tool | Where to Configure | Options |
|------|-------------------|---------|
| **GA4** | Admin → Attribution Settings | 30, 60, or 90 days |
| **Google Ads** | Conversions → Settings | 1-90 days by conversion |
| **Meta Ads** | Attribution Settings | 1, 7, 28 days click; 1 day view |
| **mbuzz** | Settings → Attribution | Custom per model |

### Code Example

```ruby
class Attribution::WindowConfiguration
  DEFAULTS = {
    impulse_ecommerce: 7,
    considered_ecommerce: 30,
    saas_mid_market: 60,
    b2b_enterprise: 90
  }.freeze

  def initialize(business_type:, custom_window: nil)
    @window_days = custom_window || DEFAULTS.fetch(business_type)
  end

  def filter_touchpoints(conversion)
    conversion.touchpoints.where(
      "occurred_at >= ?",
      conversion.occurred_at - @window_days.days
    )
  end

  # Test multiple windows on same data
  def compare_windows(conversion, windows: [7, 30, 60, 90])
    windows.map do |days|
      touchpoints = conversion.touchpoints.where(
        "occurred_at >= ?",
        conversion.occurred_at - days.days
      )

      {
        window_days: days,
        touchpoint_count: touchpoints.count,
        channels: touchpoints.pluck(:channel).uniq,
        first_touch_captured: touchpoints.any? { |t|
          t == conversion.touchpoints.order(:occurred_at).first
        }
      }
    end
  end
end
```

## Summary

Attribution lookback windows determine which touchpoints get credit:

**Setting your window:**
1. Analyze your time-to-conversion distribution
2. Set window to capture 85-95% of conversions
3. Use industry defaults as starting points
4. Test changes with A/B experiments

**Key principles:**
- Match window to your sales cycle (2-3x median)
- Short windows favor closers; long windows favor introducers
- Consider different windows for different funnel stages
- Review annually or when business changes

**Common windows:**
- E-commerce: 7-30 days
- SaaS: 30-60 days
- B2B: 60-90+ days

## Further Reading

**On Attribution Configuration:**
- [How to Choose the Right Attribution Model](/articles/how-to-choose-attribution-model) — Model selection framework
- [How to Use Different Attribution Models by Funnel Stage](/articles/funnel-stage-attribution) — Tiered windows approach

**On Platform Settings:**
- [Google: Attribution lookback windows](https://support.google.com/analytics/answer/10618975) — GA4 configuration
- [Meta: About attribution settings](https://www.facebook.com/business/help/370704083280490) — Meta Ads configuration

## Key takeaways

- Match lookback window to your average time-to-conversion
- Short windows (7-14 days) favor bottom-funnel; long windows favor top-funnel
- Use different windows for different funnel stages
- Test window changes with holdout experiments


## FAQ

**What's the default attribution window in GA4?**

GA4 uses a 90-day lookback window for most reports, though you can configure this in the attribution settings. Google Ads uses 30-day click, 1-day view by default. Meta uses 7-day click, 1-day view.

**Should my lookback window match my sales cycle?**

Yes, approximately. Your window should capture 85-95% of conversions based on time from first touch. If 90% of customers convert within 30 days of first touch, a 30-day window is appropriate. Going much longer dilutes signal with noise.

**What happens if my lookback window is too short?**

You'll miss early-funnel touchpoints and over-credit bottom-funnel channels. First-touch will often fall outside the window, making paid social and content look ineffective while email and branded search look great.

**What happens if my lookback window is too long?**

You'll credit touchpoints that weren't actually influential—a blog visit 6 months ago might not relate to today's purchase. Long windows also include more 'noise' touchpoints, diluting the signal of actually influential touches.

**Can I use different windows for different channels?**

Some tools support this, and it can be appropriate. Display and paid social might warrant longer windows (awareness takes time); email might use shorter windows (timely triggers). However, this adds complexity—only do it if you have clear evidence for different timing.


