Skip to content

Forms & Funnels — Analytics

The Analytics tab gives you everything you need to measure a funnel's performance: top-line KPIs with period-over-period trend, a step-by-step drop-off chart with A/B-aware aggregation, a channel-performance table with drilldown, a Channel × Step drop-off heatmap, time-series, and CSV export on every chart that has tabular data.

This page walks through each visualization, what it tells you, and how to interpret edge cases.

Where the tab lives

Open Pages → Forms & Funnels → Analytics. Pick the funnel from the top-right dropdown, set the date range, and click Refresh to reload. The whole tab loads in parallel — KPI strip, drop-off, branches, channel performance, heatmap, time series, A/B tests are independent queries and don't block each other.

Analytics-Tab with KPI strip and Drop-off card

The date range applies to everything on the tab. Default is the last 30 days. The previous-period comparison (see KPI strip) automatically shifts to the same span before the chosen from date.

1. KPI strip — top-line trend

Four tiles at the top: Sessions, Completed, Conversion rate, Abandoned. Each tile shows the absolute value plus a delta pill versus the previous period of equal length.

Four KPI tiles with green/red delta pills

The delta pills speak two languages:

  • Counts (Sessions, Completed, Abandoned) → relative percent (+25%, −12%). For Abandoned, down is good — the pill turns green on a decrease, red on an increase.
  • Conversion rate → percentage points (+12.55pp, −3.2pp). Reads as the absolute gap between the two rates.

pp vs %

pp means percentage points — the absolute difference between two percentages. A CR moving from 12.45% to 25% means +12.55 pp. If we instead wrote +100% (relative change), that would be a different statement. Marketing tools (GA4, HubSpot, Matomo) all use the same convention.

If a metric was 0 in the previous period and is non-zero now, the pill reads new instead of an unbounded percentage.

The previous-period range is shown as a small subtitle (vs. 2026-03-29 – 2026-04-27).

2. Drop-off chart — per step

The vertical stacked-bar chart shows every visible funnel step in flow order with three colors:

  • Greencompleted. User left the step toward the next step (or finished the funnel on the last step).
  • Yellowabandoned. User dropped out exactly here (status abandoned).
  • Bluein progress. User is still on this step (status in_progress, session still active).

The drop-off percentage between step N and N+1 is shown to the right of step N+1 as a small ↘ XX.X% annotation — only when drop-off > 0.

Drop-off chart with stacked bars and drop-off annotation

A/B splits get their own block

If the funnel contains an ab_split node, it does not appear as a single step in the staircase. Instead, the UI renders a pink A/B block container between the pre-block step and the post-block step:

  • At the top, an aggregate row "Total (all variants)" — sum of entered, completed, abandoned, in_progress across all variants.
  • Below, per variant, a separate mini-staircase with its own sample size (= sessions_entered of that variant).
  • For each variant step, the drop-off relative to the previous variant step.
Drop-off chart with A/B block container and variant staircases

Click the block header

The block header (variant name + experiment ID) is clickable and scrolls to the A/B Tests card further down — there you see the statistical evaluation with Pearson chi-square + Bonferroni-corrected significance.

What does "in progress" mean?

A session counts as "in progress" at step N when it is stuck exactly there — status in_progress, session still active, the path ends on this step. If the path is longer and ends on a later or hidden node (ab_split, variant step), step N is counted as completed (= moved on). This way, the pre-A/B step does not show all sessions as "in progress" that are still inside the A/B block — they have moved on and are aggregated separately inside the A/B block.

3. Branch performance — branches

Table per condition node with the possible branches. Columns: condition name, branch label, sessions, share, optionally conversion rate (= % of sessions that completed the funnel through this branch).

Use case: "Which path of my lead qualification converts better?" — if the country == DE branch has 30% CR and the default branch only 8%, German visitors are more valuable.

4. Channel performance — marketing channels

If UTM parameters are attached to your funnel URLs (?utm_source=google&utm_medium=cpc), the plugin aggregates submissions per channel. The channel card has three layers:

KPI tiles at the top

Top source, Top campaign, Best CR, Worst drop-off — instant insight in four lines.

Channel table

Default sort: sessions DESC. Columns:

ColumnWhat it shows
Channelsource / medium, depending on the Group-by selection
SessionsNumber of sessions for the channel in the time range
LeadsOf those, completed
CRConversion rate as percentage
Δ vs AvgPercentage points against the funnel average (green = better, red = worse)
TrendRelative session change vs. previous period + CR-Δ in pp
Worst StepStep with the highest drop-off in this channel
Trend (30d)30-day sparkline of daily sessions
Channel performance table with KPI tiles and trend column

Group-by and Min-Sessions

Above the table header are two selects: Group by (Source / Medium, Channel Group, Campaign) and Min sessions (1 / 5 / 10 / 30 / 100). Channels below the threshold roll into a combined Other row at the bottom of the table. For tests with few submissions, set Min sessions = 1.

Drilldown

Clicking a channel row expands the campaign breakdown as an indented sub-table. Clicking a campaign row expands Term + Content. Lazy-loaded — the server delivers the sub-rows only on first click.

Expanded channel drilldown with campaign breakdown

Channel grouping

The Group-by mode Channel Group maps UTM and Referer data to GA4-compliant buckets (Direct, Organic Search, Paid Search, Paid Social, Email, Referral, Organic Social, Display). Even if you do not set UTMs, this grouping captures many sessions — Direct and Organic Search are detected via Referer pattern.

5. Channel × Step drop-off heatmap

A matrix of top-N channels × funnel steps, each cell colored by drop-off rate (step N → step N+1):

  • Green: ≤ 10%
  • Light green: 10–30%
  • Orange: 30–50%
  • Red: > 50%
  • Grey: no sessions in this cell
Channel-by-step heatmap with color-coded drop-off rates

Use case: "At which step do which channels lose the funnel?". If Facebook traffic performs great at the top of the funnel but drops 67% at step 4 (phone-number question), the ad is mis-framed or the phone step needs to be optional — a clear action trigger for ad optimization.

A/B column

ab_split nodes appear as their own column with a pink accent and a shuffle icon. sessions_reached for this column = sum of all variant sessions; drop-off = 1 − reached_post / reached_ab (how many users leave the block without reaching the post-block step).

The heatmap is collapsed by default — clicking Channel × Step Drop-off Heatmap below the channel table opens it.

6. Time series — history

Three-line chart per day: Starts (all submissions), Completed, Abandoned. Hover shows date + values.

Time-series chart Starts, Completed, Abandoned per day

Use case: anomaly detection. If starts drop by 50% on Wednesday, you see it here immediately.

7. A/B Tests card

Per ab_split node in the funnel, its own sub-card with:

  • Variant table: sessions_entered, sessions_completed, conversion rate, Δ-to-control variant, p-value (Pearson chi-square with Bonferroni correction for more than 2 variants), sample-size confidence marker.
  • Recommendation banner: from n ≥ 100 per variant and p < 0.05, the plugin marks the winner green.

Only appears for funnels with at least one ab_split node and at least one submission per variant.

8. CSV export

Three cards have a small CSV button:

  • Channel performance — all visible channel rows including trend columns and worst step.
  • History (time series) — date, starts, completed, abandoned per day.
  • Drop-off — steps + A/B block aggregate + variants flattened, with a Range filter column.
CSV export buttons in the analytics cards

Encoding: UTF-8 with BOM, CRLF, RFC-4180 quoting — opens directly in Excel with correct umlauts.

Filename pattern: funnel-{ID}-{type}-{from}-{to}.csv (e.g. funnel-12-channels-2026-04-01-2026-04-30.csv).

Data consistency and edge cases

Ephemeral mode (save_abandoned = false)

The default is GDPR-compliant: abandoned submissions are hard-deleted after abandon_after_min (cron process_abandoned.php). Before they go, the worker writes an anonymous aggregate entry per node + channel — from this the dashboard reconstructs drop-off, channel performance, and heatmap. The KPI tiles show the sessions plus the anonymous drop-outs.

Sessions discrepancy before Migration 017

Before Migration 017, the channel aggregate had no date column. Channel reports pulled lifetime counts into every from/to window — for a 6-month-old funnel with a high abandonment share, the reports therefore knew more sessions than the drop-off chart for the same filter range. After Migration 017 the table is daily-granular and all reports match period-by-period. Historical counts were reset on the migration run — fresh data flows in cleanly.

Cache

The backend caches every analytics response in APCu with a generation counter per funnel. Every new submission and every status update increments the counter → the cache key changes → fresh data on the next reload. To see how a just-created test submission lands in the dashboard, simply click Refresh in the topbar.

Channel trend limitation

From Migration 017 onward, channel trends use both live and ephemeral data. Previous-period counts are loaded either from formfunnel_submissions (live) or from formfunnel_channel_node_stats (anonymous). Trends are therefore honest even in ephemeral mode with a high hard-delete share.

Frequently asked

Why do I see "new" instead of a percentage? The channel had 0 sessions in the previous period. A relative change ((new − 0) / 0) is undefined. The UI then shows new as a pill — the channel is brand new.

My drop-off shows 0% on a step, but sessions are being lost. If all sessions in the filter range completed the funnel, there are no drop-offs between the steps — that is semantically correct. You see drop-off > 0 only when sessions get stuck (in_progress) or abandon inside a block.

A variant has no sessions in the heatmap. Variant steps are deliberately filtered out of the heatmap X-axis, otherwise they would appear as separate flow stages. Variant drop-off is visible in the drop-off chart inside the A/B block container, not in the heatmap.

Can I filter the heatmap by Channel Group or Campaign? Not in V1. The heatmap X-axis is source / medium. The channel-performance table has the Group-by switch.

The trend column shows a big jump — is that real? For small sample sizes (< 30 sessions), trends are statistically volatile. The table row then shows a Limited Data marker. Set Min sessions to 30+ if you only want reliable trends.

See also