All case studies Mobile · Media · Gamification

Radio Polis 99.4

Turning a local FM station into a measurable digital product.

Category
Mobile · Media · Gamification
Platforms
iOS, Android, Web, Admin dashboard
Station
Radio Polis 99.4, Larissa

The problem

Radio Polis 99.4 broadcasts from Larissa and is genuinely loved in its city — but like most regional stations, everything it knew about its audience stopped at the transmitter. There was a stream, and there was silence. No idea who listened, when, for how long, or from where. No way to reach listeners between songs. No reason for anyone to choose the station's own channel over a generic aggregator.

The brief was not "build an app". It was: give the station a direct relationship with its listeners, and give it numbers it can actually act on.

01 — The app

Listening, and a reason to keep listening

A listening app for iOS and Android with background audio, lock-screen controls and live metadata.

On top of it, a gamified loyalty layer. Listening earns points continuously — 10 points every 30 minutes, capped at 40 a day, not a reward withheld until some arbitrary threshold. Points unlock real rewards from local businesses: a coffee, fuel, theatre tickets, dinner, redeemed with a coupon in the app. A monthly leaderboard turns listening into a light, public competition.

The gamification is not decoration. It answers the only question that matters for a local station: why would someone choose your stream over the hundred others on their phone?

Radio Polis mobile player showing the live track, artist and current show with a listen button
The player: live track and show metadata, background audio and lock-screen controls — the station in the pocket, not a browser tab that dies when the screen locks.
Station screen with tabs for the station, the schedule and top tracks, showing who is currently on air
The station tab: who is on air now, the weekly schedule, and the tracks the station plays most.
Polis Club screen explaining points, app-only contests and the monthly leaderboard
Polis Club. The account is free and optional — listening itself never requires one.
Explainer screen showing the points earn rate of 10 points per 30 minutes and a 40 point daily cap
10 points per 30 minutes, capped at 40 a day. The cap is deliberate: it rewards listening, not leaving a phone streaming into an empty room.
Rewards catalogue listing local business rewards with their point costs and availability
The rewards catalogue — real offers from local businesses, priced in points, with stock shown and sold-out states honest.
Reward detail screen showing point cost, remaining coupons and coupon validity before redeeming
Before redeeming: what it costs, how many are left, how long the coupon stays valid.
Contest list showing giveaways with closing dates and app-only or open-to-all badges
Contests, each labelled app-only or open to all, with the closing date on the card.
Contest detail screen showing organiser, draw date, entry deadline and the rules of entry
Every giveaway states its organiser, draw date and terms up front — one entry per account, no points required, winner notified in the app.
Account screen with a pseudonym field, a leaderboard opt-in toggle and an account deletion option
Privacy by design, made visible: a pseudonym instead of a real name, the leaderboard opt-in, and account deletion that actually removes the data.
02 — The dashboard

Numbers the station can act on

For the first time the station can see who is listening, from where, for how long, and which show holds them.

Live listeners come from the stream's own API — the authoritative count, including people on smart speakers, aggregators or a bare stream URL. A heartbeat measurement sits underneath it and answers the question the stream cannot: app versus web. Listening time counts only the seconds where audio genuinely played.

Geography lands on a map — country and city of every current listener. Day-by-hour heatmaps show when people listen and when they start. Push campaigns are measured through to attributed listening, and the same dashboard runs the contests, the rewards catalogue, the schedule and a pipeline that publishes one article to several WordPress sites at once.

Admin dashboard overview with live listener count, listening hours, sessions and a geographic map
Overview: live listeners split by app, web and unknown — plus country and city of every current listener, from the stream’s own API.
Day-by-hour heatmaps for listening hours and session starts
Two heatmaps, deliberately. "Many short sessions" and "one long one" produce the same total and mean completely different things about an audience.
Push notification composer in the admin dashboard
Campaigns are measured end to end: targeted, delivered to the OS, opened — and whether the open led to actual listening inside an attribution window.
Contest management screen listing giveaways with entry steps and draw controls
Contests with verifiable steps — follow, share, listen during a show. Each step is tracked and attributed, so the draw runs on people who actually participated.
03 — Reach

The audience does the marketing

The listener taps once and gets a branded 1080×1920 card with the current track, generated on the device in about a second, handed straight to the Instagram composer.

Every share carries a link back to the station. Organic reach, produced by the audience itself, at no media cost.

Four variants cover what actually comes off a live stream: cover art, no cover art, a title too long for one line, and nothing playing at all.

Instagram story card with album artwork and the currently playing track
With cover art.
Instagram story card rendering a long track title across multiple lines
Long titles wrap rather than truncate.
Instagram story card falling back to the station logo when no cover art is available
No cover art — falls back to the station mark.
Instagram story card showing the station identity instead of a track
Station identity, when nothing is playing.

Why it matters for a radio station

FM has no feedback loop. A station broadcasts and hopes. This turns a one-way signal into a product with a measurable audience: the programme director can see which shows hold people and which lose them by the half hour; the commercial team can show a sponsor real listening hours and real geography; and the station owns the relationship with its audience instead of renting it from an aggregator.

  • Live, per-source listener counts where previously there was no number at all
  • Geographic reach made visible for the first time — the audience extends well beyond the broadcast radius
  • A direct push channel to every installed device, with measured opens and attributed listening
  • Local businesses integrated as reward partners, turning audience attention into a tangible local economy
  • Shareable, branded Stories that put the station in listeners' social feeds at no media cost
Technical notes

How it is built

Expo / React NativeSpring Boot 4Java 25PostgreSQL 18KeycloakNuxt 4Containerised deploymentWordPress multi-site publishing

A single React Native codebase ships both platforms. Deployment is containerised with database migrations and an automated test suite. Privacy by design throughout — anonymous device identifiers, no fingerprinting, and no personal data in analytics or exports. Every figure on the dashboard is labelled with its source and its method, so the station knows which numbers are measured and which are estimated.

Working on something similar?

Tell us what you're building. We'll tell you if it sounds like our kind of problem.