The "listeners" figure on your Icecast status page is, in the words of the server's own documentation, the "number of currently active listener connections." Connections. Not people. Someone with the web player open on the office computer and the station on their phone at the same time counts twice.
I think most online radio audience reports out there add up things that don't add up: server connections, devices with the app installed, and users who opened the app this month. Each number has its own base. Mix the three and you get a nice big total that falls apart at the first sharp question from an advertiser. The honest report takes no more work than the inflated one.
What Icecast counts as a listener
Three fields get mixed up all the time.
listeners is how many connections are open right now. A snapshot.
listener_peak is the peak of concurrent connections on that mountpoint. It looks like the perfect number for your sales deck, with a catch: the docs say per-source stats only live as long as the current encoder connection. If the encoder drops and reconnects, the peak resets. A studio internet hiccup at 3 p.m. wipes out the morning show's peak.
listener_connections is a running counter since the server started. It goes up with every new connection, including the same listener coming back after lunch. It is not "unique listeners" by any stretch.
One more thing that trips up a lot of stations. Icecast counts per mountpoint. If you stream an /aac at 64 kbps for phones and an /mp3 at 128 kbps for the website, your audience is split across both, and your number is the sum. A dashboard that shows your station "twice" is often just showing the two mounts.
In practice: to keep history, read /status-json.xsl (available since version 2.4.0) every few minutes and log it to a file or spreadsheet. The Icecast team itself says not to scrape the HTML page, because it changes between versions without notice.
An app install is not a listener
On Google Play, the Play Console statistics page separates devices from users. Read the definitions before you copy any number into a report.
Installed base is the number of active devices with the app installed. "Active," for Google, means the device was turned on at least once in the last 30 days. Turned on, not that the app was opened. The old phone in a drawer with your station installed counts.
Device acquisitions count installs. A phone that gets reset or handed to someone else shows up as a new device.
The closest thing to "people who listened" is monthly active users (MAU): users who opened the app in a rolling 28-day period. There is a daily version too (DAU). Google also notes it adjusts these metrics to account for users who declined to share data.
On Apple's side, App Store Connect counts a session each time the app is used for at least two seconds, and an active device as one with at least one session in the period. But usage data comes only from users who opted in to share analytics with developers. Apple's number is a slice of your iPhone audience, not the whole. And "total downloads" includes redownloads.
Notice that even the time windows don't match. Google's MAU is 28 days; Icecast gives you right now and the peak since the last reconnect. Adding Play MAU to the Icecast peak is adding a month to a minute.
The Apple key that blocks your dashboard
For an outside dashboard to pull numbers from App Store Connect, someone at the station has to generate an API key. Per Apple's documentation, the path is Users and Access, Integrations tab, App Store Connect API. Generating a team key requires an Admin account.
And here is where almost everyone trips: the private key file (.p8) can be downloaded only once. Download it, store it somewhere safe along with the key ID. Lose it, and you generate a new one and revoke the old. Apple says to treat that file like a password.
Where your listeners are
Google Play lets you break stats down by country or region and export to CSV. Apple filters by territory. On the streaming side, Icecast lists the clients connected to each mountpoint through the admin listclients function, but turning that into a map takes extra work.
That's the kind of thing I wouldn't build by hand. RadioMetrics, from Virtues, shows unique listeners, sessions, average listening time, peak hours and a map of where listeners are. If you want a station page with its own player and stats, there's the station page on AppRadio.
The report I'd take to an advertiser
One page, three lines that never get added together:
- Streaming: peak concurrent connections by daypart, both mounts combined, with a note that a connection is not a person.
- Android app: monthly and daily active users from Play Console.
- iPhone app: active devices and sessions, noting that Apple only counts users who opted in.
Below that, the country or city where most of the audience is, and the peak hour. No "total listeners" at the top.
Some station owners will say advertisers want one number. They do. But a media buyer with twenty years in the business has seen plenty of padded spreadsheets. Three numbers with their bases spelled out earn more trust than a total you can't explain.