Distributor statements are at least predictable — each vendor has one layout. Publishing income is the opposite: every publisher, admin and sub-publisher exports its own shape, at work level rather than recording level, split by right type and routed through collecting societies. This tool normalizes those CSVs into the same earnings tape as everything else you drop in.
Drop your publisher or admin CSV alongside your ASCAP, MLC and distributor files — one run, one normalized dataset, one workbook.
Drop your publisher CSV here — freeA publishing statement's natural row is a musical work earning under a right type — PR (performing), MR (mechanical), SR (synchronisation) — from a source society or licensee, often in the society's own currency. The same song can appear a dozen times per statement: PRS performing income, MLC mechanicals passed through, a sync fee, each with its own period lag. Header vocabularies differ per company; there is no common spec the way ASCAP publishes one.
First, a dedicated publisher-format parser recognises the recurring shape of admin and publisher exports — columns carrying a work title, a right type, an amount and a currency, plus the usual companions (source society, territory, period, your share). Statements matching that shape are parsed with full confidence and normalized field by field.
Second, for layouts nobody has catalogued, a generic header-vocabulary mapper reads the header row and maps columns by meaning — title-ish, amount-ish, date-ish, currency-ish. Its output is explicitly labelled generic, and the mapping note shows exactly which header it took for which meaning, so you check its guesswork before trusting the numbers. Unreadable amounts are skipped and counted as warnings, never silently written as zero.
| Normalized field | Typical source headers |
|---|---|
| Work title | Work Title, Song Title, Composition, Title |
| Right type | Right Type, Income Type, Royalty Type — values like PR / MR / SR, Performance, Mechanical, Sync |
| Amount | Amount, Royalty, Net Amount, Payable, Your Share Amount |
| Currency | Currency, CCY, Curr — ISO codes kept as reported, never silently converted |
| Source | Society, Source, Licensee, Territory Society (PRS, GEMA, SACEM…) |
Source: BMI royalty information and a real BMI writer statement filed as a CRB exhibit — transcribed and checked against the engine's parser on 2026-08-16.
BMI is the notable gap in the CSV world: the statement of record is a PDF, and BMI publishes no file-format spec for the CSV export hiding behind the portal's "View CSV" button. The real PDF has a consistent anatomy: a header block on every page (affiliate name, account number, IP number, distribution date, US performance period, international accounting number); page-one summaries of current and year-to-date earnings; then detail sections per source — commercial radio, cable and local television, internet audio grouped by service and tier (SPOTIFY PREM, PANDORA PLUS…), other sources, and international performances grouped by country and society — each with per-source subtotals, bonus columns (hit song, standards, super usage) and section grand totals. A dedicated PDF parser for that layout is on the roadmap. Meanwhile, the portal's CSV export is close enough to the common publisher shape that the generic mapper often handles it.
SoundExchange pays the statutory digital-performance royalty for sound recordings (a neighbouring right — SR-side money, not publishing), delivered as a monthly "Detail CSV" from SoundExchange Direct with the period coded in the filename (AUG2022 style). It publishes no public spec of the detail-CSV columns, so a dedicated parser is on the roadmap pending verified real-world exports. Today, the generic mapper frequently maps its CSV cleanly — and shows you exactly how it mapped it.
Tested on two generations of an open-source publisher export (6-row fixture with deliberately corrupt cells; 200,000-row performance fixture) — both parse, and the corrupt rows surface as warnings rather than zeros. A 62-column Australian society statement (AMCOS mechanicals) was handled by the generic mapper, which correctly chose 'Royalty Payable' over the gross 'Amount' column.
Parsing runs in your browser — files are never uploaded. What the tie-out does and does not prove.
No — deliberately. Amounts are kept in the currency the statement reported, with the currency on every row. Silent FX conversion is how earnings tapes stop tying out to their source statements.
Publisher and admin exports pass through the two society statements the engine reads natively; both have their own column references:
Background reading: how to read a royalty statement — or go straight to the converter, which takes publisher CSVs alongside everything else.
Drop every publisher and period in one run: one normalized dataset, one six-sheet Excel earnings tape, every mapping decision written down. Free, in your browser.
Convert your statement now — free