Browse docs

Jump to core topics without leaving the page.

Funnels and conversions

How we calculate funnel steps and conversion rates, including optimized entry and hold-constant.

Funnels and conversions dashboard banner

This page explains how Flash Analytics computes funnels and conversions, including:

  • default vs optimized (reoptimized) entry
  • conversion windows
  • grouping by session or profile
  • hold property constant (e.g., properties.query)
  • breakdown behavior

Funnel steps and grouping

A funnel is an ordered sequence of events, for example:

Product viewed -> Added to cart -> Checkout completed

We evaluate funnels per group:

  • Session: session_id
  • Profile: profile_id

All logic below is the same; only the group key changes.

Totals vs unique

Funnels can be counted in two ways:

  • Unique (distinct): each group is counted once. Examples:
    • session_id funnels count each session once.
    • profile_id funnels count each profile once.
  • Totals (event): each qualifying entry event is counted as a separate attempt, even if it belongs to the same profile/session.

Use Unique when you want how many sessions/profiles converted. Use Totals when you want how many attempts converted.

Conversion window

The conversion window is the maximum allowed time from entry (step A) to the final step.

Example (24h window):

  • A at T0
  • B and C must occur between T0 and T0 + 24h

We do not reset this window when later steps occur.

Entry modes

Default entry

Default entry anchors the attempt to the first Step 1 (A) for that group in the report range (or per day bucket in conversion charts).

Steps B and C must occur after that entry and within the conversion window.

Optimized (reoptimized) entry

Optimized entry picks the best Step 1 (A) for each group in the report range:

  • If a full chain A -> B -> C exists, choose the latest A that completes the chain.
  • If no full chain exists, fall back to the earliest A (default behavior).

After selecting the optimized entry, we recompute the steps from that chosen entry time.

Hold property constant

When enabled, all steps must share the same property value captured from the entry event.

Example: hold constant on properties.query

  • Step A has query = kiwi
  • Step B must also have query = kiwi
  • Step C must also have query = kiwi

Missing values are normalized to "__NULL__" so comparisons remain consistent.

Breakdowns

Breakdowns (e.g., country, device, properties.query) are computed from the entry event.

In optimized entry, the breakdown value comes from the optimized entry event, not the earliest event.

Funnel vs conversion charts

Funnel chart

  • Returns step counts (level 1, 2, 3, ...)
  • No time-series buckets
  • Output answers: how many attempts reached each step?

Conversion chart

  • Returns time-series conversion rates
  • Groups entries by time bucket (day/week/month)
  • Output answers: how many attempts converted per bucket?

Example dataset

This example dataset includes the following:

  • 3 profiles (P1, P2, P3)
  • 4 sessions (S1, S2, S3, S4)
  • Funnel: Product viewed -> Added to cart -> Checkout completed

Key scenarios:

  • P1/S1: product = apple converts, later product = banana fails
  • P1/S4: product = apple fails (A->B only)
  • P2/S2: product = orange fails, later product = grape converts
  • P3/S3: product = kiwi A/B then product = apple C (mismatch), later product = mango converts

Example visualization

Session S1 (P1)
Converted
Product viewedAdded to cartCheckout completedapple
Attempt 2: Product viewed → Added to cart (no checkout) · product = banana
Session S2 (P2)
Converted
Attempt 1: Product viewed → Added to cart (no checkout) · product = orange
Product viewedAdded to cartCheckout completedgrape
Session S3 (P3)
Mixed
Attempt 1: Product viewed → Added to cart → Checkout completedkiwi → apple mismatch
Product viewedAdded to cartCheckout completedmango
Session S4 (P1)
Dropped
Product viewedAdded to cartno checkout
product = apple

Expected results (no hold-constant)

Session grouping:

  • default entry: 2/4 (50%)
  • optimized entry: 3/4 (75%)

Profile grouping:

  • default entry: 2/3 (66.67%)
  • optimized entry: 3/3 (100%)

Expected results (hold properties.query)

Session grouping:

  • default entry: 1/4 (25%)
  • optimized entry: 3/4 (75%)

Profile grouping:

  • default entry: 1/3 (33.33%)
  • optimized entry: 3/3 (100%)

Notes

  • Session boundaries are defined by session_id creation (30-minute inactivity timeout).
  • Optimized entry can increase conversions by anchoring to the best entry event.
  • Hold property constant is useful for intent-specific funnels (search query, product ID, campaign ID).