> ## Documentation Index
> Fetch the complete documentation index at: https://heybtw.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# get_event_attribution

> What each event did for pipeline: sourced and influenced revenue, the deals behind it, and how far they got.

> [!NOTE]
>
> Read-only.

The canonical source for event revenue. It answers "what did this event do for pipeline?" with per-event rollups and the per-deal breakdown. Called without an event, it also serves program-wide cost per meeting and velocity. Follows the [heyBTW MCP rules](https://heybtw.com/docs/mcp/rules.md).

## When to use it

* "How much pipeline did the Austin dinner source?"
* "Which deals came out of our NYC open house?"
* "Did any event move an existing deal forward?"
* "Do event-touched deals close faster than the rest?"
* "What's our cost per meeting across paid events?"

## Parameters

| Parameter | Type | Required | Notes |
| - | - | - | - |
| `event_name` | string | No | Name from [`list_events`](https://heybtw.com/docs/tools/list-events). Case-insensitive; partial and close matches resolve. An ambiguous name returns candidates instead of data. |
| `channel_id` | string | No | The collab handle. Wins when both are given. Omit both for a workspace-level call. |
| `date_from` | string | No | Inclusive lower bound on the event START. `YYYY-MM-DD` or `YYYY-MM-DDTHH:MM[:SS]` with optional `Z` or `+HH:MM` (UTC when none). Surrounding whitespace is refused. |
| `date_to` | string | No | Inclusive upper bound, same grammar. |
| `contract_version` | string | No | Omit for `v1`. |

No `limit` and no cursor. At most the 500 most recent events are read; narrow with `channel_id`, `event_name` or dates.

## Response

One row per event in `data`. A workspace-level call adds `program_summary` and `velocity_comparison` at the top level of the response, beside `data`. A call for one event omits both, because their scope is the program.

| Field | Meaning |
| - | - |
| `pipeline` | `sourced_revenue` and `influenced_revenue` are mutually exclusive; `total_revenue` is their sum. `won_revenue` is the closed-won subset already inside them, never a third bucket. Also `sourced_count`, `influenced_count`, `influenced_progressed_count`, `influenced_closed_count`, `company_count`. |
| `attribution_breakdown` | One row per deal: `deal_name`, `domain`, `revenue`, `attribution_type` (`sourced` or `influenced`), `is_won`, `stage`, and for influenced deals `stage_at_event`, `stage_current`, `stage_progressed`, `days_since_event`. Plus `contact`, `email`, `partner`. |
| `attributed_deals_by_stage` | How many of this event's deals have a current CRM stage at or past each funnel stage. Never the workspace funnel. |
| `mql_count`, `opportunity_count`, `meeting_booked_count`, `conversion_rate` | Per-event funnel counts. `null` with a gap when the workspace's funnel has no single per-event step for the stage. |
| `event_tense`, `registered_account_pipeline` | On an upcoming event: pipeline is 0 and `registered_account_pipeline` is the open pipeline of registered accounts. That is not attribution. |
| `crm_joined`, `crm_join_key` | `crm_joined` is true when heyBTW joined the CRM connected in heyBTW in this request. `crm_join_key` is `domain`, the breakdown field to join on in your own CRM. |
| `program_summary.cost_per_meeting` | Program-wide, across every paid event. Never one event's cost. |
| `velocity_comparison` | Event-touched vs. non-touched deals: average days to close, win rate, and the lift. |

The sample below is trimmed from a real call for the Austin dinner (fixture data; two of six deals shown).

```json theme={null}
{
  "tool": "get_event_attribution",
  "crm_context": { "provider": "attio", "status": "connected", "capability": "deal_read", "capability_served": true },
  "data": [
    {
      "event_name": "ScaleUp.ai Field Dinner: Austin",
      "channel_id": "cmvifxsyp000j07l2hmp06n1u",
      "event_date": "2026-09-27T23:30:00",
      "total_signups": 28,
      "mql_count": null,
      "opportunity_count": null,
      "meeting_booked_count": null,
      "conversion_rate": null,
      "event_anchor": "last_attribution_touch",
      "pipeline": {
        "total_revenue": 1050000,
        "sourced_revenue": 1050000,
        "sourced_count": 6,
        "influenced_revenue": 0,
        "influenced_count": 0,
        "won_revenue": 0,
        "company_count": 6
      },
      "attribution_breakdown": [
        {
          "deal_name": "New logo - Harbor Ledger",
          "domain": "harborledger.com",
          "revenue": 310000,
          "is_won": false,
          "attribution_type": "sourced",
          "stage": "Opportunity",
          "stage_at_event": null,
          "stage_current": "Opportunity",
          "contact": "Hugo Zimmer",
          "email": "hugo.zimmer@harborledger.com",
          "partner": null
        },
        {
          "deal_name": "New logo - Ironwood Systems",
          "domain": "ironwoodsys.com",
          "revenue": 140000,
          "is_won": false,
          "attribution_type": "sourced",
          "stage": "Lead",
          "stage_at_event": null,
          "stage_current": "Lead",
          "contact": "Theo Lombardi",
          "email": "theo.lombardi@ironwoodsys.com",
          "partner": null
        }
      ],
      "attributed_deals_by_stage": { "mql": 6, "meeting_booked": 5, "opportunity": 5, "closed_won": 0 },
      "crm_joined": true,
      "crm_join_key": "domain"
    }
  ],
  "metadata": { "contract_version": "v1" },
  "status": "partial"
}
```

A real workspace-level call with `date_from: "2026-11-01"` returned the two upcoming events with `pipeline.total_revenue: 0`, the SF open house with `registered_account_pipeline: { "open_pipeline": 1527000, "deal_count": 11, "account_count": 11 }`, and at the top level `program_summary.cost_per_meeting.cost_per_meeting_usd: null` (no meetings from paid events yet).

## Rules the agent must follow

* Nothing is attributed to an event before its event day. Never report `registered_account_pipeline` as sourced, influenced or won, and never add it to a total.
* Total pipeline is `pipeline.total_revenue`. Never add `won_revenue` on top.
* A funnel count of `null` is unknown, never 0. Say which stage, using the gap.
* `cost_per_meeting` is program-wide. Never present it as one event's cost.
* Read `crm_context` first. When heyBTW does not read deals, use the user's own CRM connector, joined on `email` and `company_domain`, and do not put its numbers under heyBTW's name.
* For partner-level revenue across events use [`get_partner_insights`](https://heybtw.com/docs/tools/get-partner-insights).

## Errors and gaps

| Code | What it means | What to do |
| - | - | - |
| `partial_coverage` (funnel) | `funnel_step_workspace_wide` and similar: no per-event funnel count. `retryable: false`. | Say the counts are unknown; the workspace totals are in [`get_workspace_overview`](https://heybtw.com/docs/tools/get-workspace-overview). |
| `partial_coverage` (attribution) | Events with no canonical attribution, including events that have not happened yet. | Name them; scope the question to covered events. |
| `partial_coverage` (Sponsor Mode) | Restricted partner events are not included. | Point to the dashboard's partner view. |
| `scope_truncated` | More than 500 events matched. | Narrow by event or dates. |
| `invalid_parameter` | A date outside the grammar. | Rewrite as `YYYY-MM-DD`. |
| `internal_error` | Failure on heyBTW's side. | Retry once. |

## Related

* [`get_program_report`](https://heybtw.com/docs/tools/get-program-report): these rows without the deal breakdown, plus the funnel.
* [`get_event_details`](https://heybtw.com/docs/tools/get-event-details): who registered and who came.
* [`get_data_health`](https://heybtw.com/docs/tools/get-data-health): which events have no attribution yet.
* Playbook: [Did anyone follow up, and what did the event do for pipeline](https://heybtw.com/docs/playbooks/follow-up-and-roi.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.