Copy as markdown[View .md](https://docs.funnelfizz.com/concepts/splitting-and-extensions "View the raw markdown for this page")[Open in Claude](https://claude.ai/new?q=Read%20https%3A%2F%2Fdocs.funnelfizz.com%2Fconcepts%2Fsplitting-and-extensions.md%20and%20help%20me%20with%20this%20FunnelFizz%20topic%3A%20Splitting%20%26%20extensions "Open this page in Claude with context")[Open in ChatGPT](https://chat.openai.com/?q=Read%20https%3A%2F%2Fdocs.funnelfizz.com%2Fconcepts%2Fsplitting-and-extensions.md%20and%20help%20me%20with%20this%20FunnelFizz%20topic%3A%20Splitting%20%26%20extensions "Open this page in ChatGPT with context")

# Splitting & extensions

A single funnel shows you the *overall* picture: total traffic in, total customers out. That's usually not enough. What you really want to know is *"which slice of traffic is actually converting?"* — which is what **splits** answer.

After the main funnel, you often want to track what happens *next* — do customers upgrade? That's what **extensions** answer.

## Splits[​](#splits "Direct link to Splits")

A split inserts a filter node between two stages. Everything downstream of the split only shows traffic matching that filter.

### Eight split conditions[​](#eight-split-conditions "Direct link to Eight split conditions")

| Condition          | Filters by                                                          | Example                            |
| ------------------ | ------------------------------------------------------------------- | ---------------------------------- |
| **Traffic source** | Referrer domain                                                     | "only traffic from reddit.com"     |
| **UTM parameter**  | utm\_source, utm\_medium, utm\_campaign, utm\_content, utm\_term    | "only utm\_campaign=summer-launch" |
| **Channel**        | Auto-categorized channel                                            | "only organic search"              |
| **Device type**    | Desktop, mobile, tablet                                             | "only mobile"                      |
| **Country**        | ISO country code                                                    | "only US and Canada"               |
| **Custom event**   | A goal you define with `data-fn-goal` or `funnelfizz('event', ...)` | "only users who clicked pricing"   |
| **A/B variant**    | The `?ab=` URL parameter                                            | "only ?ab=frog"                    |
| **Stripe product** | Specific Stripe product ID (TRIAL/CUSTOMER only)                    | "only Pro tier subscribers"        |

All conditions combine with **AND** — a visitor must match every condition in the chain to appear in that split branch.

### Auto-categorized channels[​](#auto-categorized-channels "Direct link to Auto-categorized channels")

The **Channel** condition uses a server-side categorizer that bucketizes your traffic from referrer + UTM combinations. Buckets:

* `direct` — no referrer, no UTM
* `organic_search` — Google, Bing, DuckDuckGo, etc.
* `social` — X, LinkedIn, Reddit, TikTok, Instagram, YouTube, Facebook
* `paid` — `utm_medium=cpc/paid/ads` or recognized ad networks
* `email` — `utm_medium=email` or email-client referrers
* `ai_llm` — chatgpt.com, claude.ai, perplexity.ai, gemini.google.com, copilot.microsoft.com
* `referral` — everything else with a referrer

### Visualizing a split[​](#visualizing-a-split "Direct link to Visualizing a split")

On the canvas, splits look like this:

```
                        ┌─ [split: mobile] ─▶ CONSIDERATION (mobile) ─▶ TRIAL ─▶ CUSTOMER

                        │

AWARENESS ─▶ CONSIDERATION                                                               

                        │

                        └─ [split: desktop] ─▶ CONSIDERATION (desktop) ─▶ TRIAL ─▶ CUSTOMER
```

Each branch is independent — you can chain further splits down a branch, connect different providers, even send different emails to each cohort.

### Nested splits[​](#nested-splits "Direct link to Nested splits")

You can split a split. "Mobile visitors from the US who came via YouTube" is a three-level nested split that will compute correctly. The canvas auto-lays-out nested branches so they don't overlap.

There's no fixed depth limit, but in practice three levels is about as deep as is readable.

### Adding a split in the UI[​](#adding-a-split-in-the-ui "Direct link to Adding a split in the UI")

1. Click the **+** button between any two stages on the canvas.
2. Pick a **split condition**.
3. Fill in the **value** (e.g., country = "US", UTM source = "reddit").
4. Name the branch (e.g., "US mobile traffic").
5. Save.

That's it. The branch fills in automatically using the same data sources as the parent funnel.

→ Full details and per-condition configuration: [Features → Splitting](https://docs.funnelfizz.com/features/splitting.md).

## Extensions[​](#extensions "Direct link to Extensions")

**Extensions** are an optional second-stage pipeline that sits *after* CUSTOMER, tracking what happens to paying customers — specifically, do they upgrade?

The analogy: your main funnel is "get from stranger to paying customer." Your extension is "get from paying customer to *higher-paying* customer."

### Extension stages[​](#extension-stages "Direct link to Extension stages")

Extensions mirror the main funnel's structure (minus Awareness, because by definition these are people you already have):

* **Extension Consideration** — your paying customers who are *active* on your product in the reporting window (fired a pageview or an event).
* **Extension Trial** — Extension-Consideration users who started a trial at a *higher-priced* tier.
* **Extension Customer** — users paying at a higher tier than their anchor product.

### The anchor product[​](#the-anchor-product "Direct link to The anchor product")

When you enable extensions for a funnel, you pick an **anchor product** — typically your entry-level paid plan (e.g., "Hobby — $9/mo"). The extension then tracks the cohort of customers who bought the anchor, and measures how many of them end up paying for a higher tier.

If a customer:

* Still has the anchor subscription → counted in **Retained**.
* Has no anchor but a higher-tier sub → counted in **Upgraded** (and shows up in Extension).
* Has nothing → counted in **Churned**.

### Canvas layout[​](#canvas-layout "Direct link to Canvas layout")

On the canvas, extensions render to the right of the CUSTOMER stage with a double-line edge (visually distinct from main-funnel edges). They inherit the tint color of the main funnel.

```
... ─▶ CUSTOMER ═══▶ Ext CONSIDERATION ═══▶ Ext TRIAL ═══▶ Ext CUSTOMER
```

### When to use extensions[​](#when-to-use-extensions "Direct link to When to use extensions")

* **Freemium products** — you want to know what % of free users convert to paid. Set the free tier as the anchor.
* **SaaS with multiple tiers** — how often do Hobby customers upgrade to Pro? Set Hobby as the anchor.
* **Lifecycle marketing** — use extension stages as triggers for upgrade automations.

### When NOT to use extensions[​](#when-not-to-use-extensions "Direct link to When NOT to use extensions")

* Single-tier products (Stripe has one price → nothing to upgrade to).
* Products where upsell isn't the growth lever (e.g., one-time purchases, usage-based billing where everyone's on the same plan and just pays more).

***

**Next:** [Email →](https://docs.funnelfizz.com/concepts/email.md) • [Automations →](https://docs.funnelfizz.com/concepts/automations.md) • [Conversion →](https://docs.funnelfizz.com/concepts/conversion.md) • [Full funnel tracking →](https://docs.funnelfizz.com/concepts/full-funnel-tracking.md)
