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
- 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.
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.csvFigure 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.
Four-quarter blocks take out seasonality: 2022Q1 to 2022Q4 against 2025Q2 to 2026Q1. Computed with scripts/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.
| symbol | name | cik | quarter | period_start | period_end | revenue_usd | cost_of_revenue_usd | gross_profit_usd | gross_margin | in_balanced_panel |
|---|---|---|---|---|---|---|---|---|---|---|
| ADBE | ADOBE INC. | 796343 | 2026Q1 | 2025-11-29 | 2026-02-27 | 6398000000 | 664000000 | 5734000000 | 0.896218 | True |
| AI | C3.ai, Inc. | 1577526 | 2026Q14 | 2026-01-31 | 2026-04-30 | 51600000 | 40277000 | 11323000 | 0.219438 | True |
| CRM | Salesforce, Inc. | 1108524 | 2025Q41 | 2025-10-31 | 2026-01-31 | 11201000000 | 2508000000 | 8693000000 | 0.776091 | True |
| CXM | Sprinklr, Inc. | 1569345 | 2026Q1 | 2026-02-01 | 2026-04-30 | 219479000 | 76448000 | 143031000 | 0.651684 | True |
| DDOG | Datadog, Inc. | 1561550 | 2025Q42 | 2025-09-30 | 2025-12-31 | 953194000 | 186894000 | 766300000 | 0.803929 | True |
| DDOG | Datadog, Inc. | 1561550 | 2026Q1 | 2026-01-01 | 2026-03-31 | 1006426000 | 209228000 | 797198000 | 0.792108 | True |
| FIG | FIGMA, INC. | 1579878 | 2025Q43 | 2025-09-30 | 2025-12-31 | 303776000 | 54302000 | 249474000 | 0.821243 | False |
| SHOP | Shopify Inc. | 1594805 | 2026Q13 | 2026-01-01 | 2026-03-31 | 3170000000 | 1624000000 | 1546000000 | 0.487697 | False |
| SNOW | SNOWFLAKE INC. | 1640147 | 2026Q1 | 2026-02-01 | 2026-04-30 | 1390951000 | 464500000 | 926451000 | 0.666056 | True |
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.
- 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.
- 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.
- Decision 3
SEC’s own
framefield 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
GrossProfitwhere 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
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.
- 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 - 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, and215 kB Download
in_balanced_panel. - 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.
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.
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
- Also in German
- Bruttomargen-Panel
Elsewhere in the data
Contact
Bring the question you're working on.
Research, a guest lecture, or a commercial question.