Telecom
Telz: internationaal bellen met de prijs vooraf
Sinds 2023 zijn we het Android-team achter Telz, een app om voordelig internationaal te bellen. We maakten van een opensource SIP-client een betalend product met prijzen vooraf en opwaarderingen.
Projectfeiten
- Klant
- Telz (Nettia, Finland)
- Jaar
- 2026
- Doorlooptijd
- Sinds 2023, lopend
- Platformen
- Android
- Stack
- Kotlin, VoIP / SIP, Compose
- 3+ jaar Doorlopende samenwerking — Functies, platformupdates en support sinds 2023
- 54 Releases in de changelog — Opgeleverd met de interne lead van de klant, 2023 tot 2026
- 36 Locales — Waaronder Arabisch, Hebreeuws en Perzisch, van rechts naar links
Wat het verschil maakte
- Tarief per minuut en soort gesprek zichtbaar vóór elk internationaal gesprek
- Linphone-fork laag per laag overgezet naar Hilt, MVI view models en Compose
- UI-tests op echte Kobiton-toestellen en vertaalcontroles voor 36 locales
Telz verkoopt sinds 2012 internationale gesprekken. De Android-app begon als fork van Linphone, de opensource SIP-client: een betrouwbare belmotor in een interface die gemaakt was voor een generieke softphone, niet voor iemand die familie in een ander land belt. Sinds 2023 werkt ons team aan de app samen met de interne lead van de klant. We leveren functies op, houden de app bij met elke Android-release en brengen de codebase naar modern Kotlin zonder de roadmap stil te leggen.
De opdracht in één zin: maak van een generieke softphone een belproduct waarvoor mensen betalen, blijf releasen en laat de beproefde SIP-kern met rust.
Waar we begonnen
De Linphone-basis gaf Telz betrouwbare VoIP, maar alles rond het gesprek was generiek. De eerste minuten in de app zeiden weinig over prijs, privacy of hoe opwaarderen werkt. De code mengde verschillende generaties Android-patronen, waardoor zelfs kleine wijzigingen langer duurden dan nodig.
Wat we bouwden
De prijs vóór het gesprek
Als een gebruiker op een contact tikt, koppelt Telz het nummer aan een land en toont het de opties: een internetgesprek via wifi of mobiele data, of een terugbelgesprek waarbij Telz beide personen belt. Elke optie toont haar tarief per minuut, en we voegden een regel toe die zegt hoeveel minuten het huidige saldo dekt. De keuze kost een seconde, en de factuur bevat geen verrassingen.
Een onboarding die de eerste vragen beantwoordt
De nieuwe onboarding is geschreven in Jetpack Compose. Drie korte schermen behandelen wat een nieuwe gebruiker wil weten: geen registratie buiten een telefoonnummer, opwaarderen in elke munt, en gespreksopnames die op het toestel blijven. Een tarievenoverzicht met een valutakeuze is één tik verwijderd, en vóór het aanmelden verschijnt een korte privacymelding.
Betalingen en groei
We maakten de aankoopflow van Google Play robuust tegen mislukte productladingen en lege catalogi, bouwden betalingsinstellingen met automatisch opwaarderen en voegden een bonus toe voor wie een vriend uitnodigt, met promocodes. Installatiereferrers en gevalideerde aankopen gaan naar AppsFlyer, zodat marketing ziet welke kanalen betalende gebruikers opleveren.
Bijblijven met Android
Elke Android-release raakt iets waar een bel-app op steunt. We zetten de app over naar edge-to-edge-lay-outs voor Android 15, maakten ze klaar voor geheugenpagina's van 16 KB, verplaatsten het Linphone-werk naar een eigen core-thread, voegden native in-app-updates en een netwerkobserver toe, en werkten crash- en ANR-rapporten één voor één af.
Moderniseren zonder herschrijven
Een volledige herschrijving had de roadmap maandenlang bevroren. We vervingen de fundamenten laag per laag, zodat elke release nog productwerk bevatte.
| Onderdeel | Wat we deden | Waarom het ertoe doet |
|---|---|---|
| Dependency injection | Hilt in de hele app en de Linphone-integratie | Eén plek voor singletons, testbare componenten |
| Presentatie | View models in MVI-stijl met state, events en eenmalige effects | Voorspelbare schermen, geen verloren navigatie-events |
| Nieuwe UI | Jetpack Compose binnen de bestaande fragmentnavigatie | Nieuwe schermen komen er zonder de oude aan te raken |
| Netwerk | Coroutines en een getypeerde result-wrapper, oude RxJava-calls behouden | Endpoints migreren één voor één |
| Telefoonnummers | Eigen landkiezer en validator op basis van libphonenumber | Correcte E.164-nummers betekenen correcte tarieven |
| Kwaliteit | Robot Framework- en Appium-tests op echte Kobiton-toestellen via GitHub Actions | Regressies duiken op echte hardware op vóór de release |
Eén app, 36 locales
Telz-gebruikers bellen over de grenzen heen, dus de interface spreekt hun talen, waaronder Arabisch, Hebreeuws en Perzisch, die van rechts naar links lezen. Een vertaalcontrole signaleert ontbrekende en inconsistente teksten voordat een release de deur uitgaat.
Wat de klant vandaag heeft
- Een belflow waarin de prijs en het soort gesprek duidelijk zijn vóór de eerste beltoon
- Een codebase waarin nieuwe schermen in Compose worden gebouwd op een consistente architectuur
- Releases die de wijzigingen aan het Android-platform volgen in plaats van erachter aan te hollen
- Een geautomatiseerde regressiesuite die op echte toestellen draait
Heb je een Android-product op een opensource kern dat moet uitgroeien tot iets waarvoor klanten betalen? We bekijken het graag samen met je.