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

# Custom funnels

> What a site can measure today with the hooks that exist, and the shape of the funnel SDK that is being built.

<Info>
  **Status.** The campaign funnel (clicks, visits, engaged, enquiries) is live and needs nothing from a site. A general SDK for declaring your own stages is in progress. This page documents what exists now and the direction, and is updated as the SDK lands.
</Info>

## What you can measure today

Every signal below is first-party, consent-aware, and lands in the same visit and person rows the built-in funnel reads.

| Signal                  | How                                                                              | Where it shows                                                                                                                                                                                                         |
| ----------------------- | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| A page reached          | Nothing to do. Every top-level page view is a visit row with its path            | Pages per visit, the funnel's **pages** list, per-post breakdowns                                                                                                                                                      |
| A named element clicked | `data-track="cta:pricing"` on the element. The beacon counts clicks per name     | The Overview card's clicks, the most-clicked element in Takeaways                                                                                                                                                      |
| Time and depth          | Nothing to do. The beacon reports seconds and scroll on leave                    | Read depth, the **engaged** stage                                                                                                                                                                                      |
| A soft navigation       | `window._engageSend()` before changing the path on a client-routed site          | Reports the engagement for the page being left. It does not record a page view for the new path; only a full document request does. Client-routed sites that want per-path counts use full navigations for those pages |
| An enquiry              | A Stage form, or the contact overlay. Both send the session id                   | The Inbox, the **enquiries** stage                                                                                                                                                                                     |
| Which post brought them | Nothing to do. The `stage_ref` cookie rides every attributed session for 30 days | Per-channel and per-post rows                                                                                                                                                                                          |

So a site can already answer: of the people this post brought, how many reached the pricing page, how many pressed the pricing CTA, how many wrote in.

## The direction

The funnel SDK will let a site declare stages instead of inferring them from paths and clicks:

```ts theme={null}
// Shape under discussion. Not shipped.
stage.track("pricing_viewed");
stage.track("plan_selected", { plan: "pro" });
stage.identify({ email });           // ties the session to a person on your terms
```

with a matching funnel definition in the admin (an ordered list of events, per campaign or site-wide) and the same per-channel, per-post breakdown the campaign funnel has. Events would ride the existing beacon and the existing consent gate, and never carry personal data unless `identify` is called with it.

<Tip>
  **Write the funnel you want now.** Name the elements with `data-track` today using the event names you would declare later. The counts start accruing immediately, and the migration to explicit events is a rename.
</Tip>

## Constraints that will hold

* Nothing is recorded for a visitor who has not consented where consent applies.
* No event carries an address, a fingerprint, or a cross-site identifier.
* Events update the session's visit; they cannot create a visit the consent gate refused.
* Everything stays org-scoped and first-party.

## Next steps

<CardGroup cols={2}>
  <Card title="Tracking" href="/developers/analytics/tracking">
    The hooks in detail.
  </Card>

  <Card title="Guides: The funnel" href="/campaigns/funnel">
    What the built-in stages mean.
  </Card>
</CardGroup>
