← Research

Data packageVersion 2026-08Published 10 Aug 2026CC BY 4.0

Gross-margin panel: the data

901 firm-quarters of gross margin, computed from audited filings rather than from a survey or a vendor disclosure. The codebook states what the panel cannot show before anyone uses it, and the two diagnostics that were built and thrown away are published with the rest.

The package

Audited numbers, as filed.

Frame
64 constituents of the BVP Nasdaq Emerging Cloud Index, fixed 9 Aug 2026
Window
2022Q1–2026Q1, 17 quarters
Source
SEC EDGAR XBRL company facts
Folder
/data/gross-margin-2026-08/

53 balanced7 partial4 excluded

Counted from gross-margin-panel.csv and the codebook’s exclusions. None is silently dropped: every constituent is accounted for.
Firm-quarters, balanced
90153 firms across 17 quarters
Firms in the balanced panel
53of the 64 in the frame
Rows in the file
2,073quarters outside the window included
Licence
CC BY 4.0Reuse it, including to disagree with it.

What the filings show

Up 1.5 points from 2022, flat since mid-2024.

Two views of the 53-firm balanced panel, computed from the file on this page with the scripts beside it.

Figure 1Gross margin, 2022Q1 to 2026Q1

Revenue-weightedEqual-weightedMiddle half of firms

The revenue-weighted line is the one everyone quotes. The axis runs 60 to 85 rather than zero so that a 1.5-point move is visible at all; the compression the debate predicts would leave this band entirely.

60%65%70%75%80%85% 20222023202420252026 Eight quarters between 75.4 and 76.0 73.9 70.8 75.4 Revenue-weighted 72.6 Equal-weighted

Source: SEC EDGAR XBRL company facts; balanced panel of 53 constituents, 901 firm-quarters. The band is the 25th to 75th percentile of firm margins in each quarter.

gross-margin-panel.csv

Figure 2Change per firm, in points: the 2022 average against the latest four quarters

ImprovedDeclined

Forty of fifty-three improved, and the median firm gained 1.93 points (Wilcoxon signed-rank, p = 0.0002). Drop C3.ai, whose collapse is the largest single move in the panel, and the mean gain rises from 1.63 to 2.45 points.

−10−50+5+10 Median firm +1.93 13 declined 40 improved AI −41.0 CXM −7.1 DOCN −4.7 ZETA −3.5 NET −2.8 NOW −1.7 ZS −1.4 PAYC −1.2 ASAN −1.1 GTLB −1.1 BRZE −0.9 MDB −0.8 FROG −0.3 PATH +0.1 BL +0.2 PCOR +0.4 DDOG +0.6 DOCU +0.7 TENB +0.8 TEAM +0.8 DT +0.8 BILL +1.2 TWLO +1.3 HUBS +1.5 ADBE +1.7 CRWD +1.7 AGYS +1.9 SNOW +1.9 AVPT +2.3 PANW +2.4 FIVN +2.5 NCNO +3.0 SPSC +3.2 VEEV +3.3 WK +3.5 RNG +4.0 PD +4.0 QLYS +4.1 FRSH +4.2 IOT +4.3 ESTC +4.3 CRM +4.4 PLTR +5.1 PCTY +5.3 NTNX +6.4 OKTA +6.9 S +7.6 TOST +7.8 INTA +9.2 APPF +9.3 WEAV +9.9 QTWO +10.2 FSLY +10.9 C3.ai −41.0, off the scale Sprinklr −7.1 Fastly +10.9 Each mark is one firm, sorted from the steepest decline to the largest gain.

Four-quarter blocks take out seasonality: 2022Q1 to 2022Q4 against 2025Q2 to 2026Q1. Computed with scripts/analyse.py.

analyse.py

Margins rose through the efficiency correction, and have been flat since AI features started shipping in volume.

The panel

One row per firm-quarter, as filed.

Nine rows sampled from the file and shown exactly as they appear in it. The filed period sits beside the assigned quarter, so every assignment can be checked.

Sampled: 9 of 2,073 rows · gross-margin-panel.csv

The full file, 215 kB
Nine rows sampled from gross-margin-panel.csv
symbolnamecikquarterperiod_startperiod_endrevenue_usdcost_of_revenue_usdgross_profit_usdgross_marginin_balanced_panel
ADBEADOBE INC.7963432026Q12025-11-292026-02-27639800000066400000057340000000.896218True
AIC3.ai, Inc.15775262026Q142026-01-312026-04-305160000040277000113230000.219438True
CRMSalesforce, Inc.11085242025Q412025-10-312026-01-3111201000000250800000086930000000.776091True
CXMSprinklr, Inc.15693452026Q12026-02-012026-04-30219479000764480001430310000.651684True
DDOGDatadog, Inc.15615502025Q422025-09-302025-12-319531940001868940007663000000.803929True
DDOGDatadog, Inc.15615502026Q12026-01-012026-03-3110064260002092280007971980000.792108True
FIGFIGMA, INC.15798782025Q432025-09-302025-12-31303776000543020002494740000.821243False
SHOPShopify Inc.15948052026Q132026-01-012026-03-313170000000162400000015460000000.487697False
SNOWSNOWFLAKE INC.16401472026Q12026-02-012026-04-3013909510004645000009264510000.666056True

1CRM 2025Q4: the filed period runs 31 Oct 2025 to 31 Jan 2026. Its midpoint falls in December, so it is Q4; assigned by its end date it would land a full quarter late.

2DDOG 2025Q4: a fourth quarter is never filed. This row is the annual figure minus the three quarters inside it, and it reconciles to the 10-K by construction.

3FIG and SHOP listed or first filed with the SEC mid-window. They are in the file with in_balanced_panel = False and in no headline figure.

4C3.ai: 0.219 in 2026Q1 against 0.760 in 2022Q1, the largest single move in the panel.

What the panel is

Nothing here is a benchmark, a survey or an estimate.

Every figure is computed from SEC EDGAR XBRL company facts: the audited numbers as filed. Nothing here is a benchmark, a survey, a vendor disclosure or an estimate.

The frame is the 64 constituents of the BVP Nasdaq Emerging Cloud Index, read on 9 August 2026 and fixed. It is reused from the pricing-page corpus deliberately: it is the same population, already justified, already public, and, importantly, not conditioned on the outcome. It is an index of cloud companies, not a list of firms with AI features or with falling margins. A universe assembled by looking for margin compression would find it.

The window is 2022Q1–2026Q1, 17 quarters. 53 of the 64 have a complete run across it: 901 firm-quarters, balanced. Seven listed or first filed mid-window and carry in_balanced_panel = False. Four are excluded because no quarterly US-GAAP gross profit exists for them: three are Israeli-domiciled foreign private issuers that report gross profit annually or semi-annually, and Workday tags no cost-of-revenue element under any US-GAAP tag in the window. None is silently dropped.

Three decisions change the numbers.

  1. Decision 1

    The fourth quarter is derived, because it is never filed.

    A company files three 10-Qs and one 10-K. Q4 exists only as annual minus the three quarters inside it. Reading the API naively returns 13 or 14 quarters of a 17-quarter window and silently drops every Q4: the seasonally strongest one.

  2. Decision 2

    Quarters are assigned by period midpoint, not period end.

    Salesforce’s quarter runs 1 November to 31 January. Assigned by its end date it lands in the following calendar Q1, a full quarter late. Its midpoint is mid-December, so it is Q4. Sixteen of the 53 have off-calendar fiscal years.

  3. Decision 3

    SEC’s own frame field is not used.

    It is assigned sparsely, and least to exactly the off-calendar filers the midpoint rule exists for. Using it produced 7 quarters for Workday and 0 for Wix, which reads as an absent company rather than an absent method.

The codebook

Every field, and every constituent accounted for.

symbol, name, cik
The constituent, and its SEC identifier.
quarter
The calendar quarter containing the period midpoint.
period_start, period_end
The filed period, exactly as reported.
revenue_usd
The first available of RevenueFromContractWithCustomerExcludingAssessedTax, …IncludingAssessedTax, Revenues, SalesRevenueNet.
cost_of_revenue_usd
The first available of CostOfRevenue, CostOfGoodsAndServicesSold, CostOfServices, CostOfGoodsSold; where a filer reports only components (AppFolio), the components are summed.
gross_profit_usd
GrossProfit where filed, else revenue minus cost of revenue.
gross_margin
Gross profit divided by revenue.
in_balanced_panel
Whether the firm has all 17 quarters.

The 64, accounted for.

  • Balanced53

    Every quarter in the window: the panel every headline figure is computed on.

  • Partial7

    ALKT, FIG, KVYO, RBRK, SAIL, SHOP, TTAN

    Listed or first filed with the SEC mid-window. In the CSV with in_balanced_panel = False.

  • Excluded4

    CLBT, MNDY, WIX: Israeli-domiciled foreign private issuers. They file annually (20-F) under IFRS and report gross profit annually or semi-annually, never quarterly. There is no quarterly figure to include.

    WDAY: Workday files revenue under US-GAAP throughout the window but tags no cost-of-revenue element under any US-GAAP tag in it. Gross profit is not derivable without leaving the audited taxonomy.

What this data cannot do

Stated before anyone uses it.

  • Cost of revenue is one blended line. No filer breaks out inference. The panel can show what happened to the total; it cannot attribute any part of it to AI, and no arrangement of these columns will make it do so. Anyone, including this site, who claims to isolate an AI effect from these columns is inferring, not measuring.

  • The design detects a mean compression of about 2 percentage points. Simulated at the observed between-firm spread: 50% power at −2pp, 84% at −3pp, and 17% at −1pp. A null result here is not evidence that nothing under a point happened.

  • Eleven of the 64 constituents are not in the balanced panel: seven partial, four excluded. They are accounted for with that status, not counted as anything.

Power

The chance of detecting a mean compression of

50% 17% −1 point 50% −2 points 84% −3 points

Simulated at the observed between-firm spread. scripts/power-and-robustness.py

Two instruments, thrown away

A failed instrument is evidence too.

Both diagnostics were built, tested and kept rather than deleted. Neither is published as a recommendation: a test that cannot separate an economics change from a restatement, or that cannot see a real effect, is not a test.

  1. Published as a failure

    A levels regression of log cost on log revenue.

    The naive “elasticity above 1” reading fires about 50% of the time on random data, and the significance-tested version fires 98.9% of the time on a pure accounting reclassification with no change in cost structure at all. scripts/diagnostic-v1-failed.py

  2. Published as a failure

    The first-difference rebuild.

    It survives the reclassification (3.9%) and then detects a genuine 30% variable-cost shift only 3.8% of the time: below its own false-positive rate. Robust and blind. scripts/diagnostic-v2-failed.py

Files

Seven files, nothing to sign up for.

Text and CSV throughout. Nothing here needs an account or a tool to open.

  • codebook.mdThe frame, the window, the exclusions with their actual reasons, every field definition, and the limitations: stated before anyone uses the data rather than after.
    6 kB Download
  • gross-margin-panel.csvThe panel itself. One row per firm-quarter, with the filed period exactly as reported, the revenue and cost tags actually used, and in_balanced_panel.
    215 kB Download
  • scripts/build-panel.pyFetches the company facts and builds the panel: the Q4 derivation, the midpoint assignment and the tag fallbacks are all here. Needs a SEC User-Agent naming a contact address.
    7 kB Download
  • scripts/analyse.pyThe headline series.
    5 kB Download
  • scripts/power-and-robustness.pyThe power computation. Simulated at the observed between-firm spread: this is what produces the numbers in the limitations above.
    5 kB Download
  • scripts/diagnostic-v1-failed.pyPublished as a failureA levels regression of log cost on log revenue.
    5 kB Download
  • scripts/diagnostic-v2-failed.pyPublished as a failureThe first-difference rebuild. Robust and blind.
    6 kB Download

Reproducing it

No scraping, no vendor data, no login.

The SEC API is free, unauthenticated and rate-limited to 10 requests per second; it requires a User-Agent naming a contact address.

Three commands, in order
python3 scripts/build-panel.py      # fetch + panel
python3 scripts/analyse.py          # the headline series
python3 scripts/power-and-robustness.py

Where a filer restated, the latest filed value wins. Rows with a computed margin outside (0,1) are dropped as a tagging error rather than carried.

Licence and citation

Reuse it, including to disagree with it.

Cite the data

Isoglu, S. (2026). Quarterly gross margin from audited filings, 2022Q1–2026Q1. isoglu.com.

CC BY 4.0

Released under CC BY 4.0.

Package
gross-margin-2026-08
Published
10 Aug 2026
Codebook
10 August 2026
Frame shared with
Pricing-page corpus