ANALYSIS ✦ Q1 2026
Billing Support: A Data-Grounded Analysis
Six months of Jira ticket data, cross-referenced with BigQuery invoice and subscription state. Every number sits on a query you can run.
The Billing PE team analyzed about 1,000 Salesforce cases from February 2026 and classified them into 9 categories. This analysis extends that work with six months of Jira ticket data (engineering escalations), BigQuery-grounded numbers for every claim, and a reconciliation between the two classification systems. Support cases (per their report) represent all customer contacts; Jira tickets represent the subset that escalated to engineering.
(1) Dunning cycle failures are stable at 7,000-9,000/month since Aug 2025 — down from 16,000+ in July. Face values are volatile (one large account can inject millions) but invoice count is the real signal, and it's holding. (2) Unpaid active subscriptions are surging — 960 new zero-payment subs in February alone, up from 100/mo in mid-2025. Entitlement drift is growing 12× faster than we're remediating it. (3) Their #1 category is invisible to engineering — domain registration payment failures (443 cases/mo per reference report) generate zero Jira tickets. Their #3 (container billing surprise, 340 cases/mo per reference report) isn't a system bug.
Every number below is sourced from BigQuery or the Jira digest pipeline. We distinguish between grounded claims (backed by a query) and asserted claims (taken from the reference report without independent verification).
| Status | Count | Face Value | Source Table |
|---|---|---|---|
| Paid | 59.77M | $536.9M | stripe_invoices |
| Draft | 638K | — | stripe_invoices |
| Void | 235K | $30.9B (pre-void) | stripe_invoices |
| Uncollectible | 225,781 | $1.03B face | stripe_invoices |
| Open | 14,788 | $6.2M | stripe_invoices |
Invoice universe as of March 20, 2026. The $1.03B uncollectible face value is nominal and misleading. Of that, $957M is subscription_cycle (93% of face value, 75% of invoice count — the real dunning failures), $69.6M is subscription_create/update (payment loop failures where invoices were never valid debt), and $6.4M is manual. The create/update invoices must be analyzed separately — they represent failed activations and upgrades, not collection failures.
| Metric | Count | Source |
|---|---|---|
| Total accounts | 45.8M | cloudflare_accounts |
| Flagged as bad debt | 73,602 | cloudflare_accounts |
| Inconsistent bad-debt state | 540 | inconsistent_bad_debt_accounts |
| Double-charged for bad debt | 1,277 ($34K extra) | duplicated_bad_debt_payments |
| Unpaid active subscriptions | about 3,000 cumulative | unpaid_active_subscriptions |
| Past-due subscriptions | 10,369 | stripe_subscriptions |
| Active subscriptions | 1,874,815 | stripe_subscriptions |
The reference report cites 92,895 CC accounts stuck in dunning. Our BQ shows 10,369 past_due subscriptions as of today. The discrepancy is likely definitional — they may count all accounts that have ever entered dunning, while we count subscriptions currently in past_due status. Their "18,870 stuck PayPal retry events" cites a table (pc_stuck_paypal) that does not exist in our BQ contexts. We cannot independently verify either figure.
Only subscription_cycle invoices — recurring renewals that failed collection and went uncollectible. This is the real dunning health metric. We exclude subscription_create and subscription_update invoices because those represent payment-loop failures (failed activations/upgrades), not collection failures on delivered services.
| Month | Cycle UC | Face Value | Avg/Invoice | Note |
|---|---|---|---|---|
| Jul 2025 | 16,781 | $1.94M | $116 | baseline (post-Jun spike) |
| Aug 2025 | 7,063 | $1.15M | $163 | normalized |
| Sep 2025 | 7,797 | $1.56M | $200 | |
| Oct 2025 | 7,178 | $6.85M | $954 | outlier invoice(s) |
| Nov 2025 | 8,955 | $1.58M | $177 | |
| Dec 2025 | 8,026 | $1.92M | $239 | |
| Jan 2026 | 7,824 | $1.53M | $196 | |
| Feb 2026 | 7,402 | $38.5M | $5,200 | massive outlier(s) |
| Mar 2026 (partial) | 4,223 | $4.81M | $1,139 |
The cycle invoice count holds steady at 7,000-9,000/month since August 2025. That's the real signal. The face values swing wildly because a single large-account renewal can inject millions (Feb 2026: $38.5M on 7,402 invoices). Use capped/prorated values for dollar comparisons, not raw face value. The failed-void pipeline now shows zero daily failures — a concrete win.
Subscription_create and subscription_update invoices that went uncollectible. These are NOT collection failures — they are payment-loop failures where someone tried to activate or upgrade, payment failed, and the invoice was marked uncollectible. The subscription may still be active (entitlement drift). These must be tracked separately from dunning.
| Month | Create | Update | Combined Value | Note |
|---|---|---|---|---|
| Jul 2025 | 420 | 546 | $279K | |
| Aug 2025 | 243 | 234 | $56K | |
| Sep 2025 | 314 | 284 | $113K | |
| Oct 2025 | 195 | 197 | $110K | |
| Nov 2025 | 517 | 624 | $710K | update spike |
| Dec 2025 | 363 | 708 | $5.42M | update outlier ($5.06M) |
| Jan 2026 | 719 | 734 | $588K | create volume growing |
| Feb 2026 | 386 | 676 | $441K | |
| Mar 2026 (partial) | 3 | 597 | $45K |
The subscription_create uncollectibles (719 in Jan, 386 in Feb) track the unpaid-active-subscription surge. These are the same population — someone activated a subscription, payment failed, the invoice went uncollectible, but the subscription stayed active. The Payment Loop workstream (Deferred Collection) is the fix.
Subscriptions active in Stripe that have never had a successful payment. The entitlement-drift population — services provisioned with no revenue collected.
| Month | New Unpaid Subs | Trend |
|---|---|---|
| Apr 2025 | 79 | baseline |
| May 2025 | 73 | — |
| Jun 2025 | 61 | — |
| Jul 2025 | 118 | ↑ 1.5× |
| Aug 2025 | 161 | ↑ 2× |
| Sep 2025 | 151 | — |
| Oct 2025 | 190 | ↑ 2.4× |
| Nov 2025 | 235 | ↑ 3× |
| Dec 2025 | 274 | ↑ 3.5× |
| Jan 2026 ⚠ | 661 | ⚠ 8.4× baseline |
| Feb 2026 ⚠ | 960 | ⚠ 12× baseline |
From 80/mo in mid-2025 to 960 in February 2026 — a 12× increase. These are real revenue leakage: services provisioned with no payment collected. The Payment Loop workstream (Deferred Collection) targets this root cause by requiring payment confirmation before entitlement grant. Without it, the backlog grows 900/month.
Drift measures disagreements between what Cloudflare's internal system (OPE) believes a customer has and what Stripe actually has. Each drifted item is a potential overcharge, undercharge, or phantom subscription.
Total accounts with at least one subscription item disagreement. Fluctuates 8,500–9,200 daily, with billing-cycle spikes to 12,000 on the 5th and 15th.
10,678 canceled usage items still in Stripe. 4,201 canceled fixed items. 2,341 missing usage items. 1,455 extra items. 1,482 quantity mismatches.
Accounts where the bad-debt flag in Cloudflare's database disagrees with the Stripe customer metadata. 541 have fully inconsistent flags across all stores.
The reference report uses 9 categories from manual classification of about 1,000 support cases. We use 11 categories from automated classification of 1,586 Jira tickets over 6 months (741 signal patterns, 96.3% rate). The systems measure different populations — support cases (per their report) are all customer contacts; Jira tickets are the subset that escalated to engineering. Both are valid. Neither is complete alone.
| Their Category (Reported) | Mo | Our Category (Jira Tickets) | 6mo | Notes |
|---|---|---|---|---|
| Domain reg payment failure | 443 | address-checkout | 11 | INVISIBLE TO ENG. Registrar has its own payment flow. 443 reported cases → 0 Jira tickets. |
| Container/D1 billing surprise | 340 | refund | 99 | NOT A SYSTEM BUG per their own analysis. Product/UX gap — no caps, no alerts. |
| Paid but still Free | 319 | entitlement-drift | 114 | Partial overlap. Their count includes cases resolved without Jira escalation. |
| Generic payment failure | 98 | payment-block | 295 | Our count higher — we capture all payment failures, not just 'generic'. |
| No Pay button + phantom balance | 86 | bad-debt | 138 | Strong overlap. Maps to 73,602 flagged accounts, 540 inconsistent. |
| Double charges | 76 | duplicate-charge | 94 | Direct mapping. 1,277 confirmed double-charged in BQ. |
| R2/Workers activation broken | 63 | provisioning | 50 | Partial overlap. We split payment failures into payment-block. |
| Can't cancel / ghost charges | 62 | subscription-lifecycle | 410 | Our largest category. 68/mo Jira tickets matches their 62/mo reported cases. |
| Annual/monthly double billing | 21 | sub-lifecycle + dup-charge | split | We split: lifecycle failure + financial impact. |
| — | — | invoice-remediation | 248 | MISSING FROM THEIR TAXONOMY. Voids, metadata corruption, stale states. |
| — | — | startup-ops | 58 | MISSING FROM THEIR TAXONOMY. Account setup, Stripe customer creation. |
Our Jira digest pipeline classifies every CUSTESC ticket (engineering escalation) using 741 signal patterns across 11 categories. Over 27 weeks, all categories show stable trends — no category is spiking or declining significantly.
| Category | 6mo Total | Weekly | Trend | Top Signals |
|---|---|---|---|---|
| subscription-lifecycle | 410 | 15 | stable | Can't cancel, ghost charges, stuck Processing |
| payment-block | 295 | 11 | stable | Card declined, PayPal fail, 3DS, preauth |
| invoice-remediation | 248 | 9 | stable | Voided invoices, metadata errors, stale states |
| bad-debt | 138 | 5 | stable | Phantom balance, blocked accounts, flag drift |
| entitlement-drift | 114 | 4 | stable | Paid but Free, missing features, plan mismatch |
| refund | 99 | 4 | stable | Usage shock, duplicate charge refund requests |
| duplicate-charge | 94 | 3 | stable | Double sub, retry idempotency, zone re-add |
| startup-ops | 58 | 2 | stable | Account creation, Stripe customer, PM link |
| provisioning | 50 | 2 | stable | R2 activation, Workers paid, preauth failures |
| product-enablement | 14 | <1 | stable | Feature access, plan feature mismatch |
| address-checkout | 11 | <1 | stable | Avalara/address validation, registrar checkout |
Voided-but-not-voided invoices, metadata corruption, stale uncollectible states. BQ shows 1,356 invoices with missing bad_debt metadata and 42,492 with amount overrides. Customers experience this as "my invoice is wrong" but support classifies it into whatever they complain about first.
The registrar payment flow is entirely outside subscriptions-api. Support resolves domain payment failures without engineering escalation. The single largest reported category generates almost no Jira signal.
The reference report counts this as a "system issue" but correctly notes it's a UX/product gap — no billing caps, no usage alerts, no sleep-after-idle. This belongs in the product roadmap, not the billing bug backlog.
The reference report makes several specific claims with BigQuery numbers. Here's our independent verification.
| Claim | Their Number | Our Number | Verdict |
|---|---|---|---|
| Accounts flagged bad debt | — | 73,602 | ✅ Grounded |
| Bad-debt cleanup accounts | 13,103 | — | ⚠ Unverifiable (table not in our BQ) |
| CC stuck in dunning | 92,895 | 10,369 past_due | ⚠ Definitional gap |
| Stuck PayPal retry events | 18,870 | — | ⚠ Unverifiable (no table) |
| PayPal bad debt 10× increase | $183K→$1.85M | — | ⚠ Unverifiable |
| Stale uncollectible invoices | 195,745 ($980M) | 154,175 ($973.5M) | ✅ Confirmed (close match) |
| Double-charged accounts | — | 1,277 ($34K extra) | ✅ Grounded |
| Uncollectible rate (current) | — | 0.72% (Mar 2026, all reasons) | ✅ Grounded (includes create/update) |
| Failed void pipeline | — | 0/day (resolved) | ✅ Grounded |
| Inconsistent bad-debt state | — | 540 accounts | ✅ Grounded |
Based on the combined support case and Jira analysis, grounded in BQ data, ranked by impact.
The single largest reported category with zero Jira visibility. Registrar has its own payment flows — no 3DS, no platform retry logic. Migrating to Unified Checkout eliminates the #1 reported case driver. Already planned. Don't slip.
Growing 12× since mid-2025. The Payment Loop workstream (Deferred Collection) requires payment confirmation before entitlement grant. Until this ships, the backlog grows 900/month and the "paid but still Free" population widens.
16,097 accounts have orphaned bad-debt flags. Auto-restore logic (SHIP-12738) would clear bad-debt after payment, preventing the "paid but still Free" class. Combined with drift remediation, this closes the phantom-balance problem.
Not an engineering fix. Default sleep-after-idle for containers, spend threshold alerts for D1, hard billing caps for PAYGO. Highest-impact support case reduction opportunity per the reference report.
Baseline is stable at 8,500–9,200. Billing-cycle spikes to 12,000 suggest drift is created during renewal processing. Focus on preventing new drift at the source rather than remediating after.
Support case data from the Billing PE team's February 2026 analysis (about 1,000 cases, 9 categories, manual classification). Jira ticket data from billing-knowledge digest pipeline (1,586 tickets, Sep 2025 – Mar 2026, 11 categories, 741 signal patterns, 96.3% auto-classification). BQ data queried March 20, 2026 from cf-billing-jh8o3p1.dataform. All amounts in USD.