
It was 2023 when we first sat down with a UK music label facing a common but frustrating problem. Every month, they received royalty reports from their distributors - ADA (Warner), The Orchard (Sony), Merlin, FUGA, Bandcamp, and a dozen others. Each report contained the same basic information: how many times their artists' songs were streamed, and how much money they earned.
Simple, right?
Not quite.
ADA sent Excel files with columns named "Release Artist", "Release Title", and "Net Payable". Merlin called them "Artist name", "Track name", and "Payable". The Orchard went with "Artist Name", "Track Name", and "Label Share Net Receipts".
Same data. Different languages.
And that was just the beginning.
Consider how different distributors format dates:
| Distributor | Date Format | Example |
|---|---|---|
| ADA | Excel serial number | 45292 |
| ADA (variant) | YYYYMM integer | 202501 |
| The Orchard | "YYYYMNN" | "2025M01" |
| Merlin | Hidden in metadata cells | Row 1, Column B |
| Qello | Embedded in filename | Qello_20250101_20250331.xlsx |
| Believe | ISO date string | "2025-01-15" |
One distributor. Four date formats. And we had 20+ distributors to support.
Some distributors report in USD. Others in EUR, GBP, or the original local currency. Some files contain mixed currencies. Some hardcode "USD" even when the actual currency varies by territory.
"UNITED STATES" vs "USA" vs "US" vs "United States of America". All the same country. All different strings that need to be normalized.
"Sony Music" vs "SONY" vs "Sony Music Entertainment" vs "SME". Same label. Four different spellings across different platforms.
We needed a system that could:
At its core, the system uses the Adapter Pattern - a universal base class that handles all common operations, with specialized adapters for each distributor that define only what's different:
This approach means adding a new distributor typically takes just 2-3 hours of work.
We currently support 25+ adapters covering the major music distribution ecosystem:
| Distributor | Parent Company | Adapter Variants |
|---|---|---|
| ADA | Warner Music | 5 adapters (Standard, V2, V2Fix, XLS, Custom) |
| The Orchard | Sony Music | 2 adapters (Standard, Legacy) |
| Merlin | Independent | 2 adapters (Standard, Historical) |
| FUGA | Downtown Music | 1 adapter |
| Believe | Independent | 2 adapters (Standard, Legacy) |
| TuneCore | Believe | 1 adapter |
| DistroKid | Independent | 1 adapter |
| CD Baby | Downtown Music | 1 adapter |
| Platform | Type | Notes |
|---|---|---|
| Bandcamp | Direct-to-fan | Custom CSV format |
| Qello | Concert streaming | Date embedded in filename |
| Soundcloud | Streaming | Multiple report types |
| YouTube Music | Streaming | Content ID integration |
| TikTok | Social/UGC | Emerging format |
| Meta (Facebook/Instagram) | Social | Rights manager exports |
The system handles every file format encountered in the music distribution industry:
| Format | Extension | Use Case | Notes |
|---|---|---|---|
| CSV | .csv | Most common | UTF-8 and ISO-8859-1 encoding support |
| Excel | .xlsx | Standard Excel | openpyxl with read-only mode |
| Excel Binary | .xlsb | Large files | pyxlsb parser, common for 500K+ rows |
| Legacy Excel | .xls | Older systems | xlrd parser |
| TSV | .tsv | Some APIs | Tab-separated values |
Our production system currently manages:
| Operation | Performance |
|---|---|
| Single file import (500K rows) | 2-3 minutes |
| Report generation | 5-15 seconds |
| Full-text search across catalog | Sub-second |
| Dashboard aggregations | Real-time |
The ability to generate complex royalty reports across 200 million records in just a few seconds is what sets the system apart. This is achieved through:
After analyzing dozens of distributor formats, we defined a universal schema that captures all essential royalty data:
ADA (Warner's distribution arm) required 5 different adapters due to format inconsistencies:
We maintain mapping databases to normalize inconsistent naming:
Every file goes through automatic format detection and encoding fallback - because "just UTF-8" is never the reality in international music data.
After 18 months of development:
We're exploring:
Have a similar project in mind? We'd love to hear about it.
Get in touch to discuss how we can help bring your vision to life.
Roofing Wholesalers Website - Platform for the Biggest Network of Roofing Wholesalers in Poland
How we built a platform in Sanity for 4D Grupa, the most extensive network of roofing wholesalers in Poland. A case study on developing a scalable headless CMS platform with TypeScript and Gridsome for the construction industry.
HR Platform Development - Talent-Alpha Frontend Platform Development
How we provided an HR startup with frontend developers to augment their in-house team, working on projects based on Angular and React.js frameworks. A case study on IT staff augmentation and team extension.