Intégration et fiabilité
Des flux compréhensibles par ceux qui en dépendent.
Au départ…
CRM et ERP décrivent le même métier différemment. Lorsque la connexion repose sur un script opaque, un échec de synchronisation devient vite un appel à son auteur.
Ce que nous avons construit
Un poste de contrôle Airtable pour le moteur de synchronisation. Les équipes suivent les traitements et leur historique ; les développeurs examinent les correspondances de champs. Tous utilisent la même configuration.
Technologies et documentations officielles
Entrez dans l’outil
Écran 1 sur 6Vue métier
Les noms lisibles expliquent source, destination et politique d’écriture.
Ce que nous voulons changer
Aider les équipes à comprendre les échanges, diagnostiquer un échec et adapter les horaires configurés sans redéployer le moteur.
Comment c’est construitModèle de données, code, contrôles et autonomie des équipes
Parcours utilisateur
- 01
Définir le job et son mapping dans le référentiel partagé.
- 02
Demander ou planifier l’exécution via une automatisation Airtable et le moteur externe.
- 03
Examiner l’exécution, ses métriques et erreurs avant de décider d’une relance.
Structure de la base
| Entité / table | Champs clés | Relations |
|---|---|---|
| Sync Jobs | Mapping JSON · cadence · état actif · demande manuelle | Un job → plusieurs exécutions |
| Sync Runs | Statut · lus / écrits / ignorés · diagnostic | Chaque exécution est reliée à son job |
| Sync Types | Références de sources et de configuration | Des définitions communes classent les jobs |
| Promotions | Clés de correspondance · champs de destination | Une destination commune pour le reporting |
Implémentation technique
- Un pont TypeScript exécute le moteur Python sur Trigger.dev. Adaptateurs, validation du mapping et écriture ont des responsabilités distinctes.
- Le writer REST résout les identifiants de champs, groupe les écritures par dix et limite leur cadence.
- Le mode aperçu/journal seul et les compteurs lus, écrits, ignorés et en erreur rendent une exécution examinable.
Décision d’ingénierie
Recalculer la série entière, écrire seulement les écarts
Adapté du moteur de séries hebdomadaires. Le recalcul complet corrige aussi le passé ; le diff évite de réécrire les valeurs identiques. Une série absente reste intacte, une série explicitement vide remet les comptes à zéro, et le mode simulation est activé par défaut. Ce n’est ni une transaction distribuée ni un verrou concurrent.
def plan_updates(series_by_record, existing, field_maps): updates = [] for record_id, series in series_by_record.items(): desired = {} for metric, week_fields in field_maps.items(): values = series.get(metric) if values is None: continue # unavailable source: preserve this metric for week, field_id in week_fields.items(): desired[field_id] = int(values.get(week, 0)) current = existing.get(record_id, {}) changed = { field: value for field, value in desired.items() if int(current.get(field) or 0) != value } if changed: updates.append({"id": record_id, "fields": changed}) return updatesdef sync_series(series, existing, field_maps, batch_update, *, dry_run=True): updates = plan_updates(series, existing, field_maps) summary = { "records": len(updates), "cells": sum(len(row["fields"]) for row in updates), "written": 0, } if not dry_run and updates: # Injected adapter owns API batching and error reporting. summary["written"] = batch_update(updates) return summaryExtrait adapté de l’implémentation
Contrôles et limites
- Les secrets appartiennent à l’environnement d’exécution ; le mapping lisible n’a pas à contenir leur valeur.
- Relances, quotas et correspondances se vérifient source par source. Ce cas ne revendique pas une exécution exactement une fois.
Qui peut contribuer
- Opérations : examiner les jobs, demander une exécution et lire son historique.
- Builders : entretenir les mappings et cadences autorisés dans Airtable.
- Développeurs : ajouter des adaptateurs et vérifier mappings et écritures contre le contrat partagé.
Ce qui documente ce cas
Le back-office a été examiné en modes Human et Dev. Le dépôt contient le schéma de mapping, le moteur et les deux extensions publiées. Aucune synchronisation n’a été déclenchée pendant la revue.