Salesforce Application Architect · Application Architect Certified

Adrien Valentin

Des systèmes que les équipes métier pilotent, des frameworks que les développeurs suivent.

8 ans à concevoir et livrer des systèmes Salesforce en production : d'un logisticien mondial à un assureur national, jusqu'à une fintech européenne de 1 500 personnes. Du modèle de données au déploiement, de bout en bout.

11+
Années d'ingénierie
8+
Années Salesforce
9
Systèmes en production
Salesforce Certified
Trailblazer
129K+

Traitement à haut volume

129 552 leads assignés en 6 mois (711/jour). Moteur de règles à N dimensions, algèbre d'intervalles, détection de populations non couvertes. ~130 commerciaux répartis automatiquement via algorithme par déficit.

LAM EditorTMM
3 188

Au-delà du standard Salesforce

3 188 LCI créés : modèle 1 Lead → N entreprises qui casse la contrainte native. 587 opportunités générées. 96 champs suivis sur 4 objets avec traçabilité UI/API/Flow/Batch.

LCIEnhanced History
1 440

Asynchrone sans interruption

1 440 exécutions/jour, 0 crash depuis juin 2025. 5 jobs orchestrés par un seul point d'entrée piloté par les métadonnées. 60K+ synchronisations SF→Customer.io via Segment, configuration 100% déclarative.

AsyncCollectorCIOConnect
4 pays

Opérations multi-pays

16 SDR (FR, ES, DE, IT), 1 400 comptes/mois distribués automatiquement. Algorithme pondéré par déficit avec gestion de versions mensuelle. Remplace 4h de travail manuel hebdomadaire.

FTETMM

What I Solve: 4 Core Problem Domains

Architecte et bâtisseur

11 ans d'ingénierie, 8 sur Salesforce, 9 systèmes en production. Aujourd'hui architecte chez Qonto, fintech européenne en hypercroissance (~1 500 collaborateurs, 10+ marchés), 8 outils conçus et livrés de zéro. Avant cela : Tech Lead chez AG2R La Mondiale, assureur national (15 000 collaborateurs, 12,8 milliards d'euros de chiffre d'affaires), en mission via le cabinet Texeï : Design Authority, gouvernance transverse, management de 3 développeurs. Avant encore : Lead Developer chez Martin Brower, logisticien mondial (13 000 collaborateurs, 18 pays, 25 000+ restaurants), où j'ai tenu mon premier rôle d'architecture, avec gestion de projets multi-développeurs jusqu'à 5 personnes.

Je ne sépare pas l'architecture de l'implémentation. Je conçois les modèles de données, j'arbitre les compromis, je code les systèmes critiques et je les livre en production. Moteurs de règles, orchestrateurs asynchrones, pipelines de données, planification de capacité multi-pays : du tableau blanc au déploiement, de bout en bout. Certifié Salesforce Application Architect en 2026, certification combinée regroupant Platform Developer I, Platform App Builder, Platform Data Architect et Platform Sharing and Visibility Architect. En route vers la certification combinée System Architect.

Ma méthode commence par la compréhension : cartographier les dépendances, identifier les responsabilités, comprendre comment fonctionnalités et intégrations interagissent, puis décider. C'est ce travail préalable qui permet ensuite d'aller vite : le modèle Lead multi-entreprises est passé de l'architecture à la production en moins d'un mois. Depuis 2024, j'utilise l'IA comme accélérateur d'implémentation, sous ma direction : les décisions d'architecture et les arbitrages restent les miens.

Curieux permanent, convaincu que les meilleures solutions naissent sous contrainte.

En quelques chiffres

11+ ans
d'ingénierie logicielle
8 ans
sur Salesforce
9 systèmes
en production
3 migrations
de modèle de données en production
6 certifications
Salesforce Certified
2 langues
de travail : français, anglais
Outils construits en production
Chaque outil résout un problème business réel, avec une architecture pensée pour durer.

Lead Company Info

Multi-Company Lead Management

Salesforce impose 1 lead = 1 entreprise. Problème : un prospect contacte souvent pour plusieurs sociétés. LCI casse cette contrainte : 1 lead peut être lié à N entreprises, chacune avec son propre suivi, sa source et sa conversion. Résultat : des affaires qui étaient auparavant invisibles.

Multi-entreprise Conversion automatique Matching intelligent Attribution partenaire
→ 587 opportunités récupérées, invisibles dans Salesforce standard
3188LCI créés
587opportunités générées
71Closed Won
Multi-Company FindDuplicates API Custom Conversion SIRET Matching Batch Processing Partner Attribution
TOUCHPOINTS TP 1 Jean Dupont Acme Corp TP 2 Jean Dupont Acme Corp ✓ Match TP 3 Jean Dupont Beta Inc ✗ No Match TP 4 Jean Dupont Gamma SA ✗ No Match Salesforce · Lead Record Jean Dupont jean.dupont@acme.com · Acme Corp Open Converted ✓ Company Acme Corp Source Web Form Status Open Tél: +33 6 12 34 56 78 Titre: Dir. Achat enrichi ↑ LEAD COMPANY INFOS 1 2 3 Acme Corp SIRET: 12345678901234 · Web Form Primary ★ Converti ✓ Beta Inc NEW No Match → nouveau LCI · Event Converti ✓ Gamma SA NEW No Match + Auto-conv · Referral Auto ✓ ⚡ Trigger · Lead + 1 LCI Acme Corp créés ✓ Company Match → Lead + LCI enrichis ⚡ No Match → LCI Beta Inc · 2 LCIs ⚡ LCI Gamma → Auto-conv → Acc+Ct+Opp Acc: Gamma Ct: Jean Opp ✓ Batch TP reçu : Lead + LCI créés Jean Dupont · Acme Corp · 1 LCI Company Match : LCI enrichi Même société → Lead + LCI Acme Corp mis à jour No Match : 2 LCIs sur le lead Acme Corp ★ + Beta Inc NEW · 1 personne = 2 sociétés Auto-conversion : Gamma SA No Match → LCI → Lead converti → Acc+Ct+Opp auto Conversion Flow · 2 LCIs Convertir → LCI 1 · Acme Corp ★ Primary Account: Acme Corp Contact: Jean Dupont Opportunity: Acme - New Deal LCI 2 · Beta Inc (non-primary) Account: Beta Inc Contact: Jean Dupont Opportunity: non-primary → pas d'Opp Primary → Acc+Ct+Opp · Non-primary → Acc+Ct seuls Conversion manuelle : 2 LCIs Primary → Opp · Non-primary → Acc+Ct Conv. Batch Horaire · LCI Converter LIVE Toutes les heures · Leads: 247 · LCIs: 12 ✓ MATCH TROUVÉ Lead: Marie Martin · LCI: Delta Corp Account + Contact existants → même paire Conversion sans Opportunity Opp existante → 0 doublon ✓ Lead converti · 0 Opp · 0 doublon Batch : Conversion sans Opp Match Acc+Ct → Lead converti · 0 doublon Opp LEAD COMPANY INFORMATION 1 Lead → N Company Infos 3 188 LCI · 587 Opps · conversion multi-canal TOUCHPOINTS TP 1 Jean Dupont Acme Corp TP 2 Jean Dupont Acme Corp ✓ Match TP 3 Jean Dupont Beta Inc ✗ No Match TP 4 Jean Dupont Gamma SA ✗ No Match Salesforce · Lead Record Jean Dupont jean.dupont@acme.com · Acme Corp Open Converted ✓ Company Acme Corp Source Web Form Status Open Tél: +33 6 12 34 56 78 Title: Purchasing Dir. enriched ↑ LEAD COMPANY INFOS 1 2 3 Acme Corp SIRET: 12345678901234 · Web Form Primary ★ Converted ✓ Beta Inc NEW No Match → new LCI · Event Converted ✓ Gamma SA NEW No Match + Auto-conv · Referral Auto ✓ ⚡ Trigger · Lead + 1 LCI Acme Corp created ✓ Company Match → Lead + LCI enriched ⚡ No Match → LCI Beta Inc · 2 LCIs ⚡ LCI Gamma → Auto-conv → Acc+Ct+Opp Acc: Gamma Ct: Jean Opp ✓ Batch TP received: Lead + LCI created Jean Dupont · Acme Corp · 1 LCI Company Match: LCI enriched Same company → Lead + LCI Acme Corp updated No Match: 2 LCIs on the lead Acme Corp ★ + Beta Inc NEW · 1 person = 2 companies Auto-conversion: Gamma SA No Match → LCI → Lead converted → Acc+Ct+Opp auto Conversion Flow · 2 LCIs Convert → LCI 1 · Acme Corp ★ Primary Account: Acme Corp Contact: Jean Dupont Opportunity: Acme - New Deal LCI 2 · Beta Inc (non-primary) Account: Beta Inc Contact: Jean Dupont Opportunity: non-primary → no Opp Primary → Acc+Ct+Opp · Non-primary → Acc+Ct only Manual Conversion: 2 LCIs Primary → Opp · Non-primary → Acc+Ct Conv. Hourly Batch · LCI Converter LIVE Every hour · Leads: 247 · LCIs: 12 ✓ MATCH FOUND Lead: Marie Martin · LCI: Delta Corp Account + Contact exist → same pair Conversion without Opportunity Existing Opp → 0 duplicate ✓ Lead converted · 0 Opp · 0 duplicate Batch: Conversion without Opp Match Acc+Ct → Lead converted · 0 duplicate Opp LEAD COMPANY INFORMATION 1 Lead → N Company Infos 3,188 LCI · 587 Opps · multi-channel conversion

Solution

  • Modèle Lead → N Company Infos, chacune traçant entreprise, SIRET (numéro d'identification d'entreprise), source, partenaire
  • Rapprochement en deux niveaux : personne (email/phone) puis entreprise (SIRET → nom normalisé → FindDuplicates)
  • 4 chemins auto-conversion : Contact (client existant), Lead (nouveau client), LCI (post-conversion), Batch (nettoyage horaire)
  • Assistant de conversion multi-entreprise : rapprochement Account par SIRET ou approximatif, détection d'occupation, validation KYB
  • Attribution partenaire préservée par company info indépendante

Architecture

  • 6 gestionnaires de déclencheurs interconnectés (Touchpoint, LCI, Lead, Contact, Account, Batch)
  • Duplicate Rules configurées avec des conditions spécifiques (préfixe AUTOMATION) pour exploiter la puissance du rapprochement approximatif natif SF sans impacter les temps d'exécution : toute l'intelligence est dans les règles, pas dans le code
  • LWC assistant 3 étapes avec accordéons par entreprise et détection de conflits
  • Composant Source Information sur Opportunity avec companies liées
  • Architecture → production en <1 mois

Impact

  • En production depuis février 2026 : architecture → production en <1 mois (6 gestionnaires de déclencheurs, 2 LWC, 1 batch, duplicate rules)
  • 3 188 LCI créés et 587 opportunités générées : autant d'affaires qui n'existaient pas dans le modèle standard
  • 18% des touchpoints concernent une entreprise différente de celle du Lead. Sans LCI, ces opportunités étaient invisibles
  • Attribution partenaire corrigée : chaque entreprise trace sa source indépendamment, 100% des recommandations créditées

Lead Company Info (LCI): Technical Deep Dive

LCI breaks Salesforce's standard 1-Lead-1-Company constraint. A Lead becomes a Person linked to N independent Company Infos. Each LCI tracks its own company, SIRET, source, and partner attribution independently.

Architecture: 2-level matching, first the person (email/phone dedup), then the company (SIRET → normalized name → FindDuplicates API with fuzzy matching). 4 auto-conversion paths: existing customer (→ Contact), new customer (→ Lead), post-conversion (→ LCI), hourly batch cleanup. 6 interconnected trigger handlers.

Impact: 3,188 LCIs created, 587 opportunities generated. 18% of touchpoints involve a different company than the Lead's primary company. These opportunities were previously invisible. In production since February 2026.

Tech stack: Apex (CTRL→SVE→UTL layers), LWC, Custom Objects, Batch Apex, Platform Events.

Portfolio presentation includes: An interactive demo (demos/LCI_System/index.html) where visitors can explore the multi-company lead model with live touchpoint creation and LCI matching. An animated SVG walkthrough with 6 steps: ① Touchpoint creates Lead + LCI, ② Match + Split logic, ③ Manual conversion wizard, ④ Auto-conversion paths, ⑤ Hourly batch cleanup, ⑥ Big Picture overview. Card metrics: 3,188 LCIs created, 587 opportunities.

LAM Editor

Assignation automatique des leads

Moteur de règles complet avec algèbre d'intervalles, gap analysis par inversion ensembliste, et validation croisée inter-règles. ~8 000 lignes Apex.

Assignation automatique Configuration PM Détection de gaps Zéro maintenance
→ Zéro intervention manuelle depuis la MEP : PMs 100% autonomes
129Kleads / 6 mois
711/ jour en moy.
12Kréassignements
100%PMs autonomes
Rules Engine Interval Algebra Gap Analysis Polymorphic Types Dynamic SOQL
── CONFIGURATION ──────────────────────────── RUNTIME ── ① CRÉER UNE RÈGLE LAM Editor Rules Audiences Criteria Tester Nouvelle règle + Règle Nom de la règle Partner EU Objet Lead Priorité 2 Statut Active Aperçu règle Partner EU Lead · Prio 2 · → Criteria en cours... Enregistrer la règle → ✓ Règle "Partner EU" créée avec succès L’Éditeur Visuel : Règles sans code Nom · Objet · Priorité · Statut → Enregistré ③ AJOUTER DES CRITÈRES LAM : Criteria Builder Rules Audiences Criteria Règle: Partner EU · Lead Champ Op. Valeur Ok LeadSource = Partner Picklist · standard Company_Size IN SMB, Mid-Market Picklist · custom ~340 leads/mois correspondront 2/2 · LeadSource × Company Size · Validés Gap Analysis: 82% leads couverts · 18% non assignés détectés + critère Criteria Builder : Critères d’audience LeadSource · Company Size · Gap Analysis · 340 leads/mois ② CRÉER L’AUDIENCE LAM : Audiences Rules Audiences Criteria Nouvelle audience Nom EMEA Partners Règle associée Partner EU Déficit pondéré ★ Membres (3) Sophie M. 40% Marc L. 35% Ana K. 25% Enregistrer l’audience → Audience EMEA Partners créée 3 membres · Algo déficit · Rattachée à Partner EU crée audience ajoute critères lead arrive évalue assigne ④ LEAD ENTRANT NEW LEAD #L-002847 · TechCorp SAS LIVE Company TechCorp SAS Country FR RecordType Lead_B2B Source Partner Reçu il y a 2s · évaluation en cours... → Envoyé au moteur LAM TechCorp SAS : Lead entrant FR Lead_B2B · Partner · Évaluation démarrée ⑤ ÉVALUATION LAM : Moteur d'Évaluation LEAD TechCorp FR · Lead_B2B Partner → Engine... LAM Engine Partner EU Pré-filtres règle : Country = FR RecordType = Lead_B2B Critères audience : LeadSource = Partner Size IN SMB MATCH ✓ → Audience: EMEA Partners MATCH : 2/2 critères validés Partner EU → Audience EMEA Partners ⑥ ASSIGNATION LEAD TechCorp SAS FR · Lead_B2B · Partner ASSIGNÉ VIA EMEA PARTNERS Ana K. Équité · Sous-quota max Quota EMEA Partners Sophie M. 40% Marc L. 35% Ana K. 25% ← IMPACT MESURÉ 129 552 leads 711 / jour 0 demandes de changement Ana K. assignée : Déficit max 129 552 leads · 711/jour · 0 changements LAM : Lead Assignment Manager Règle → Audience → Criteria · 129 552 leads · 711/jour · 0 demandes · 10+ marchés ── CONFIGURATION ───────────────────────────── RUNTIME ── ── CONFIGURATION ──────────────────────────── RUNTIME ── ① CREATE A RULE LAM Editor Rules Audiences Criteria Tester New rule + Rule Rule name Partner EU Object Lead Priority 2 Status Active Rule preview Partner EU Lead · Prio 2 · → Criteria in progress... Save rule → ✓ Rule "Partner EU" created successfully Visual Editor: No-code rules Name · Object · Priority · Status → Saved ③ ADD CRITERIA LAM: Criteria Builder Rules Audiences Criteria Rule: Partner EU · Lead Field Op. Value Ok LeadSource = Partner Picklist · standard Company_Size IN SMB, Mid-Market Picklist · custom ~340 leads/month will match 2/2 · LeadSource × Company Size · Validated Gap Analysis: 82% leads covered · 18% unassigned detected + criterion Criteria Builder: Audience criteria LeadSource · Company Size · Gap Analysis · 340 leads/mo ② CREATE AUDIENCE LAM: Audiences Rules Audiences Criteria New audience Name EMEA Partners Associated rule Partner EU Weighted deficit ★ Members (3) Sophie M. 40% Marc L. 35% Ana K. 25% Save audience → Audience EMEA Partners created 3 members · Deficit algo · Linked to Partner EU create audience add criteria lead arrives evaluate assign ④ INCOMING LEAD NEW LEAD #L-002847 · TechCorp SAS LIVE Company TechCorp SAS Country FR RecordType Lead_B2B Source Partner Received 2s ago · evaluation in progress... → Sent to LAM engine TechCorp SAS: Incoming lead FR Lead_B2B · Partner · Evaluation started ⑤ EVALUATION LAM: Evaluation Engine LEAD TechCorp FR · Lead_B2B Partner → Engine... LAM Engine Partner EU Rule pre-filters: Country = FR RecordType = Lead_B2B Audience criteria: LeadSource = Partner Size IN SMB MATCH ✓ → Audience: EMEA Partners MATCH: 2/2 criteria validated Partner EU → Audience EMEA Partners ⑥ ASSIGNMENT LEAD TechCorp SAS FR · Lead_B2B · Partner ASSIGNED VIA EMEA PARTNERS Ana K. Equity · Max under-quota Quota EMEA Partners Sophie M. 40% Marc L. 35% Ana K. 25% ← MEASURED IMPACT 129,552 leads 711 / day 0 change requests Ana K. assigned: Max deficit 129,552 leads · 711/day · 0 changes LAM: Lead Assignment Manager Rule → Audience → Criteria · 129,552 leads · 711/day · 0 change requests · 10+ markets ── CONFIGURATION ───────────────────────────── RUNTIME ──

Solution

  • Éditeur visuel de règles d'assignation (Rules → Audiences → Criteria)
  • Système de types polymorphe avec algèbre d'intervalles (Number, String, Date, Boolean, Reference)
  • Support des champs polymorphiques Salesforce avec navigation multi-niveaux
  • Analyse des écarts par inversion ensembliste : détecte les populations non couvertes
  • Validation croisée inter-règles : chevauchements, inclusions, doublons
  • Génération SOQL dynamique via arbre récursif (SoqlNode leaf-to-root)

Architecture

  • ~8 000 lignes Apex structurées en couches (CTRL → SVE → UTL)
  • Système de types abstrait : IntervalType avec implémentations par type
  • CriteriaMapper pour transformation bidirectionnelle données ↔ UI
  • LWC avec extension personnalisée de LightningDatatable
  • Modèle de données : Rule → Audience → Criteria (self-reference récursive)

Impact

  • 129 552 leads traités en 6 mois (711/jour en moyenne), sans compter les réassignements liés aux touchpoints
  • 0 demandes de changement sur les règles d'assignation depuis la mise en production : les Product Managers sont 100% autonomes
  • Déployé dans une fintech B2B européenne multi-pays (~1500 collaborateurs, 10+ marchés)

LAM Editor: Technical Deep Dive

A complete rules engine for managing lead assignment rules on Salesforce. The data model is hierarchical: Rule → Audience → Criteria, with self-referential recursion. The type system is polymorphic with IntervalType implementations for Number, String, Date, Boolean, and Reference fields.

Key feature: Gap Analysis via set inversion, detects populations not covered by any rule. Cross-rule validation finds overlaps, inclusions and duplicates between rules. Dynamic SOQL generation via recursive SoqlNode tree (leaf-to-root traversal).

Architecture: ~8,000 lines of structured Apex in CTRL→SVE→UTL layers. LWC with custom LightningDatatable extension and custom cell types. Polymorphic field handling with multi-level navigation support.

Impact: 129,552 leads processed in 6 months (711/day), 0 change requests since go-live. Product Managers fully autonomous on rule configuration. Deployed at a European B2B fintech (~1,500 employees, 10+ markets).

Portfolio presentation includes: An interactive demo (demos/LAM_Editor/index.html): fully playable rule editor with criteria configuration, interval visualization, and gap analysis. An animated SVG walkthrough with 7 steps: ① Rule creation, ② Audience hierarchy, ③ Criteria editing with interval types, ④ Incoming lead processing, ⑤ Rule evaluation engine, ⑥ Assignment execution, ⑦ Big Picture. Card metrics: 129,552 leads/6 months, 711/day, 12,181 reassignments, 100% PM autonomous.

TeamMembers Management

Gestion d'Équipe & Capacity Planning

~130 commerciaux à répartir équitablement malgré les absences, les départs et les changements d'équipe. TMM gère la distribution par déficit : celui qui est le plus en dessous de sa cible reçoit le prochain lead. Synchronisation automatique des absences via Outlook.

Répartition équitable Gestion des absences Multi-objets Temps réel
→ 66 réassignations automatiques/jour : aucune action manager
~130commerciaux gérés
124groupes d'assignation
12Kréassignements / 6 mois
Deficit Algorithm Virtual Accounting OOO Sync (SF Calendar → Google) Sharing Delta
TMM · Team Members Members Groups Records 📅 Synchro Calendar NOM RÔLE STATUT QUOTA SM Sophie Martin sophie.m@company.com Sales Rep Active 40% ML Marc Leroy marc.l@company.com Sales Rep Active 35% AK Ana Kowalski ana.k@company.com Sales Rep 🏖 Vacances 25% PD Pierre Duval pierre.d@company.com Account Exec Active 50% 4 membres 3 actifs · 1 en vacances · Synchro Calendar automatique 📅 Absences synchronisées via Google Calendar Team Members : 4 membres 3 actifs · 1 vacances · Synchro Calendar TMM · Assignment Groups Members Groups Records + Nouveau Groupe EMEA Sales Lead · 3 membres · Active FR Partners Lead · 2 membres · Active EU Enterprise Nouveau MEMBRE Lead Opp Sophie M. 40% 30% Marc L. 35% 50% Pierre D. 25% 20% ✓ "EU Enterprise" · 2 objets · 3 membres Nouveau groupe : EU Enterprise Lead + Opp · 3 membres · Quotas TMM · Records to Assign Members Groups Records Lead TechCorp SAS Assigné ✓ LAM Editor EU Enterprise Sophie M. Opp Acme Deal #42 Assigné ✓ Trigger EU Enterprise Marc L. Lead StartupXYZ Assigné ✓ LAM FR Partners Sophie M. Lead TechCorp SAS Réassigné ✓ EU Enterprise Marc L. Records : LAM + Triggers Lead via LAM · Opp via Trigger assign group member TEAM MEMBERS MANAGEMENT Members → Groups → Records ~130 reps · 124 groupes · 12 181 reassignations · 66/jour TMM · Team Members Members Groups Records 📅 Calendar Sync NOM ROLE STATUS QUOTA SM Sophie Martin sophie.m@company.com Sales Rep Active 40% ML Marc Leroy marc.l@company.com Sales Rep Active 35% AK Ana Kowalski ana.k@company.com Sales Rep 🏖️ On leave 25% PD Pierre Duval pierre.d@company.com Account Exec Active 50% 4 members 3 active · 1 on leave · Auto Calendar sync 📅 Absences synced via Google Calendar Team Members: 4 members 3 active · 1 on leave · Calendar sync TMM · Assignment Groups Members Groups Records + New Group EMEA Sales Lead · 3 members · Active FR Partners Lead · 2 members · Active EU Enterprise New MEMBER Lead Opp Sophie M. 40% 30% Marc L. 35% 50% Pierre D. 25% 20% ✓ "EU Enterprise" · 2 objects · 3 members New group: EU Enterprise Lead + Opp · 3 members · Quotas TMM · Records to Assign Members Groups Records Lead TechCorp SAS Assigned ✓ LAM Editor EU Enterprise Sophie M. Opp Acme Deal #42 Assigned ✓ Trigger EU Enterprise Marc L. Lead StartupXYZ Assigned ✓ LAM FR Partners Sophie M. Lead TechCorp SAS Reassigned ✓ EU Enterprise Marc L. Records: LAM + Triggers Lead via LAM · Opp via Trigger assign group member TEAM MEMBERS MANAGEMENT Members → Groups → Records ~130 reps · 124 groups · 12,181 reassignments · 66/day

Solution

  • Gestion de groupes d'assignation avec membres et pondérations par objet
  • Algorithme d'assignation par déficit : converge vers la répartition cible
  • Virtual accounting pour les membres inactifs
  • Synchronisation automatique Outlook/Calendar SF pour les absences
  • Interface calendrier personnalisée intégrée pour gestion manuelle
  • Gestion intelligente du sharing (diff delta optimisé)

Architecture

  • Modèle 3 niveaux : Group → Member → Distribution (par objet)
  • Double circuit d'inactivité : manuelle vs automatique, indépendants
  • Refresh de sharing optimisé par delta intelligent
  • LWC avec interface à onglets, gestion bi-modale

Impact

  • ~130 commerciaux gérés à travers 124 groupes d'assignation dans une fintech B2B multi-pays
  • 12 181 réassignements automatiques en 6 mois (66/jour en moyenne), liés aux changements de touchpoints et d'absences
  • Couplé au LAM Editor : 129 552 leads créés sur la même période (711/jour), chacun assigné via les règles et groupes TMM

TMM (Team Members Management): Technical Deep Dive

Capacity planning tool for sales managers. Manages ~130 sales reps across 124 assignment groups. Three-level model: Group → Member → Distribution (per object). Deficit-based assignment algorithm: always assigns to the member furthest below their target percentage.

Dual inactivity circuit: manual vs automatic, fully independent. Virtual accounting for inactive members. Automatic Outlook/Salesforce Calendar sync for absences. Optimized sharing refresh via intelligent delta diff.

Impact: 12,181 automatic reassignments in 6 months (66/day). Coupled with LAM: 129,552 leads processed on the same period.

Portfolio presentation includes: An interactive demo (demos/TeamMembers_Management/index.html) with member/group management and quota visualization. An animated SVG walkthrough with 4 steps: ① Members list with dual Lead/Opp quotas, ② Group creation with percentage distribution, ③ Records with assignment tracking, ④ Big Picture overview. Card metrics: ~130 reps, 124 groups, 12,181 reassignments/6 months.

Enhanced History

Historique Amélioré

Vue historique enrichie avec double perspective : par champ et par transaction. Traçabilité complète du qui, quoi, quand et comment.

Audit complet Traçabilité Détection d'anomalies Multi-objets
→ Traçabilité complète : trace chaque changement UI, API, Flow, Batch
96champs trackés
4objets déployés
31sur Lead (max)
Field History Audit Trail Update Source Generic
Fiche Lead Création du lead... Name Jean Dupont Company Acme Corp Email jean@acme.fr Status Open Contacté UI Intéressé API Qualifié UI Converted ✓ FLOW Owner Queue Sophie M. BATCH Marc L. BATCH Sophie M. UI Lead_Score 0 15 API 32 API 58 API 72 API 85 API LeadSource Website Organic API Partner Ref. API Company_Size Phone 50-200 UI +33 6 12 34 UI +33 6 98 76 UI LEAD CONVERTI ✓ ① Lead créé : 7 champs ② Mises à jour : Score, Source, Owner... ③ Qualification + Réassignation ④ Conversion : FLOW Enhanced History : Lead Par champ Par MAJ Analytique Rechercher... > 1 YEAR 7 fields Status Actuelle : Converted 5 modifs Valeurs uniques : 5 Fréquence : Élevée Comparaison aux pairs Last year · 2841 Répartition des valeurs 1ère plus fréquente Qualifié 42% · 1193 Contacté 25% Intéressé 15% Open 9% + 2 autres Owner Actuelle : Sophie M. 4 modifs ⚠ 1 anomalie · 2 réassignations en 2 min Historique récent 4 affichés ⚠ 10:02 · Marc L. → Sophie M. UI ⚠ 10:01 · Sophie M. → Marc L. BATCH 07:54 · Queue → Sophie M. BATCH Lead_Score Actuelle : 85 6 modifs Progression : 0→15→32→58→72→85 📈 +85 pts en 2h · piloté par API LeadSource Actuelle : Partner Referral 2 modifs Company_Size Actuelle : 50-200 1 modif Phone Actuelle : +33 6 98 76 XX 2 modifs 📋 Lead converti by Admin · 10:01 📋 Enregistrement créé by Integration · 07:53 96 champs suivis 4 objets 20 modifs 1 anomalie ⑦ 20 modifs · 4 sources · Sibling ✓ · Anomaly ⚠ LEAD HISTORY Enhanced History : Audit complet 96 fields · 4 objets · Sibling · Update Source · Anomaly Lead Record Creating lead... Name Jean Dupont Company Acme Corp Email jean@acme.fr Status Open Contacted UI Interested API Qualified UI Converted ✓ FLOW Owner Queue Sophie M. BATCH Marc L. BATCH Sophie M. UI Lead_Score 0 15 API 32 API 58 API 72 API 85 API LeadSource Website Organic API Partner Ref. API Company_Size Phone 50-200 UI +33 6 12 34 UI +33 6 98 76 UI LEAD CONVERTED ✓ ① Lead created: 7 fields ② Updates: Score, Source, Owner... ③ Qualification + Reassignment ④ Conversion: FLOW Enhanced History: Lead By Field By Update Analytics Search fields... > 1 YEAR 7 fields Status Current: Converted 5 changes Unique values: 5 Change Freq: High Sibling comparison Last year · 2841 Value Distribution 1st most common Qualified 42% · 1193 Contacted 25% Interested 15% Open 9% + 2 others Owner Current: Sophie M. 4 changes ⚠ 1 anomaly · 2 reassigns in 2 min Recent history 4 shown ⚠ 10:02 · Marc L. → Sophie M. UI ⚠ 10:01 · Sophie M. → Marc L. BATCH 07:54 · Queue → Sophie M. BATCH Lead_Score Current: 85 6 changes Progression: 0→15→32→58→72→85 📈 +85 pts in 2h · API-driven LeadSource Current: Partner Referral 2 changes Company_Size Current: 50-200 1 change Phone Current: +33 6 98 76 XX 2 changes 📋 Lead Converted by Admin · 10:01 📋 Record Created by Integration · 07:53 96 fields tracked 4 objects 20 changes 1 anomaly ⑦ 20 changes · 4 sources · Sibling ✓ · Anomaly ⚠ LEAD HISTORY Enhanced History: Full Audit Trail 96 fields · 4 objects · Sibling · Update Source · Anomaly

Solution

  • Vue par champ : historique groupé par champ, ordonné par dernière modification
  • Vue par transaction : historique groupé par datetime d'update
  • Champ "Update Source" pour tracer le comment (UI, API, Flow, Batch)

Architecture

  • Backend Apex : agrégation et transformation des données Field History
  • Frontend LWC : double vue avec toggle, composant réutilisable
  • Configuration par Custom Metadata + paramètres LWC
  • Exploitation du Field History Tracking natif (zéro objet personnalisé supplémentaire)

Impact

  • 96 champs trackés sur 4 objets : Lead (31), Account (50), Contact (2), Opportunity (13)
  • Composant générique réutilisable sur tout objet standard ou personnalisé
  • Sibling comparison pour détecter les anomalies de données entre enregistrements similaires

Enhanced History: Technical Deep Dive

Enhanced Salesforce history view with dual perspective: View by field (history grouped by field, ordered by last modification) and View by transaction (history grouped by update datetime, showing all changes in a single operation together).

Update Source custom field traces how a change happened: UI, API, Flow, Batch (full audit trail). Sibling comparison analytics: compares field values against peers (same owner, same record type) with value distribution charts and percentile ranking.

Anomaly detection: identifies rapid changes (e.g., 2 owner reassignments within 2 minutes). Deployed on Lead, Account, Contact, Opportunity: 96 fields tracked across 4 Salesforce objects.

Architecture: Apex triggers with Enhanced_History__mdt configuration, LWC components with collapsible field cards, analytics blocks, and timeline views.

Portfolio presentation includes: An interactive demo (demos/Enhanced_History/index.html) showing the dual-view history interface with field grouping and transaction timeline. An animated SVG walkthrough with 8 steps: ① Lead created, ② Field updates tracked, ③ Qualification changes, ④ Conversion event, ⑤ Status history view, ⑥ Owner history view, ⑦ Sibling comparison, ⑧ Big Picture. Card metrics: 96 fields tracked, 4 objects, 31 fields on Lead.

CIOConnect

Synchronisation SF → Customer.io

Les équipes marketing ont besoin de données CRM à jour dans Customer.io pour leurs campagnes. CIOConnect synchronise automatiquement : traitement par lots toutes les 15 min + temps réel pour les événements critiques. Les admins ajoutent un champ à synchroniser en 5 min, sans code.

Zéro code requis Batch + Temps réel Config admin 60K+ syncs
→ Admins ajoutent un champ à synchroniser en 5 min : zéro déploiement de code
60k+synchronisations depuis 2024
15 minintervalle des lots
0crash depuis juil. 2024
Metadata-Driven Segment API Batch + Real-time Zero AI
CIO_connect__mdt Objet Champ Relation Filtre Lead Email Lead Status Lead Owner.Name Lookup Account Amount Opps IsWon=true NEW Zéro code modifié : Admin autonome 100% déclaratif · Relations + Filtres ① Ajout metadata : Relation + Filtre ✨ Nouvelle Metadata Objet: Account Champ: Amount Relation: Opportunities Filtre: IsWon = true Tri: CloseDate DESC · LIMIT 3 ✓ Prêt à enregistrer Lead : Jean Dupont Email jean@acme.fr Company Acme Corp Status Open Contacté ← champ tracké ⚡ SyncCIO__c = now() → flaggé ! Le trigger compare les champs metadata Status ∈ CIO_connect__mdt → flag ✓ ② Lead mis à jour : Flag posé RUNTIME : Toutes les 15 min ⏰ Scheduler 15 min 11 records 8 Leads · 2 Ct · 1 Acc Lead · Jean Dupont Email: jean@acme.fr Status: Contacté Owner: Sophie M. + 3 champs Opps (IsWon=true) #1 · €45k · Mar #2 · €12k · Jan #3 · €8k · Nov LIMIT 3 · DESC Payload 11 records Segment Customer.io ✓ 60k+ synchros · 0 crash · Depuis juil. 2024 ③ Scheduler : 11 records collectés ④ Lead + données relationnelles ⑤ Consolidation → Payload JSON ⑥ Envoi OK : SF → Segment → Customer.io CONFIG TRIGGER CIOConnect : SF → Segment → Customer.io 60k+ synchros · 0 crash · Metadata-driven · Batch + Real-time CIO_connect__mdt Object Field Relation Filter Lead Email Lead Status Lead Owner.Name Lookup Account Amount Opps IsWon=true NEW Zero code changes: Admin autonomous 100% declarative · Relations + Filters ① Ajout metadata: Relation + Filter ✨ New Metadata Object: Account Field: Amount Relation: Opportunities Filter: IsWon = true Sort: CloseDate DESC · LIMIT 3 ✓ Ready to save Lead: Jean Dupont Email jean@acme.fr Company Acme Corp Status Open Contacted ← tracked field ⚡ SyncCIO__c = now() → flagged! Trigger compares metadata fields Status ∈ CIO_connect__mdt → flag ✓ ② Lead updated: Flag set RUNTIME: Every 15 min ⏰ Scheduler 15 min 11 records 8 Leads · 2 Ct · 1 Acc Lead · Jean Dupont Email: jean@acme.fr Status: Contacted Owner: Sophie M. + 3 fields Opps (IsWon=true) #1 · €45k · Mar #2 · €12k · Jan #3 · €8k · Nov LIMIT 3 · DESC Payload 11 records Segment Customer.io ✓ 60k+ syncs · 0 crash · Since Jul 2024 ③ Scheduler: 11 records collected ④ Lead + relationship data ⑤ Consolidation → JSON Payload ⑥ Sent OK: SF → Segment → Customer.io CONFIG TRIGGER CIOConnect: SF → Segment → Customer.io 60k+ syncs · 0 crash · Metadata-driven · Batch + Real-time

Solution

  • Synchronisation pilotée par les métadonnées : zéro code à modifier pour ajouter un champ
  • Double synchronisation : traitement par lots toutes les 15 min + temps réel
  • Support champs directs, lookups, relations avec filtres et tri
  • Moteur de filtres récursif (AND/OR/parenthèses)

Architecture

  • Marqueur SyncCIO__c posé par déclencheur sur modification d'un champ configuré en métadonnées
  • Le planificateur collecte les enregistrements marqués (fenêtre 15 min)
  • SOQL dynamique avec subqueries depuis CIO_connect__mdt
  • En production depuis juillet 2024

Impact

  • 60k+ synchronisations, 0 crash depuis juillet 2024
  • Admins SF ajoutent des champs sans intervention dev
  • Lead, Contact, Account avec relations et filtres complexes

CIOConnect: Technical Deep Dive

Metadata-driven synchronization system from Salesforce to Customer.io via Segment API. Configuration is 100% declarative via CIO_connect__mdt Custom Metadata: admins configure which fields, relationships, and filters to sync without any code changes.

Architecture: Trigger-based flagging (SyncCIO__c DateTime field) → Scheduled batch collection every 15 minutes → Dynamic SOQL construction from metadata → JSON payload building → HTTP callout to Segment webhook. Supports direct fields, lookup fields, and relationship subqueries with configurable filters (recursive boolean expression parser: AND/OR/parentheses), sorting, and limits.

Dual sync paths: Batch (15-minute window, bulk operations) + Real-time (Queueable, immediate events for critical status changes).

Impact: 60,000+ synchronizations since July 2024, 0 crashes. Covers Lead, Contact, Account objects. Salesforce admins add new fields to sync in under 5 minutes without developer intervention.

Portfolio presentation includes: An animated SVG walkthrough with 8 steps: ① Metadata configuration, ② Lead flagging via trigger, ③ Batch collection, ④ Relationship traversal, ⑤ JSON payload building, ⑥ HTTP callout to Segment, ⑦ Customer.io delivery, ⑧ Big Picture. No interactive demo: the tool is a backend sync engine. Card metrics: 60k+ syncs since 2024, 15-min batch cycle, 0 crashes.

AsyncCollector

Orchestrateur Asynchrone

5 processus critiques doivent tourner chaque minute sans se bloquer mutuellement. AsyncCollector orchestre tout depuis un seul point d'entrée : si un job plante, les autres continuent. Configuration 100% déclarative : ajouter un job ne nécessite aucun déploiement.

5 jobs orchestrés 0 crash Retry automatique Config déclarative
→ Remplace 5 jobs indépendants, 0 crash depuis juin 2025
0crash depuis juin 2025
1440exécutions / jour
5jobs orchestrés
Metadata-Driven Job Orchestration Lock & Queue Zero AI
PartnerSync_SCH.cls 1 2 3 4 5 6 7 8 public class PartnerSync_SCH extends AsyncCollectable { // Identifiant du job override String getName(){ return 'PartnerSync'; } override Boolean shouldRun(){ return !partners.isEmpty(); ① Classe : extends AsyncCollectable Features__mdt · 5 records Classe Délai Type LeadTrigger_SCH 0 min TRIGGER CaseTrigger_SCH 5 min INTERVAL PartnerSync_SCH NOUVEAU 10 min INTERVAL Opportunity_SCH 10 min INTERVAL Partnerstack_SCH 0 min TRIGGER Zéro Apex modifié : ajout en 5 min Sans déploiement · Custom Metadata ② Metadata ajoutée : Sans déploiement ASYNC COLLECTOR : RUN #1441 TICK! ③ Chargement des metadata : 5 jobs détectés ④ Vérification des délais : 3 RUN, 2 SKIP ⑤ shouldRun() : données à traiter ? ⑤ Exécution en cours : 2 jobs lancés ⑥ Erreur détectée : retry automatique ✓ Cycle terminé : 0 crash · 100% recovery Job Délai Statut LeadTrigger_SCH 1/0 min RUN SKIP Pas de données CaseTrigger_SCH 2/5 min SKIP délai non atteint PartnerSync_SCH 12/10 RUN GO ▶ ✓ OK Opportunity_SCH 3/10 SKIP délai non atteint Partnerstack_SCH 1/0 RUN GO ▶ ⚠ Partnerstack : CalloutException unreachable · isolé ↻ Partnerstack : Retry... ✓ Partnerstack : RETRY OK ✓ OK AsyncCollector : Job Scheduler 5 jobs · 1 441 exéc/jour · 0 crash · 100% recovery · piloté par metadata PartnerSync_SCH.cls 1 2 3 4 5 6 7 8 public class PartnerSync_SCH extends AsyncCollectable { // Job identifier override String getName(){ return 'PartnerSync'; } override Boolean shouldRun(){ return !partners.isEmpty(); ① Class: extends AsyncCollectable Features__mdt · 5 records Class Delay Type LeadTrigger_SCH 0 min TRIGGER CaseTrigger_SCH 5 min INTERVAL PartnerSync_SCH NEW 10 min INTERVAL Opportunity_SCH 10 min INTERVAL Partnerstack_SCH 0 min TRIGGER Zero Apex modified: added in 5 min No deploy · Custom Metadata only ② Metadata added: No deploy ASYNC COLLECTOR: RUN #1441 TICK! ③ Metadata loaded: 5 jobs detected ④ Delay check: 3 RUN, 2 SKIP ⑤ shouldRun(): data to process? ⑤ Execution in progress: 2 jobs running ⑥ Error detected: auto retry ✓ Cycle complete: 0 crash · 100% recovery Job Delay Status LeadTrigger_SCH 1/0 min RUN SKIP No data CaseTrigger_SCH 2/5 min SKIP delay not reached PartnerSync_SCH 12/10 RUN GO ▶ ✓ OK Opportunity_SCH 3/10 SKIP delay not reached Partnerstack_SCH 1/0 RUN GO ▶ ⚠ Partnerstack: CalloutException unreachable · isolated ↻ Partnerstack: Retry... ✓ Partnerstack: RETRY OK ✓ OK AsyncCollector: Job Scheduler 5 jobs · 1,441 exec/day · 0 crash · 100% recovery · metadata-driven

Solution

  • Empêche l'exécution simultanée de jobs identiques
  • Gère les délais configurables entre chaque exécution
  • Architecture 100% configurable via Custom Metadata
  • Supervision et journalisation intégrées

Architecture

  • Pattern piloté par les métadonnées : configuration déclarative des jobs
  • Gestion d'état persistante via Custom Objects
  • Mécanisme de verrou et de file d'attente pour l'ordonnancement

Impact

  • En production depuis juin 2025 : 0 crash du collector, ~1 440 exécutions/jour (1/minute)
  • Gestion d'erreurs isolée par job : certaines opérations en erreur reprennent automatiquement, sans jamais bloquer les autres jobs
  • Orchestre 5 jobs critiques (Lead Assignment, Case Routing, Partner Sync, Opportunity Processing, Partnerstack) dans une fintech B2B européenne multi-pays

AsyncCollector: Technical Deep Dive

A metadata-driven centralized orchestrator replacing N independent Salesforce Scheduled Apex jobs. Runs every minute via a single scheduled entry point. Orchestrates 5 critical jobs: Lead Assignment (LAM), Case Routing, Partner Sync, Opportunity Processing, Partnerstack.

Architecture: Uses Type.forName().newInstance() to instantiate job classes dynamically. Tracks last execution per job in mLastExecutions map to enforce configurable delays. Utils.jobBeginWithIsScheduled() prevents duplicate concurrent executions. Auto-Kill pattern per job. Error isolation: one failing job never blocks others. Retry_Async Queueable retries DML on UNABLE_TO_LOCK_ROW up to 10 attempts.

Configuration: 100% declarative via Custom Metadata (Features__mdt with asyncClassToBeCollected__c, asyncInterval__c, Enabled__c fields). Each job extends AsyncCollectable_SCH abstract class with getName() and shouldRun() methods.

Impact: 1,440 executions/day (1 per minute), 0 crashes since June 2025.

Portfolio presentation includes: An interactive demo (demos/AsyncCollector/index.html) visualizing the orchestration pipeline with job scheduling and retry mechanics. An animated SVG walkthrough with 7 steps: ① Collectable class pattern, ② Metadata configuration, ③ Scheduler execution, ④ Delay filtering, ⑤ shouldRun() evaluation, ⑥ Auto-retry on lock errors, ⑦ Big Picture. Card metrics: 0 crashes since June 2025, 1,440 executions/day, 5 orchestrated jobs.

CPQ Import Suite

Suite d'import/export Salesforce CPQ

Migrer un catalogue produit de 1 167 références depuis un ERP vers Salesforce CPQ, sans perdre les hiérarchies de bundles ni les règles de remise. L'outil détecte les conflits, recalcule les gammes et permet le retour arrière par enregistrement. 1 167 références migrées, zéro perte de données.

Migration ERP Résolution de conflits Bundles & Gammes Rollback par record
→ 1 167 produits migrés depuis un catalogue d'origine, zéro perte de données
61bundles
350features
1167produits importés
CSV Parser Bundle Management Conflict Resolution CPQ Odoo Migration
Odoo · ERP Extraction produits 📄 legacy.csv Inline · 847 lignes ✓ Fichier généré Odoo : Extract csv csv CPQ Import Manager Legacy Bundles Suppression Legacy Bundles Suppression Legacy Bundles Suppression 📄 legacy.csv 847 lignes Chargé PARSING 12 Bundles 38 Features 142 Options 89 Products Inline → hiérarchie Bundle / Feature / Option / Product Import Legacy : Parsing CONFLITS ⚠ 7 lignes en conflit → Occurrence la + fréquente pré-sélectionnée RÉDUCTION PAR GAMME Standard: 0.85 -15% sur 42 options 3 bundles décochés · 12 options ignorées ☐ RÉSUMÉ: 9 bun · 34 feat · 130 opt · 89 prod Importer Validation : Import lancé EXPORT BUNDLE ☑ Premium Plan (4 feat · 18 opt) Export ↓ 📄 premium_plan.csv FEATURE OPTION PRIX Support 24/7 Premium 199€ Storage 500 Go 49€ API 10k calls/j 79€ 1 To 89€ MAJ Export → Modifier → Réimport IMPORT BUNDLE 📄 premium_plan_modified.csv Import ↑ ✓ Import réussi Storage: 500 Go → 1 To · Prix: 49€ → 89€ Import : 1 option mise à jour SUPPRESSION ☑ Legacy Bundle A 3 feat · 12 opt ☑ Legacy Bundle B 2 feat · 8 opt ☐ Active Plan conservé 2 bundles · 5 features · 20 options Supprimer ✓ 25 records supprimés · 0 erreur Suppression : 25 records CPQ Catalogue IMPORT LEGACY ✓ 9 Bundles ✓ 34 Features ✓ 130 Options ✓ 89 Products ✓ BUNDLE REIMPORT ✓ Premium: 4 opt MAJ Enterprise: 2 feat ajoutées SUPPRESSION ✓ Legacy A: ✗ 15 records Legacy B: ✗ 10 records CPQ Catalogue CPQ IMPORT Odoo → Import → Catalogue Legacy + Bundles + Suppression · 12 bun · 89 prod · 0 erreur Odoo · ERP Product extraction 📄 legacy.csv Inline · 847 lines ✓ File generated Odoo: Extract csv csv CPQ Import Manager Legacy Bundles Suppression Legacy Bundles Suppression Legacy Bundles Suppression 📄 legacy.csv 847 lines Loaded PARSING 12 Bundles 38 Features 142 Options 89 Products Inline → Bundle / Feature / Option / Product hierarchy Import Legacy: Parsing CONFLICTS ⚠ 7 lines in conflict → Most frequent pre-selected REDUCTION BY RANGE Standard: 0.85 -15% on 42 options 3 bundles unchecked · 12 options ignored ☐ SUMMARY: 9 bun · 34 feat · 130 opt · 89 prod Import Validation: Import started EXPORT BUNDLE ☑ Premium Plan (4 feat · 18 opt) Export ↓ 📄 premium_plan.csv FEATURE OPTION PRIX Support 24/7 Premium 199€ Storage 500 Go 49€ API 10k calls/j 79€ 1 To 89€ UPD Export → Modify → Reimport IMPORT BUNDLE 📄 premium_plan_modified.csv Import ↑ ✓ Import successful Storage: 500 Go → 1 To · Prix: 49€ → 89€ Import: 1 option updated DELETION ☑ Legacy Bundle A 3 feat · 12 opt ☑ Legacy Bundle B 2 feat · 8 opt ☐ Active Plan kept 2 bundles · 5 features · 20 options Delete ✓ 25 records deleted · 0 errors Deletion: 25 records CPQ Catalogue LEGACY IMPORT ✓ 9 Bundles ✓ 34 Features ✓ 130 Options ✓ 89 Products ✓ BUNDLE REIMPORT ✓ Premium: 4 opt UPD Enterprise: 2 feat added DELETION ✓ Legacy A: ✗ 15 records Legacy B: ✗ 10 records CPQ Catalogue CPQ IMPORT Odoo → Import → Catalogue Legacy + Bundles + Deletion · 12 bun · 89 prod · 0 errors

Solution

  • Import historique depuis Odoo avec détection et résolution de conflits par vote d'occurrence
  • Gestion complète du cycle de vie des bundles CPQ (features, options, pricing)
  • Export/import de configurations de bundles avec diff visuel avant exécution
  • Gestion des suppressions en cascade avec prévisualisation de l'impact
  • Remises par gamme configurables avec application automatique aux devis
  • Parsing CSV avancé : détection automatique du séparateur, gestion des guillemets imbriqués

Architecture

  • ~7 000 lignes de code (Apex + LWC), 18 composants Lightning
  • Orchestrateur multi-mode : import historique, synchronisation des bundles, export, suppressions, remises
  • DML découpé en lots de 200 pour respecter les governor limits
  • Parseur CSV caractère par caractère avec auto-détection du séparateur
  • Interface assistant en 4 étapes : téléversement → vérification → récapitulatif → résultat

Impact

  • Catalogue importé : 61 bundles, 350 features, 1 167 produits (768 options + 352 composants + 47 éco-participation), depuis un CSV d'origine avec formules Excel
  • Contexte : intégration post-acquisition d'un fabricant de mobilier technique, migration du catalogue produit d'origine vers Salesforce CPQ
  • Résolution automatique de conflits intra-fichier (mêmes références avec valeurs différentes) + gestion des remises par gamme via Custom Metadata

CPQ Import Suite: Technical Deep Dive

CSV import pipeline for Salesforce CPQ: migrates a legacy product catalog (61 bundles, 350 features, 1,167 products) from Odoo via CSV, with automatic conflict resolution and range-based discount management. Built for a post-acquisition catalog migration at a technical furniture manufacturer.

Architecture: CSV parsing → validation → intra-file conflict detection (vote-by-occurrence) → selective import with per-record rollback. Handles Product2, PricebookEntry, and custom objects via Custom Metadata. In production since March 2026, zero data loss.

Portfolio presentation includes: An interactive demo (demos/CPQ_Import/index.html) showing the CSV import pipeline with validation and conflict detection. An animated SVG walkthrough with 8 steps: ① Odoo data extraction, ② Legacy import, ③ Validation rules, ④ CSV export, ⑤ Salesforce import, ⑥ Suppression handling, ⑦ Bundles import, ⑧ Big Picture. Card metrics: 61 bundles, 350 features, 1,167 products imported.

Account Duplicates

Gestion des doublons Comptes & Contacts

Des commerciaux créent des comptes en double : ça fausse le pipeline et complique les fusions manuelles (~7 min par doublon). Account Duplicates détecte automatiquement les doublons (rapprochement approximatif + SIRET), évalue leur éligibilité à la fusion et permet de fusionner en 2 min.

Détection automatique Fusion en 2 min Qualité de données Pipeline fiable
→ ~5 min gagnées par merge, 1 981 merges traités
1981merge requests
14/ jour en moy.
~5 mingagnées / merge
Deduplication Merge Data Quality Bulk Operations
Merge Tool Sophie M. Aucun doublon calculé Compute → En cours... Connexion : Interface vide Compute Pipeline Purge anciens doublons FindDuplicates Contacts (Datacloud) Group SIRET Accounts regroupés ✓ 4 groupes · 12 accounts · 3 SIRET match Compute : 4 groupes Records Acme Corp Sales SIRET:123 Acme (Data) Data SIRET:123 DUP TechCorp SAS Sales SIRET:987 TechData Data SIRET:987 DUP TechOther Sales SIRET:987 Beta Industries Sales SIRET:555 BetaData Data SIRET:555 DUP StartupXYZ Sales SIRET:555 DUP Records : 8 accounts chargés Merge Tool · Résultats GROUPE 1 · SIRET 123456789 Acme Corp Sales Opp✓ Ct✓ Call✓ Acme (Data) Data Account_ID✓ GROUPE 2 · SIRET 987654321 TechCorp SAS Sales Opp✓ Ct✓ Call✓ TechData Data TechOther Bloqué Opp Marc L. GROUPE 3 · SIRET 555000111 Beta Industries Sales Opp✓ Ct✓ Call✓ BetaData Data StartupXYZ Sales No Call ✗ Merge Tool : 3 groupes Sélection : 4 accounts cochés Lancer Merge En cours... ✓ Acme Corp + Acme Data → mergé ✓ TechCorp + TechData → mergé supprimé Mergé ✓ supprimé Mergé ✓ Merge : 2 merges réussis ✓ ACCOUNT DUPLICATES Compute → Détecter → Merge FindDuplicates API · SIRET grouping · Sales + Data Merge Tool Sophie M. No duplicates computed Compute → In progress... Connection: Empty interface Compute Pipeline Purge old duplicates FindDuplicates Contacts (Datacloud) Group SIRET Accounts grouped ✓ 4 groups · 12 accounts · 3 SIRET match Compute: 4 groups Records Acme Corp Sales SIRET:123 Acme (Data) Data SIRET:123 DUP TechCorp SAS Sales SIRET:987 TechData Data SIRET:987 DUP TechOther Sales SIRET:987 Beta Industries Sales SIRET:555 BetaData Data SIRET:555 DUP StartupXYZ Sales SIRET:555 DUP Records: 8 accounts loaded Merge Tool · Results GROUP 1 · SIRET 123456789 Acme Corp Sales Opp✓ Ct✓ Call✓ Acme (Data) Data Account_ID✓ GROUP 2 · SIRET 987654321 TechCorp SAS Sales Opp✓ Ct✓ Call✓ TechData Data TechOther Blocked Opp Marc L. GROUP 3 · SIRET 555000111 Beta Industries Sales Opp✓ Ct✓ Call✓ BetaData Data StartupXYZ Sales No Call ✗ Merge Tool: 3 groups Selection: 4 accounts checked Launch Merge In progress... ✓ Acme Corp + Acme Data → merged ✓ TechCorp + TechData → merged deleted Merged ✓ deleted Merged ✓ Merge: 2 merges successful ✓ ACCOUNT DUPLICATES Compute → Detect → Merge FindDuplicates API · SIRET grouping · Sales + Data

Solution

  • Détection automatique des doublons basée sur des règles configurables
  • Interface de comparaison côte à côte des enregistrements candidats
  • Fusion intelligente avec sélection des valeurs à conserver par champ
  • Traitement en masse pour les campagnes de nettoyage de données

Architecture

  • FindDuplicates API + DuplicateRecordSet natif : le calcul des doublons se fait en parallèle sans verrouiller les enregistrements (0 "unable to lock row"), contrairement aux approches classiques qui mettent à jour les enregistrements eux-mêmes
  • LWC avec interface de comparaison interactive
  • Support du merge natif Salesforce avec gestion des enregistrements liés
  • Composant réutilisable, applicable à tout objet standard ou personnalisé

Impact

  • 1 981 demandes de fusion traitées depuis la mise en production (14/jour en moyenne)
  • Avant : le commercial devait ouvrir chaque Opportunity, naviguer vers le compte, vérifier la vue standard "Duplicates", puis trouver manuellement les comptes à fusionner : processus en ~7 minutes par doublon
  • Après : tous les doublons présentés directement depuis le composant, merge en 2 clics, estimé ~2 minutes. Gain de ~5 min/merge × 14 merges/jour = ~70 minutes économisées par jour pour l'équipe commerciale

Account Duplicates: Technical Deep Dive

Automated account duplicate detection combining Salesforce native fuzzy matching (FindDuplicates API) with custom matching rules (SIRET normalization, company name normalization). Scan pipeline identifies duplicate groups and assesses merge eligibility based on configurable rules.

Architecture: Batch scan pipeline → DuplicateRecordItem creation → Group assessment → Merge eligibility check. Handles edge cases like partial matches and subsidiary relationships.

Portfolio presentation includes: An interactive demo (demos/Account_Duplicates/index.html) with duplicate detection simulation and merge workflow. An animated SVG walkthrough with 7 steps: ① Sales connection to empty merge tool, ② Compute pipeline execution, ③ Duplicate records loading, ④ Group assessment, ⑤ Checkbox selection per account, ⑥ Merge execution with strikethrough, ⑦ Big Picture. Card metrics: 1,981 merge requests, 14/day average, ~5 min saved per merge.

FTE Account Assignments

1 400 comptes/mois assignés automatiquement

Chaque lundi, environ 300 comptes doivent être distribués entre 16 SDR de 4 pays, proportionnellement à leurs objectifs et en comblant les déficits. Avant : 4h sur Google Sheets. Maintenant : un traitement par lots automatique avec gestion de versions mensuelle et retour arrière possible par pays.

4 pays 16 SDRs Automatisation hebdo Versioning mensuel
→ Remplace 4h de travail manuel hebdomadaire sur Google Sheets
16SDRs couverts
1400comptes/mois
4pays
Scheduled Batch Queueable Deficit Algorithm Multi-country LWC SOQL
FTE Params · Mars 2026 SDR Pays T1Q T2Q T3Q T1R T2R T3R Hebdo Cap Alex Dupont FR Obj. 15 10 8 10 8 3 54 75 Pip. 12 7 5 8 6 2 40 Alex Dupont DE Obj. 8 5 3 6 4 2 28 30 Pip. 6 3 2 5 3 1 20 Marie Martin FR Obj. 18 12 8 12 8 4 62 75 Pip. 14 9 6 10 6 3 48 Tom Garcia IT Obj. 15 10 5 10 6 3 49 65 Pip. 11 8 4 8 5 2 38 Lucas Schmidt DE Obj. 20 15 10 14 10 6 75 90 Pip. 14 10 7 10 7 4 52 batch 5 SDR configurés · 4 pays Julie R. NEW FR Obj. 12 8 5 8 5 2 40 60 Pip. 0 0 0 0 0 0 0 Sauvegarder En cours... ✓ 6 SDR sauvegardés +Julie R. : Save Batch Hebdo · Lundi 4h Exécution hebdomadaire ✓ Chargement paramètres ✓ Récup pool comptes (SOQL) ✓ Calcul des déficits ✓ Priorité par déficit ✓ Assignation par tier et type Calcul des déficits SDR Pipe Cap Déficit Hebdo Julie R. FR NEW ←MAX 0 60 60 40 Lucas Schmidt DE 52 90 38 75 Alex Dupont FR 40 75 35 54 Marie Martin FR 48 75 27 62 Tom Garcia IT 38 65 27 49 Alex Dupont DE 20 30 10 28 ✓ 67 comptes assignés Julie R. Q:18 R:8 Lucas S. Q:12 R:3 Alex D. FR Q:8 R:2 Marie M. Q:5 R:2 Tom G. Q:4 R:1 Alex D. DE Q:3 R:1 Batch : 67 comptes FTE MANAGER Params → Batch → Assign 6 SDR · 4 pays · 67 comptes FTE Params · March 2026 SDR Country T1Q T2Q T3Q T1R T2R T3R Wkly Cap Alex Dupont FR Tgt. 15 10 8 10 8 3 54 75 Cur. 12 7 5 8 6 2 40 Alex Dupont DE Tgt. 8 5 3 6 4 2 28 30 Cur. 6 3 2 5 3 1 20 Marie Martin FR Tgt. 18 12 8 12 8 4 62 75 Cur. 14 9 6 10 6 3 48 Tom Garcia IT Tgt. 15 10 5 10 6 3 49 65 Cur. 11 8 4 8 5 2 38 Lucas Schmidt DE Tgt. 20 15 10 14 10 6 75 90 Cur. 14 10 7 10 7 4 52 batch 5 SDRs configured · 4 countries Julie R. NEW FR Tgt. 12 8 5 8 5 2 40 60 Cur. 0 0 0 0 0 0 0 Save Loading... ✓ 6 SDRs saved +Julie R.: Save Weekly Batch · Monday 4am Weekly execution ✓ Loading parameters ✓ Fetch account pool (SOQL) ✓ Deficit calculation ✓ Priority by deficit ✓ Assignment by tier and type Deficit calculation SDR Pipe Cap Deficit Wkly Julie R. FR NEW ←MAX 0 60 60 40 Lucas Schmidt DE 52 90 38 75 Alex Dupont FR 40 75 35 54 Marie Martin FR 48 75 27 62 Tom Garcia IT 38 65 27 49 Alex Dupont DE 20 30 10 28 ✓ 67 accounts assigned Julie R. Q:18 R:8 Lucas S. Q:12 R:3 Alex D. FR Q:8 R:2 Marie M. Q:5 R:2 Tom G. Q:4 R:1 Alex D. DE Q:3 R:1 Batch: 67 accounts FTE MANAGER Params → Batch → Assign 6 SDRs · 4 countries · 67 accounts

Solution

  • Paramétrage par FTE et par pays via objet personnalisé versionné : Effective_Date mensuelle, historique complet conservé
  • Ensemble de comptes filtré par type (Queued/Recycling) et Tier (1/2/3) via SOQL paramétré, aucun compte doublonné
  • Algorithme déficit : quota − pipeline actuel = capacité restante. SDR le plus éloigné de son objectif = priorité maximale
  • Rapport CSV automatique par email à chaque exécution : qui reçoit quoi, par pays et par type

Architecture

  • Chaîne Schedulable → Batch → Queueable : SCH orchestre, BAT met à jour les Account en masse, QUE gère les effets secondaires
  • 1 SOQL pour tous les FTEs via `getAccountsCountPerFTES()` : évite le N+1 sur le calcul des pipelines
  • Objet paramètre avec clé composite {FTE_ID}_{YEAR}_{MONTH}_{COUNTRY} : gestion de versions native, retour arrière possible par date
  • LWC de configuration avec grille éditable par FTE/pays/Tier, déclenchement manuel possible (contournement du planificateur)

Impact

  • Remplace 4h de travail manuel hebdomadaire sur Google Sheets : assignation compte par compte, maintenant 0 intervention
  • 1 400 comptes assignés chaque mois, répartis entre 16 SDR sur 4 pays
  • Zéro doublon d'assignation, zéro oubli de pays : garantis par l'algorithme, vérifiables dans le CSV de log
  • Historique complet : chaque mois les ratios Queued/Recycling et quotas sont versionnés, auditables à tout moment

FTE Account Assignments: Technical Deep Dive

FTE-based account assignment system with monthly versioning and deficit-based algorithm. Manages account territories across multiple countries with automatic redistribution when FTE allocations change. External key pattern: {FTE_ID}_{YEAR}_{MONTH}_{COUNTRY} enables rollback by effective date.

Architecture: FTE_Accounts_Assignment_Parameter__c with versioning, batch processing for monthly recalculation, LWC dashboard for parameter management.

Portfolio presentation includes: An interactive demo (demos/FTE_Assignment/index.html) with SDR parameter configuration and batch simulation. An animated SVG walkthrough with 4 steps: ① Existing SDR table with Target/Current dual rows per SDR across 6 tiers (T1-T3 Queued + T1-T3 Recycling), ② New SDR addition + save, ③ Weekly batch execution with deficit calculation and priority-based assignment, ④ Big Picture with compacted view. Card metrics: 16 SDRs covered, 1,400 accounts/month, 4 countries.

Des outils interconnectés, pas isolés
Ces solutions couvrent trois domaines complémentaires et partagent des fondations architecturales communes.

Lead Lifecycle : De l'acquisition à la conversion

Lead Company Info
Touchpoint reçu → matching personne/entreprise → création ou rattachement LCI. Une personne, N entreprises, 0 duplicat.
LAM Editor
Lead assigné → évaluation des critères d'audience, match avec une règle d'assignation
TMM
Audience liée à un Assignment Group → assignation au membre le plus en retard par rapport à son % cible
Lead Company Info
Conversion → assistant multi-entreprise : chaque LCI crée son propre Account/Contact/Opportunity

Assignation et planification de capacité

TMM : Absences
Membre absent ? Comptabilisation virtuelle maintenue, réactivation automatique au retour sans surcharge
AsyncCollector
Orchestre tous les jobs en arrière-plan sans conflits ni doublons (LAM, TMM, LCI, partnerships...)

Qualité & Traçabilité des données

Account Duplicates
Détection, comparaison et fusion des doublons entre comptes Sales et Data
Enhanced History
Traçabilité complète : qui a fait quoi, quand, et comment (UI, API, Flow...)
CIOConnect
Synchronisation pilotée par les métadonnées vers Customer.io via Segment : champs, relations, filtres, 60k+ synchronisations, 0 crash

Migration & Gestion CPQ

CPQ Import Suite
Import historique post-acquisition, gestion de bundles, résolution de conflits, remises par gamme

Ecosystem: How the 9 tools connect

The portfolio includes a visual pipeline section showing how all 9 tools are interconnected across 4 use cases:

Décisions d'architecture
Quatre décisions techniques réelles : l'alternative rejetée, la solution retenue, le compromis assumé.
Un Lead, plusieurs entreprises
Lead Company Info · Qonto

Rupture du modèle 1-Lead-1-Entreprise imposé par Salesforce. Un Lead devient une Personne liée à N entreprises indépendantes, avec rapprochement en deux niveaux pour éviter toute duplication.

Contournement granulaire des automatisations
Bypass Framework · AG2R La Mondiale

Un mécanisme de contournement à granularité fine, par règle de validation, par déclencheur et par méthode. Permet à une intégration lourde de n'exécuter que ce qui la concerne, et à du code Apex de manipuler des données sans déclencher d'effets de bord non voulus. Adopté comme standard sur l'ensemble de la plateforme Sales Cloud.

Migration du modèle partenaires
PRM Migration · Qonto

Migration du modèle partenaires personnalisé vers le standard Salesforce PRM : avec une phase de cohabitation en double écriture (déclencheurs maintenant les deux systèmes synchronisés) pour garantir zéro régression sur les rapports SF et systèmes externes avant toute bascule.

Orchestration asynchrone sans conflits
AsyncCollector · Qonto

Pattern d'orchestration centralisée pour remplacer N planificateurs indépendants : un point de contrôle unique piloté par les métadonnées comme réponse structurelle aux conflits d'exécution parallèle.

Import CSV des plans de livraison
CSV Import · Martin Brower France

Pipeline en deux phases pour 1 500 restaurants : import CSV avec projection des plannings relatifs en dates absolues, règles métier et isolation par restaurant ; puis traitement par lots quotidien orchestrant la chaîne SF ↔ Système logistique ↔ Optimiseur de tournées jusqu'à l'export entrepôts.

Architecture Decisions: 4 key patterns

Stack Technique
Spécialiste Salesforce full-stack, de l'architecture au déploiement.

Apex

  • Motifs de conception (Strategy, Factory, Observer)
  • Optimisation des limites de la plateforme (governor limits)
  • Motifs asynchrones (Batch, Queueable, Platform Events)
  • Architecture pilotée par les métadonnées
  • Génération SOQL dynamique

Lightning Web Components

  • Extensions personnalisées de LightningDatatable
  • Gestion d'état complexe
  • Architecture événementielle
  • Types de cellules personnalisés
  • Conception native SLDS

Architecture

  • Conception de moteurs de règles
  • Théorie des ensembles appliquée au métier
  • Structures de données récursives
  • Algèbre d'intervalles et analyse des écarts
  • Gestion des champs polymorphiques

Modélisation de données

  • Hiérarchies auto-référencées
  • Relations polymorphiques
  • Patterns de versioning
  • Optimisation du modèle de partage

Outillage et DevOps

  • Développement assisté par IA
  • SFDX / Salesforce CLI
  • Gestion de versions Git
  • Chaînes d'intégration et de déploiement continus (CI/CD)

Philosophie

  • Le modèle de données d'abord : une mauvaise fondation ne se refactorise pas en production
  • Scalabilité, gouvernance, observabilité dès la conception : jamais en rattrapage
  • Chaque compromis documenté : les décisions silencieuses coûtent cher
  • Du tableau blanc à la production : j'implémente ce que je conçois

Technical Skills

Salesforce: Apex (advanced patterns, governor limits optimization), LWC, Flows, SOQL/SOSL, Platform Events, Change Data Capture, Custom Metadata, Sharing Rules, Bulk API 2.0. Architecture: Rules engines, async orchestration, metadata-driven design, interval algebra, polymorphic type systems. Frontend: LWC, JavaScript, HTML/CSS, SVG animations. Integration: REST API, Segment, Customer.io, Odoo. Tools: Git, VS Code, Salesforce CLI, Dataloader. Methodologies: Agile/Scrum, Design Authority governance.

Mon Parcours

Titulaire d'un master en ingénierie informatique (Efrei, France, 2015), cursus suivi en anglais, ma trajectoire est celle d'une responsabilité architecturale croissante : du Tech Lead qui conçoit son premier modèle de données, au membre de Design Authority qui arbitre les décisions transverses d'un programme multi-équipes, jusqu'à l'architecte qui conçoit un écosystème complet depuis la première ligne.

Ce qui m'a ancré sur Salesforce : l'exigence architecturale irréductible de la plateforme. Governor limits, multi-tenancy, absence de threads : ces contraintes ne tolèrent pas les approximations de conception. Chaque décision a un coût mesurable en production, et c'est exactement là où je me positionne.

Les environnements les plus contraints sont ceux qui m'ont le plus appris. Chez AG2R La Mondiale, assureur national de 15 000 collaborateurs, j'étais l'un des trois membres de la Design Authority : chaque décision d'architecture transverse y était arbitrée en séance hebdomadaire, et validée avant tout déploiement en production. Plus tard, chez Qonto, la migration du modèle partenaires vers le standard PRM a exigé une phase de double écriture pour prouver la parité chiffre à chiffre avant toute bascule. Traçabilité, gouvernance, réversibilité : je considère ces exigences comme des données du problème, pas comme des freins.

2015-2018 : Dassault Systèmes

Premiers pas en architecture applicative : référent technique sur Biovia Content Manager, conception d'une application mobile de gestion de contacts. Début d'une approche structurée de la conception logicielle.

2018-2021 : Martin Brower France

Premier rôle d'architecte Salesforce : conception du modèle de données, architecture d'un pipeline d'import pour ~1 500 restaurants (API personnalisée, retour arrière unitaire par restaurant, chaînage de jobs, Bulk API 2.0). Premières décisions structurantes : faire ou acheter.

2021-2023 : AG2R La Mondiale et Criteo (via Texeï)

Design Authority transverse chez AG2R La Mondiale : arbitrages d'architecture multi-équipes, gouvernance des décisions techniques, validation des livraisons de l'équipe via Copado, y compris sur la couche Salesforce Industries (Vlocity) Insurance. Mission internationale chez Criteo.

2023-présent : Qonto

Architecte Salesforce : conception de l'écosystème technique interne depuis zéro. Décisions structurantes : modèle Lead multi-entreprises (LCI), orchestrateur asynchrone piloté par les métadonnées (AsyncCollector), migration du modèle PRM personnalisé → standard Salesforce.

2026 : Application Architect (certifié)

Certifications obtenues : Platform Developer I, Platform App Builder, Platform Data Architect, Platform Sharing and Visibility Architect, la certification combinée Application Architect, et Platform Identity and Access Management Architect. Prochaine étape : la certification combinée System Architect (reste Development Lifecycle & Deployment et Integration Architect).

Projets Personnels
Des projets construits en dehors de l'écosystème Salesforce, pour des utilisateurs réels. Pile technique différente, même discipline : si l'interface n'est pas claire, les gens arrêtent simplement de s'en servir.

Surprise Calendar

Projet entrepreneurial

Plateforme de calendriers-surprises virtuels. Animations d'ouverture interactives (Stargate, Pong, roulette...), fonds animés en Canvas2D, système de plugins, éditeur WYSIWYG. Calendriers de l'avent, surprises quotidiennes, one-shots.

JavaScript ES6 Canvas2D PHP OOP 17 animations
Essayer

Gravity

Jeu physique interactif

Jeu de gravité construit sur Matter.js. Système de fusions (12 types), monstres, obstacles, thèmes visuels et sonores, physique réaliste.

Matter.js Canvas2D Physics Engine ~22K lignes
Essayer

Piano Magique

Application éducative pour enfants

Piano interactif avec effets visuels, multi-modes de jeu et interface tactile adaptée aux enfants. Conçu comme outil ludique d'éveil musical.

Web Audio API CSS Animations Touch Events
Essayer

Career Timeline

Discutons de votre projet
Preview
① Règle ② Aud. ③ Crit. ④ Lead ⑤ Eval. ⑥ Assign. Big Pic.
① Règle