call-tracking
Un service qui remplace le numéro des professionnels par un numéro tracké, produit leurs statistiques d’appels et de SMS avec Iovox et ajoute un répondeur IA.
- Employeur
- Groupe La Centrale
- Rôle
- Contributeur, puis lead
- Période
- Stack
- TypeScript
- AWS Lambda
- Serverless Framework
- Step Functions
- DynamoDB
- DynamoDB Streams
- OpenSearch
- SQS
- SNS
- Kinesis
- Firehose
- SES
- CDK
- CloudFormation
- CodePipeline
Contexte et problème
Sur La Centrale, un acheteur qui veut joindre un professionnel l'appelle depuis son annonce. Le service remplace le numéro du professionnel par un numéro tracké, qui redirige vers son vrai numéro.
Le service téléphonique est fourni par Iovox. Il produit les statistiques d'appels et de SMS de 8 000 professionnels et ajoute un répondeur IA.
Mon rôle
J'ai rejoint le projet comme contributeur, puis j'en suis devenu le lead. J'ai mené la mise en place du traceur rotatif : chaque appel reçu par un professionnel remonte la référence de l'annonce concernée.
J'ai conçu les options du service avec Iovox, en échange direct avec leurs équipes. J'ai aussi écrit le SDK navigateur qui attribue un numéro à chaque visite, réglé la durée de vie des numéros et leur libération, et intégré le répondeur IA : cadrage avec le partenaire, puis enregistrement, retranscription et résumé dans l'historique des appels.
Architecture
L'architecture est serverless, sur AWS :
- Des Lambdas TypeScript, déployées avec Serverless Framework et orchestrées par Step Functions, reçoivent les événements d'appel d'Iovox.
- Les pools de numéros rotatifs sont gérés dans DynamoDB ; DynamoDB Streams propage leurs changements.
- Les événements d'appel, avec la référence de l'annonce, sont indexés dans OpenSearch.
- SQS, SNS, Kinesis et Firehose diffusent les événements jusqu'aux emails envoyés aux professionnels par SES.
- Une Lambda récupère les informations de la messagerie du répondeur IA.
L'infrastructure est décrite en partie en CDK (stockage, certificats, OpenSearch), en partie en CloudFormation legacy. CodePipeline déploie chaque branche d'environnement.
Décisions clés
Un traceur rotatif qui remonte la référence de l'annonce
- Contexte
Un acheteur appelle un professionnel depuis une annonce précise. Le numéro tracké compte les appels, mais un numéro attaché au seul professionnel ne dit pas de quelle annonce vient l'appel.
- Choix
Un traceur rotatif : les numéros trackés sont tirés de pools gérés dans DynamoDB. Chaque appel remonte des données de contexte, dont la référence de l'annonce concernée.
- Alternative écartée
L'option par défaut : un numéro tracké par professionnel, qui compte ses appels sans les relier à une annonce.
- Conséquence
Chaque appel reçu par un professionnel remonte la référence de l'annonce concernée, et les événements d'appel sont indexés avec elle dans OpenSearch.
Un SDK navigateur plutôt qu'un appel direct depuis chaque front
- Contexte
Pour relier un appel à une visite précise, chaque page d'annonce doit demander un numéro au moment de l'affichage, avec le contexte de la visite : site, type de page, appareil.
- Choix
Un SDK TypeScript publié sur npm centralise l'appel, la validation des entrées, la collecte du contexte (détection d'appareil et de bots comprise) et un timeout de 400 ms. Il est couvert par 43 tests unitaires.
- Alternative écartée
L'option par défaut : chaque front appelle l'endpoint lui-même et collecte le contexte à sa façon.
- Conséquence
Les règles vivent et sont testées à un seul endroit. Si l'attribution tarde, la page affiche quand même un numéro.
Concevoir les options avec Iovox, en direct
- Contexte
Les numéros trackés, la redirection, les statistiques d'appels et de SMS et le répondeur IA reposent sur le service téléphonique d'Iovox.
- Choix
Les options du service sont conçues avec Iovox, en échange direct entre leurs équipes et moi.
- Alternative écartée
L'option par défaut : intégrer l'offre du fournisseur telle quelle, sans la concevoir avec lui.
- Conséquence
Les options sont pensées avec le partenaire qui les fait tourner, au lieu d'être adaptées après coup à son offre.
Résultats
Le service est en production pour 8 000 professionnels. Chaque appel qu'ils reçoivent remonte la référence de l'annonce concernée. Chaque numéro d'un pool vit 30 minutes, et les pools inutilisés sont libérés pour arrêter leur facturation.
L'IA dans le produit
Le service ajoute un répondeur IA, fourni par Iovox. J'ai cadré son intégration avec le partenaire, puis ajouté l'enregistrement, la retranscription et le résumé IA de chaque message dans l'historique des appels, ses statistiques, et les notifications d'appels manqués.
Limites et ce que je ferais autrement
- Le service repose sur un partenaire : les numéros, la redirection et le répondeur dépendent du service téléphonique d'Iovox.
- L'infrastructure est mixte. Une partie est décrite en CDK, le reste en CloudFormation legacy : un changement d'infrastructure commence par savoir de quel côté il se trouve.