# Attribution for B2B: Long Sales Cycles and Multiple Decision-Makers

B2B attribution breaks when sales cycles stretch 60-180 days and 6-10 stakeholders influence the deal. Learn how to adapt attribution for enterprise sales: account-based models, marketing-sourced vs influenced, and connecting marketing to pipeline.

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

---

> **TL;DR:** B2B attribution fails when you apply B2C models to enterprise sales. B2B requires: (1) Account-based attribution that credits touchpoints across all stakeholders, not individuals; (2) Extended lookback windows of 90-180 days matching actual sales cycles; (3) Separation of 'marketing-sourced' (first-touch) from 'marketing-influenced' (any-touch) pipeline; (4) Connection to sales stages (MQL → SQL → Opportunity → Closed) not just conversions.


## Why Standard Attribution Breaks in B2B

Standard attribution models were built for B2C: one person, one device, one session, one purchase. B2B buying is fundamentally different.

### The B2C Model Attribution Assumes

*[Chart omitted from the text version: Reusable customer-journey visual for attribution articles.
    Locals:
      title:    String header (uppercase tracking)
      steps:    Array of step hashes with keys:
                  day:     "Day 1" / "Day -30" / "Same day" — small label above
                  label:   "Facebook Ad" — main pill text
                  role:    :inactive | :credited | :conversion (controls colour)
                  percent: optional small label under pill (e.g. "100%", "50%")
                  sublabel: optional italic text under percent
      caption:  String — italic caption under the row]*


### What B2B Actually Looks Like

<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]">B2B JOURNEY &middot; ONE $50K DEAL, SIX PEOPLE, 15+ TOUCHES</p>
  </div>
  <ol class="divide-y divide-slate-100">
    <li class="flex gap-4 px-5 py-3"><span class="text-xs font-mono font-semibold text-slate-500 w-24 shrink-0">Person A &mdash; VP</span><span class="text-sm text-slate-700">LinkedIn Ad &rarr; Whitepaper &rarr; tells the team to look into it</span></li>
    <li class="flex gap-4 px-5 py-3"><span class="text-xs font-mono font-semibold text-slate-500 w-24 shrink-0">Person B &mdash; Dir</span><span class="text-sm text-slate-700">Google Search &rarr; Blog &rarr; Webinar</span></li>
    <li class="flex gap-4 px-5 py-3 bg-emerald-50/40"><span class="text-xs font-mono font-semibold text-emerald-700 w-24 shrink-0">Person C &mdash; Mgr</span><span class="text-sm text-slate-900">Colleague mention &rarr; G2 reviews &rarr; <strong>Demo request</strong> (this is the form attribution sees)</span></li>
    <li class="flex gap-4 px-5 py-3"><span class="text-xs font-mono font-semibold text-slate-500 w-24 shrink-0">Person D &mdash; User</span><span class="text-sm text-slate-700">Product Hunt &rarr; Free trial</span></li>
    <li class="flex gap-4 px-5 py-3"><span class="text-xs font-mono font-semibold text-slate-500 w-24 shrink-0">Person E &mdash; IT</span><span class="text-sm text-slate-700">Security page visit</span></li>
    <li class="flex gap-4 px-5 py-3"><span class="text-xs font-mono font-semibold text-slate-500 w-24 shrink-0">Person F &mdash; Legal</span><span class="text-sm text-slate-700">Pricing page &rarr; Terms review</span></li>
    <li class="flex gap-4 px-5 py-3 bg-indigo-50/40"><span class="text-xs font-mono font-semibold text-indigo-700 w-24 shrink-0">Outcome</span><span class="text-sm text-slate-900 font-semibold">Deal closed &mdash; $50,000</span></li>
  </ol>
  <div class="px-5 py-3 bg-amber-50 border-t border-amber-200">
    <p class="text-xs text-amber-900"><strong>Standard attribution:</strong> Demo Request gets 100% credit. <strong>Reality:</strong> 6 people, 15+ touchpoints, one deal &mdash; and the demo request was just the moment one of them filled out a form.</p>
  </div>
</div>

Standard attribution credits the form fill. It misses the VP who started the conversation, the manager who brought it to the team, and the 4 other stakeholders marketing influenced.

## The Four B2B Attribution Challenges

### Challenge 1: Multiple Stakeholders

B2B buying committees average 6-10 people. Each researches independently:

| Role | Typical Journey | Attribution Sees |
|------|-----------------|------------------|
| **Executive Sponsor** | LinkedIn ad → Quick scan | Nothing (no conversion) |
| **Budget Holder** | Colleague email → ROI calculator | Nothing (no conversion) |
| **Champion** | Webinar → Blog series → Demo request | Everything (the "converter") |
| **End Users** | Free trial → Documentation | Some activity |
| **IT/Security** | Security docs → Integration guide | Nothing (research only) |
| **Procurement** | Pricing page → Proposal review | Nothing (late stage) |

Standard attribution makes the Champion look like the only person marketing reached. The executive who initiated the search? Invisible.

### Challenge 2: Long Sales Cycles

Enterprise deals take 60-180+ days. Standard lookback windows miss early touches:

| Lookback Window | What You Miss |
|-----------------|---------------|
| **7 days** | 95% of B2B marketing influence |
| **30 days** | 70% of B2B marketing influence |
| **60 days** | 40% of B2B marketing influence |
| **90 days** | 20% of B2B marketing influence |
| **180 days** | Most of the journey (appropriate for enterprise) |

If your average sales cycle is 120 days and your lookback window is 30 days, you're systematically undercounting marketing's contribution by 75%+.

### Challenge 3: Marketing-to-Sales Handoff

In B2B, marketing creates leads that sales closes. Attribution typically ends at "demo request"—missing the full picture:

<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]">THE B2B FUNNEL &middot; MARKETING / SALES HANDOFF</p>
  </div>
  <div class="px-5 py-6">
    <div class="grid grid-cols-2 gap-4">
      <div>
        <div class="text-[11px] font-bold text-emerald-700 tracking-[0.15em] mb-2">MARKETING-OWNED</div>
        <div class="grid grid-cols-3 gap-1.5 text-center">
          <div class="bg-emerald-100 text-emerald-800 border border-emerald-300 px-2 py-2 rounded-md text-xs font-semibold">Visitor</div>
          <div class="bg-emerald-100 text-emerald-800 border border-emerald-300 px-2 py-2 rounded-md text-xs font-semibold">Lead / MQL</div>
          <div class="bg-emerald-100 text-emerald-800 border border-emerald-300 px-2 py-2 rounded-md text-xs font-semibold">SQL</div>
        </div>
        <div class="grid grid-cols-3 gap-1.5 text-center mt-1">
          <div class="text-[10px] text-slate-500">Traffic</div>
          <div class="text-[10px] text-slate-500">Lead gen</div>
          <div class="text-[10px] text-slate-500">Qualification</div>
        </div>
      </div>
      <div>
        <div class="text-[11px] font-bold text-indigo-700 tracking-[0.15em] mb-2">SALES-OWNED</div>
        <div class="grid grid-cols-3 gap-1.5 text-center">
          <div class="bg-indigo-100 text-indigo-800 border border-indigo-300 px-2 py-2 rounded-md text-xs font-semibold">Opportunity</div>
          <div class="bg-indigo-100 text-indigo-800 border border-indigo-300 px-2 py-2 rounded-md text-xs font-semibold">Proposal</div>
          <div class="bg-indigo-500 text-white px-2 py-2 rounded-md text-xs font-bold">Closed Won</div>
        </div>
        <div class="grid grid-cols-3 gap-1.5 text-center mt-1">
          <div class="text-[10px] text-slate-500">Pipeline</div>
          <div class="text-[10px] text-slate-500">Negotiation</div>
          <div class="text-[10px] text-indigo-700 font-semibold">Revenue</div>
        </div>
      </div>
    </div>
    <p class="text-xs text-slate-600 italic mt-5 pt-4 border-t border-slate-200">
      <strong class="text-slate-900 not-italic">The handoff is where attribution usually breaks.</strong> Marketing's attribution stops at MQL or SQL. Sales's CRM doesn't carry the upstream channel. Without a join, marketing can't claim revenue and sales can't see what worked.
    </p>
  </div>
</div>

### Challenge 4: Buyer ≠ User

The person who buys isn't always the person who uses:

| Who Buys | Who Uses | Attribution Challenge |
|----------|----------|----------------------|
| VP of Marketing | Marketing Analysts | VP saw the ads, analysts requested demo |
| IT Director | Development team | IT approved, developers evaluated |
| CEO | Entire company | CEO saw conference booth, employees search later |

If you track user-level attribution, you miss the buyers. If you track buyers, you miss the users who validated.

*[Chart omitted from the text version: B2B journey: buying group × touchpoint visibility. Illustrative for a typical mid-market B2B SaaS deal.]*


## The Solution: Account-Based Attribution

### From Individual to Account

Instead of crediting touchpoints to people, credit them to accounts:

```ruby
# Individual Attribution (B2C-style)
class IndividualAttribution
  def attribute(conversion)
    # Find touchpoints for this ONE user
    touchpoints = conversion.user.touchpoints
    distribute_credit(touchpoints)
  end
end

# Account-Based Attribution (B2B-style)
class AccountAttribution
  def attribute(deal)
    # Find touchpoints for ALL users at this account
    account = deal.account
    all_stakeholders = account.contacts

    touchpoints = all_stakeholders.flat_map(&:touchpoints)
    distribute_credit(touchpoints, deal_value: deal.amount)
  end
end
```

### How Account-Based Attribution Works

<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]">ACCOUNT-BASED ATTRIBUTION &middot; ACME CORP &middot; $100K DEAL</p>
  </div>
  <div class="px-5 py-5">
    <p class="text-xs font-bold text-slate-500 tracking-wider mb-2">5 STAKEHOLDERS &middot; 12 TOUCHPOINTS</p>
    <ul class="text-sm text-slate-700 space-y-1 mb-5">
      <li><strong class="text-slate-900">VP (Sarah)</strong> &mdash; LinkedIn Ad &rarr; Whitepaper download</li>
      <li><strong class="text-slate-900">Director (Mike)</strong> &mdash; Webinar &rarr; 3 blog posts</li>
      <li><strong class="text-slate-900">Manager (Lisa)</strong> &mdash; Demo request &rarr; Trial signup</li>
      <li><strong class="text-slate-900">User (Tom)</strong> &mdash; Documentation &rarr; Support chat</li>
      <li><strong class="text-slate-900">IT (James)</strong> &mdash; Security page &rarr; Integration docs</li>
    </ul>

    <div class="grid grid-cols-1 md:grid-cols-2 gap-3">
      <div class="bg-emerald-50 border-l-4 border-emerald-500 rounded-md p-4">
        <div class="text-[11px] font-bold text-emerald-700 tracking-[0.15em] mb-2">ACCOUNT-BASED LINEAR</div>
        <ul class="text-sm text-slate-700 space-y-1 font-mono">
          <li>LinkedIn Ads &mdash; $8,333</li>
          <li>Content (WP) &mdash; $8,333</li>
          <li>Webinar &mdash; $8,333</li>
          <li>Blog (3 posts) &mdash; $25,000</li>
          <li>Demo/Trial &mdash; $16,667</li>
          <li>Docs/Support &mdash; $25,000</li>
          <li>Security/Integ &mdash; $8,333</li>
        </ul>
      </div>
      <div class="bg-amber-50 border-l-4 border-amber-500 rounded-md p-4">
        <div class="text-[11px] font-bold text-amber-700 tracking-[0.15em] mb-2">STANDARD ATTRIBUTION</div>
        <ul class="text-sm text-slate-700 space-y-1 font-mono">
          <li>Demo Request &mdash; <strong class="text-amber-700">$100,000</strong></li>
          <li>Everything else &mdash; <strong class="text-amber-700">$0</strong></li>
        </ul>
        <p class="text-xs text-amber-700 italic mt-3">Lisa's form fill gets the entire deal. The VP, Director, User, and IT contributions disappear.</p>
      </div>
    </div>
  </div>
</div>

Account-based attribution sees that LinkedIn reached the VP who started the buying process. Standard attribution sees only Lisa's demo request.

## Marketing-Sourced vs Marketing-Influenced

B2B teams need two attribution views:

### Marketing-Sourced (First-Touch)

**Question:** "How much pipeline did marketing originate?"

```sql
-- Marketing-sourced pipeline
SELECT
  first_touch_channel,
  COUNT(*) as opportunities,
  SUM(opportunity_value) as pipeline_value
FROM opportunities
WHERE first_touch_source = 'marketing'  -- Any marketing touchpoint was first
  AND created_date >= CURRENT_DATE - 90
GROUP BY first_touch_channel
ORDER BY pipeline_value DESC;
```

**Use for:**
- Proving marketing creates demand
- Justifying demand gen budget
- Pipeline forecasting

### Marketing-Influenced (Any-Touch)

**Question:** "How much revenue did marketing touch?"

```sql
-- Marketing-influenced revenue
SELECT
  o.opportunity_id,
  o.closed_amount,
  COUNT(DISTINCT mt.channel) as marketing_channels_touched,
  COUNT(DISTINCT mt.contact_id) as stakeholders_reached
FROM opportunities o
JOIN marketing_touchpoints mt ON o.account_id = mt.account_id
WHERE o.stage = 'Closed Won'
  AND mt.touchpoint_date < o.close_date
GROUP BY o.opportunity_id, o.closed_amount;
```

**Use for:**
- Demonstrating marketing's total impact
- Understanding which content influences deals
- Identifying high-value touchpoints

### Reporting Both

| Metric | Q4 Example | What It Means |
|--------|-----------|---------------|
| **Sourced Pipeline** | $2.5M | Marketing originated this pipeline |
| **Influenced Pipeline** | $8.2M | Marketing touched stakeholders on these deals |
| **Sourced Revenue** | $800K | Deals where marketing was first touch |
| **Influenced Revenue** | $3.1M | Deals where marketing touched any stakeholder |

Both metrics are valid. Use "Sourced" for demand gen ROI; use "Influenced" for total marketing impact.

*[Chart omitted from the text version: Sourced vs Influenced pipeline by channel for a typical B2B SaaS team. Illustrative numbers.]*


## Extending Lookback Windows for B2B

### Calculate Your Actual Sales Cycle

```sql
-- Determine appropriate lookback window
SELECT
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY days_to_close) AS median_cycle,
  PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY days_to_close) AS p75_cycle,
  PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY days_to_close) AS p90_cycle
FROM (
  SELECT
    opportunity_id,
    EXTRACT(DAY FROM close_date - first_marketing_touch) AS days_to_close
  FROM opportunities
  WHERE stage = 'Closed Won'
    AND first_marketing_touch IS NOT NULL
) t;

-- Example output:
-- median_cycle: 68 days
-- p75_cycle: 112 days
-- p90_cycle: 156 days
-- Recommendation: Use 120-150 day window
```

### Window Recommendations by Deal Size

| Deal Size | Typical Cycle | Recommended Window |
|-----------|---------------|-------------------|
| **< $10K ARR** | 14-30 days | 60 days |
| **$10K-50K ARR** | 30-60 days | 90 days |
| **$50K-100K ARR** | 60-120 days | 120 days |
| **$100K-500K ARR** | 90-180 days | 180 days |
| **$500K+ ARR** | 180-365 days | 365 days |

### Tiered Windows for B2B

Apply different windows to different funnel stages:

| Stage | Window | Rationale |
|-------|--------|-----------|
| **First Touch → MQL** | 90-180 days | Awareness can happen early |
| **MQL → SQL** | 60-90 days | Active qualification period |
| **SQL → Opportunity** | 30-60 days | Deal acceleration |
| **Opportunity → Close** | 14-30 days | Final touches before signature |

## Connecting Marketing to Revenue

### The Attribution Chain

<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]">B2B ATTRIBUTION CHAIN &middot; MARKETING TOUCH &rarr; CLOSED WON</p>
  </div>
  <div class="px-5 py-5 space-y-2">
    <div class="flex items-center gap-3">
      <div class="shrink-0 w-7 h-7 rounded-full bg-emerald-200 text-emerald-900 font-bold text-xs flex items-center justify-center">1</div>
      <div class="flex-1 bg-emerald-50 border border-emerald-200 rounded-md px-4 py-2.5">
        <div class="flex items-baseline justify-between"><span class="text-sm font-semibold text-slate-900">Lead (MQL)</span><span class="text-xs text-slate-500 font-mono">$0</span></div>
        <div class="text-xs text-slate-500 italic">Marketing-created</div>
      </div>
    </div>
    <div class="text-center text-slate-400 text-sm">&darr; <span class="text-xs italic">qualification (SDR)</span></div>
    <div class="flex items-center gap-3">
      <div class="shrink-0 w-7 h-7 rounded-full bg-emerald-200 text-emerald-900 font-bold text-xs flex items-center justify-center">2</div>
      <div class="flex-1 bg-emerald-50 border border-emerald-200 rounded-md px-4 py-2.5">
        <div class="flex items-baseline justify-between"><span class="text-sm font-semibold text-slate-900">SQL</span><span class="text-xs text-slate-500 font-mono">$0</span></div>
        <div class="text-xs text-slate-500 italic">Marketing + Sales</div>
      </div>
    </div>
    <div class="text-center text-slate-400 text-sm">&darr; <span class="text-xs italic">discovery (AE)</span></div>
    <div class="flex items-center gap-3">
      <div class="shrink-0 w-7 h-7 rounded-full bg-indigo-200 text-indigo-900 font-bold text-xs flex items-center justify-center">3</div>
      <div class="flex-1 bg-indigo-50 border border-indigo-200 rounded-md px-4 py-2.5">
        <div class="flex items-baseline justify-between"><span class="text-sm font-semibold text-slate-900">Opportunity</span><span class="text-xs text-indigo-700 font-mono font-semibold">$50,000</span></div>
        <div class="text-xs text-slate-500 italic">Pipeline value</div>
      </div>
    </div>
    <div class="text-center text-slate-400 text-sm">&darr; <span class="text-xs italic">sales cycle</span></div>
    <div class="flex items-center gap-3">
      <div class="shrink-0 w-7 h-7 rounded-full bg-indigo-500 text-white font-bold text-xs flex items-center justify-center">4</div>
      <div class="flex-1 bg-indigo-500 text-white rounded-md px-4 py-2.5">
        <div class="flex items-baseline justify-between"><span class="text-sm font-bold">Closed Won</span><span class="text-xs font-mono font-bold">$50,000</span></div>
        <div class="text-xs text-indigo-100 italic">Revenue</div>
      </div>
    </div>
  </div>
  <div class="px-5 py-3 bg-slate-50 border-t border-slate-200">
    <p class="text-xs text-slate-700"><strong>The attribution question:</strong> how do we credit the $50K back to marketing? The next section walks through three options &mdash; first-touch revenue, multi-touch revenue, and the W-shaped variant most B2B teams settle on.</p>
  </div>
</div>

### Revenue Attribution Models for B2B

**Option 1: First-Touch Revenue Attribution**

Credit all revenue to the first marketing touchpoint:

<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]">FIRST-TOUCH &middot; $50,000 DEAL</p>
  </div>
  <div class="px-5 py-5 flex flex-wrap items-center gap-3">
    <div class="flex-1 min-w-[160px] bg-emerald-50 border border-emerald-200 rounded-lg p-3">
      <div class="text-[10px] font-bold tracking-[0.15em] text-emerald-600 mb-1">FIRST MARKETING TOUCH</div>
      <div class="text-sm font-semibold text-slate-900">LinkedIn Ad to VP</div>
    </div>
    <div class="flex items-center text-slate-300 text-xl">&rarr;</div>
    <div class="flex-1 min-w-[160px] bg-indigo-500 text-white rounded-lg p-3">
      <div class="text-[10px] font-bold tracking-[0.15em] text-indigo-100 mb-1">ATTRIBUTION</div>
      <div class="text-sm font-semibold">LinkedIn Ads</div>
      <div class="text-2xl font-bold mt-1">$50,000</div>
    </div>
  </div>
</div>

**Best for:** Proving marketing sources revenue, demand gen reporting

**Option 2: Multi-Touch Revenue Attribution**

Distribute revenue credit across all marketing touchpoints:

<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]">MULTI-TOUCH LINEAR &middot; $50,000 DEAL &middot; 6 TOUCHES</p>
  </div>
  <div class="px-5 py-5">
    <p class="text-sm text-slate-600 mb-4">Six touchpoints split evenly at <strong class="text-slate-900">$8,333</strong> each. Channels with more touches earn more of the deal.</p>
    <div class="grid grid-cols-2 sm:grid-cols-4 gap-3 text-center">
      <div class="bg-indigo-50 border border-indigo-200 rounded-md p-3">
        <div class="text-xs font-semibold text-slate-900">LinkedIn</div>
        <div class="text-[10px] text-slate-500 mb-1">1 touch</div>
        <div class="text-lg font-bold text-indigo-700">$8,333</div>
      </div>
      <div class="bg-emerald-50 border border-emerald-200 rounded-md p-3">
        <div class="text-xs font-semibold text-slate-900">Blog</div>
        <div class="text-[10px] text-slate-500 mb-1">3 touches</div>
        <div class="text-lg font-bold text-emerald-700">$25,000</div>
      </div>
      <div class="bg-indigo-50 border border-indigo-200 rounded-md p-3">
        <div class="text-xs font-semibold text-slate-900">Webinar</div>
        <div class="text-[10px] text-slate-500 mb-1">1 touch</div>
        <div class="text-lg font-bold text-indigo-700">$8,333</div>
      </div>
      <div class="bg-indigo-50 border border-indigo-200 rounded-md p-3">
        <div class="text-xs font-semibold text-slate-900">Demo</div>
        <div class="text-[10px] text-slate-500 mb-1">1 touch</div>
        <div class="text-lg font-bold text-indigo-700">$8,333</div>
      </div>
    </div>
  </div>
</div>

**Best for:** Understanding which content/channels influence deals

**Option 3: W-Shaped Attribution**

Weight first touch, lead creation touch, and opportunity creation:

<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]">W-SHAPED &middot; $50,000 DEAL &middot; THREE WEIGHTED MOMENTS</p>
  </div>
  <div class="px-5 py-5 flex flex-wrap items-stretch gap-2">
    <div class="flex-1 min-w-[130px] bg-indigo-50 border border-indigo-200 rounded-lg p-3">
      <div class="text-[10px] font-bold tracking-[0.15em] text-indigo-500 mb-1">FIRST TOUCH &middot; 30%</div>
      <div class="text-sm font-semibold text-slate-900">LinkedIn Ad</div>
      <div class="text-xl font-bold text-indigo-700 mt-1">$15,000</div>
    </div>
    <div class="flex items-center text-slate-300 text-xl">&rarr;</div>
    <div class="flex-1 min-w-[130px] bg-indigo-50 border border-indigo-200 rounded-lg p-3">
      <div class="text-[10px] font-bold tracking-[0.15em] text-indigo-500 mb-1">LEAD CREATION &middot; 30%</div>
      <div class="text-sm font-semibold text-slate-900">Webinar signup</div>
      <div class="text-xl font-bold text-indigo-700 mt-1">$15,000</div>
    </div>
    <div class="flex items-center text-slate-300 text-xl">&rarr;</div>
    <div class="flex-1 min-w-[130px] bg-indigo-50 border border-indigo-200 rounded-lg p-3">
      <div class="text-[10px] font-bold tracking-[0.15em] text-indigo-500 mb-1">OPP CREATION &middot; 30%</div>
      <div class="text-sm font-semibold text-slate-900">Demo request</div>
      <div class="text-xl font-bold text-indigo-700 mt-1">$15,000</div>
    </div>
    <div class="flex items-center text-slate-300 text-xl">+</div>
    <div class="flex-1 min-w-[130px] bg-slate-50 border border-slate-200 rounded-lg p-3">
      <div class="text-[10px] font-bold tracking-[0.15em] text-slate-500 mb-1">ALL OTHERS &middot; 10%</div>
      <div class="text-sm font-semibold text-slate-900">Shared</div>
      <div class="text-xl font-bold text-slate-600 mt-1">$5,000</div>
    </div>
  </div>
</div>

**Best for:** B2B with distinct funnel stages, crediting key conversion moments

> **Note:**
> **B2B recommendation:** Report both first-touch (sourced) and multi-touch (influenced) revenue. First-touch for pipeline sourcing; multi-touch for understanding content effectiveness. Don't pick one—use both.

## Implementation Checklist

### Step 1: Unify Account Data

Connect all stakeholder touchpoints to accounts:

```sql
-- Create account-level touchpoint view
CREATE VIEW account_touchpoints AS
SELECT
  accounts.id AS account_id,
  accounts.name AS account_name,
  contacts.id AS contact_id,
  contacts.title AS contact_title,
  touchpoints.channel,
  touchpoints.source,
  touchpoints.campaign,
  touchpoints.occurred_at
FROM accounts
JOIN contacts ON contacts.account_id = accounts.id
JOIN touchpoints ON touchpoints.contact_id = contacts.id;
```

### Step 2: Extend Lookback Windows

Configure attribution to match your sales cycle:

```ruby
# B2B attribution configuration
class B2BAttributionConfig
  WINDOWS = {
    smb: 60,        # <$10K deals
    mid_market: 90, # $10K-100K deals
    enterprise: 180 # $100K+ deals
  }.freeze

  def self.window_for(deal)
    case deal.annual_value
    when 0..10_000 then WINDOWS[:smb]
    when 10_000..100_000 then WINDOWS[:mid_market]
    else WINDOWS[:enterprise]
    end
  end
end
```

### Step 3: Track Both Sourced and Influenced

Create separate pipelines for each metric:

| Report | Attribution Model | Question Answered |
|--------|------------------|-------------------|
| **Pipeline Sourcing** | First-touch by account | "What did marketing originate?" |
| **Pipeline Influence** | Any-touch by account | "What did marketing touch?" |
| **Content Influence** | Multi-touch by asset | "Which content influences deals?" |
| **Channel Efficiency** | Multi-touch by channel | "Which channels reach buyers?" |

### Step 4: Connect to CRM Stages

Map marketing touchpoints to opportunity stages:

| Stage transition | Touchpoints credited | Bucketed under |
|---|---|---|
| MQL created | All before the MQL | "MQL" |
| SQL created | Between MQL and SQL | "SQL" |
| Opportunity created | Between SQL and Opp | "Pipeline" |
| Closed Won | All touchpoints | "Revenue" |

This stage-based bucketing shows which channels work at which point in the funnel — and lets you compute marketing-influenced revenue at each stage gate, not just at close.

<div class="bg-slate-50 border-l-4 border-slate-400 p-5 my-8 rounded-r-md not-prose">
  <p class="text-xs font-bold text-slate-500 tracking-[0.15em] mb-3">CRM-CONNECTED ATTRIBUTION, IN PRACTICE</p>
  <p class="text-sm text-slate-700 leading-relaxed mb-3">The integration shape that works for most B2B teams: an attribution layer that captures every touchpoint server-side, resolves identity at form submit (matching email to existing contact records), and then writes a custom Touchpoint object back to Salesforce or HubSpot, related to both Contact and Opportunity.</p>
  <p class="text-sm text-slate-700 leading-relaxed mb-3">In the CRM, each Opportunity then exposes:</p>
  <ul class="text-sm text-slate-700 leading-relaxed space-y-1 list-disc pl-5 mb-3">
    <li><strong class="text-slate-900">First-touch source</strong> &mdash; the channel that introduced the first identified contact on the account</li>
    <li><strong class="text-slate-900">Sourced channel</strong> &mdash; the channel of the touchpoint immediately preceding lead creation</li>
    <li><strong class="text-slate-900">Influenced channels</strong> &mdash; every channel that touched any contact on the account during the active sales cycle</li>
    <li><strong class="text-slate-900">Cost per opportunity</strong> &mdash; computed by joining channel spend to influenced opportunities</li>
  </ul>
  <p class="text-sm text-slate-700 leading-relaxed">The gain: marketing reports stop arguing with sales reports. Both look at the same Opportunity record. Marketing-sourced revenue, marketing-influenced revenue, and unsourced revenue all reconcile to the same closed-won total.</p>
</div>

## Common B2B Attribution Mistakes

### Mistake 1: Using B2C Attribution Windows

30-day windows miss 70%+ of B2B marketing influence. Extend to match your sales cycle.

### Mistake 2: Tracking Only the Form-Filler

Standard lead attribution credits whoever filled out the form. In reality, 5 other people influenced that decision. Use account-based attribution.

### Mistake 3: Stopping at MQL

Marketing's job isn't done at lead creation. Track marketing influence through to closed-won revenue to prove full impact.

### Mistake 4: Ignoring Sales-Owned Touches

After SQL, sales takes over—but marketing content (case studies, ROI tools, objection handlers) still influences the deal. Track marketing touchpoints through the sales cycle.

### Mistake 5: Only Reporting First-Touch OR Multi-Touch

Both are valid. First-touch for sourcing credit; multi-touch for influence credit. Report both to different stakeholders.

## Summary

B2B attribution requires different approaches than B2C:

| B2C Approach | B2B Adaptation |
|-------------|----------------|
| Individual attribution | Account-based attribution |
| 7-30 day windows | 90-180 day windows |
| Single conversion event | MQL → SQL → Opp → Close funnel |
| One buyer | 6-10 stakeholder buying committee |
| First-touch OR last-touch | First-touch (sourced) AND multi-touch (influenced) |

**Implementation priorities:**
1. Unify stakeholder touchpoints to account level
2. Extend lookback windows to match sales cycle
3. Track both sourced and influenced pipeline
4. Connect marketing touchpoints to CRM stages

## Further Reading

**On B2B Measurement:**
- [First-Touch Attribution](/articles/first-touch-attribution) — For sourcing reports
- [How to Use Attribution Models by Funnel Stage](/articles/funnel-stage-attribution) — Tiered approach

**On Configuration:**
- [How to Change Your Attribution Lookback Window](/articles/attribution-lookback-window) — Window setup
- [How to Choose the Right Attribution Model](/articles/how-to-choose-attribution-model) — Model selection

## Key takeaways

- Standard attribution assumes one buyer—B2B has 6-10 stakeholders per deal
- Use account-based attribution: credit touchpoints across the buying committee
- Extend lookback windows to 90-180 days for enterprise sales cycles
- Track both 'sourced' (first-touch) and 'influenced' (any-touch) pipeline


## FAQ

**Why doesn't standard attribution work for B2B?**

Standard attribution tracks individual user journeys to conversion. In B2B, 6-10 stakeholders research independently before a single 'conversion' (demo request, deal close). If marketing touched 5 people at an account but only 1 filled out a form, standard attribution misses 80% of marketing's contribution.

**What's the difference between 'sourced' and 'influenced' pipeline?**

Sourced (first-touch): The first marketing touch that brought any stakeholder from an account. 'Marketing sourced this $100K deal.' Influenced (any-touch): Any marketing touch to any stakeholder before close. 'Marketing influenced this deal by reaching 5 stakeholders.' Both are valid metrics with different purposes.

**How long should my lookback window be for B2B?**

Match your sales cycle. If average time from first touch to closed-won is 120 days, your lookback window should be at least 120 days—probably 150-180 to capture early awareness. B2C windows of 7-30 days dramatically undercount B2B marketing influence.

**How do I attribute when the buyer and user are different people?**

Account-based attribution. When a VP sees an ad, a manager attends a webinar, and an analyst requests a demo—all touchpoints credit to the account, not individuals. The 'conversion' is the deal, and all account touchpoints contributed.

**Should I use first-touch or multi-touch for B2B?**

Both, for different purposes. First-touch for pipeline sourcing reports ('Marketing brought in $5M of new pipeline'). Multi-touch for influence reports ('Marketing touched 80% of closed-won revenue'). Different stakeholders care about different questions.


