Senior Salesforce Architect

Adrien Valentin

J'architecture et je livre les systèmes qui passent à l'échelle.

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 data model au déploiement, end-to-end.

11+
Années d'ingénierie
8+
Années Salesforce
9
Systèmes en prod
0
Crash en production
129K+

Traitement à haut volume

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

LCI créés — modèle 1 Lead → N entreprises qui casse la contrainte native. 587 opportunités générées, 71 Closed Won. 96 champs trackés sur 4 objets avec traçabilité UI/API/Flow/Batch.

LCIEnhanced History
1 440

Async sans downtime

exécutions/jour, 0 crash depuis 10 mois. 5 jobs orchestrés par un seul entry point metadata-driven. 60K+ syncs SF→Customer.io via Segment, configuration 100% déclarative.

AsyncCollectorCIOConnect
4 pays

Opérations multi-pays

16 SDRs (FR, ES, DE, IT), 1 400 comptes/semaine distribués automatiquement. Algorithme déficit-weighted avec versioning mensuel. Remplace 4h de travail manuel hebdomadaire.

FTETMM

What I Solve — 4 Core Problem Domains

Architecte & Builder

À 33 ans, je cumule plus d'une décennie d'ingénierie logicielle dont huit années sur Salesforce. Mon parcours m'a confronté à des problématiques d'architecture croissantes — d'une application de planification transport pour un logisticien national, à la gouvernance d'un programme multi-équipes chez un assureur, jusqu'à la conception d'un écosystème complet d'outils internes pour une fintech européenne. Ce fil rouge : résoudre des problèmes business par des choix techniques structurants, et les implémenter jusqu'en production.

Ce qui me différencie : je ne sépare pas l'architecture de l'implémentation. Chaque système présenté ici a été conçu, arbitré, construit et mis en production par mes soins — moteur de règles à N dimensions, orchestrateur asynchrone metadata-driven, refonte de data model PRM du custom vers le standard. Je porte les projets de la vision jusqu'au déploiement.

Depuis 2024, j'intègre l'IA comme levier d'implémentation, en conservant la maîtrise complète des décisions d'architecture et de design. La vision reste humaine, l'exécution est accélérée.

Père de trois enfants, 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 data model en production
3 enfants
motivation quotidienne
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

Système qui dissocie la personne de l'entreprise dans le CRM. 1 Lead = 1 Personne → N Company Infos. Matching intelligent, auto-conversion multi-path, conversion wizard custom. Architecturé et déployé en <1 mois.

Multi-entreprise Conversion automatique Matching intelligent Attribution partenaire
→ 71 deals récupérés, 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 trackant entreprise, SIRET, source, partenaire
  • Matching 2 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)
  • Wizard conversion multi-company : Account matching SIRET/fuzzy, détection occupancy, KYB validation
  • Attribution partenaire préservée par company info indépendante

Architecture

  • 6 trigger handlers interconnectés (Touchpoint, LCI, Lead, Contact, Account, Batch)
  • Duplicate Rules avec conditions spécifiques (préfixe AUTOMATION) pour exploiter le fuzzy matching natif SF sans impacter le runtime — l'intelligence est dans les règles, pas dans le code
  • LWC wizard 3 étapes avec accordions par company 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 trigger handlers, 2 LWC, 1 batch, duplicate rules)
  • 3 188 LCI créés (66/jour), 587 opportunités générées grâce au système, dont 71 Closed Won — des deals qui auraient été perdus dans l'ancien modèle
  • 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 tracke sa source indépendamment, 100% des referrals crédités

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 (66/day), 587 opportunities generated, 71 Closed Won. 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. 100% hand-coded.

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, 71 Closed Won.

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
  • Gap Analysis par inversion ensembliste — détecte les populations non couvertes
  • Validation croisée inter-règles — overlaps, 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 : IntervalleType avec implémentations par type
  • CriteriaMapper pour transformation bidirectionnelle données ↔ UI
  • LWC avec extension custom 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

Outil de capacity management pour managers : groupes, pondérations, assignation par déficit, virtual accounting et sync calendrier 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 objets · 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 custom 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
→ Audit trail complet — 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 custom object 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 custom
  • 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

Sync SF → Customer.io

Synchronisation metadata-driven de Salesforce vers Customer.io via Segment. Configuration 100% déclarative. Dual sync : batch + real-time.

Zéro code requis Batch + Temps réel Config admin 60K+ syncs
→ Admins ajoutent un champ sync en 5 min — zéro déploiement de code
60k+synchros depuis 2024
15 minintervalle batch
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% déclaratif · 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 metadata-driven — zéro code à modifier pour ajouter un champ
  • Dual sync : batch toutes les 15 min + real-time
  • Support champs directs, lookups, relations avec filtres et tri
  • Moteur de filtres récursif (AND/OR/parenthèses)

Architecture

  • Flag SyncCIO__c par trigger sur changement de champ configuré
  • Scheduler collecte les records flaggés (fenêtre 15 min)
  • SOQL dynamique avec subqueries depuis CIO_connect__mdt
  • 100% codé manuellement — 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. 100% hand-coded without AI.

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

Orchestrateur metadata-driven qui empêche les conflits entre jobs asynchrones, gère les délais et le monitoring. 100% codé manuellement.

5 jobs orchestrés 0 crash Retry automatique Config déclarative
→ Remplace 5 jobs indépendants — 0 crash depuis 10 mois
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
  • Monitoring et logging intégrés

Architecture

  • Pattern metadata-driven : configuration déclarative des jobs
  • Gestion d'état persistante via Custom Objects
  • Mécanisme de lock et de queue pour l'ordonnancement
  • 100% codé manuellement (sans IA)

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 EU 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. 100% hand-coded without AI.

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

Suite complète de gestion d'import/export pour Salesforce CPQ : migration legacy depuis Odoo, gestion de bundles hiérarchiques, résolution intelligente de conflits et remises par gamme. Projet évolutif, encore en développement actif.

Migration ERP Résolution de conflits Bundles & Gammes Rollback par record
→ 3 ans en production — 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 legacy 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 legacy, sync bundles, export, suppressions, remises
  • DML chunké par lots de 200 pour respecter les governor limits
  • Parseur CSV caractère par caractère avec auto-détection du séparateur
  • Interface wizard en 4 étapes : upload → vérification → récapitulatif → résultat

Impact

  • Catalogue importé : 61 bundles, 350 features, 1 167 produits (768 options + 352 composants + 47 DEEE) — depuis un fichier CSV legacy avec 3 lignes de headers et formules Excel
  • Contexte : intégration post-acquisition d'un fabricant de mobilier technique, migration du catalogue produit legacy 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

Robust CSV import pipeline for Salesforce CPQ data. Handles ~1,500 restaurant records with per-record rollback capability, job chaining, and Bulk API 2.0 integration. Built for Martin Brower France's restaurant onboarding process.

Architecture: CSV parsing → validation → conflict detection → selective import with rollback per restaurant. Handles Product2, PricebookEntry, and custom objects. 3 years in production with 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

Outil de détection et de résolution des doublons de comptes et contacts. Interface visuelle pour comparer, fusionner et nettoyer les données en masse.

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étect → 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 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 Blocked Opp Marc L. GROUPE 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 → Détect → 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 : compute en parallèle sans verrouiller les records (0 "unable to lock row")
  • 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 custom

Impact

  • 1 981 merge requests traitées depuis le go-live (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

Distribution automatique de comptes outbound

Automatisation hebdomadaire de l'assignation de comptes aux SDRs. Remplace 4h de travail manuel sur Google Sheets. Algorithme déficit-weighted, multi-pays FR/DE/IT/ES, Tier 1/2/3 Queued + Recycling. Développé sans IA.

4 pays 16 SDRs Automatisation hebdo Versioning mensuel
→ Remplace 4h de travail manuel hebdomadaire sur Google Sheets
16SDRs couverts
1400comptes/semaine
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 Pays T1Q T2Q T3Q T1R T2R T3R Hebdo 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 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 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 custom versioned — Effective_Date mensuelle, historique complet conservé
  • Pool 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
  • Reporting CSV automatique par email à chaque exécution — qui reçoit quoi, par pays et par type

Architecture

  • Chain Schedulable → Batch → Queueable : SCH orchestre, BAT met à jour les accounts en bulk, QUE gère les side-effects
  • 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} — versioning natif, rollback possible par date
  • LWC de configuration avec grille éditable par FTE/pays/Tier, déclenchement manuel possible (bypass scheduler)

Impact

  • Remplace 4h de travail manuel hebdomadaire sur Google Sheets — assignation compte par compte, maintenant 0 intervention
  • 300 comptes assignés chaque lundi, équitablement répartis entre 16 SDRs sur 4 pays (FR×6, ES×7, DE×2, IT×1)
  • 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/week, 4 countries (FR×6, ES×7, DE×2, IT×1).

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 → wizard multi-company : chaque LCI crée son propre Account/Contact/Opportunity

Assignation & Capacity Planning

TMM — Absences
Membre absent ? Comptabilisation virtuelle maintenue, réactivation automatique au retour sans surcharge
AsyncCollector
Orchestre tous les jobs background sans conflits ni doublons (LAM, TMM, LCI batch, 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 metadata-driven vers Customer.io via Segment — champs, relations, filtres, 60k+ synchros, 0 crash

Migration & Gestion CPQ

CPQ Import Suite
Import legacy 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 matching en deux niveaux pour éviter toute duplication.

Migration du modèle partenaires
PRM Migration · Qonto

Migration du modèle partner custom vers le standard Salesforce PRM — avec une phase de cohabitation dual-write (triggers maintenant les deux systèmes en sync) pour garantir zéro régression sur les reportings SF et systèmes externes avant toute bascule.

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

Concevoir un pipeline d'intégration tolérant aux pannes pour des CSV à plannings relatifs — le choix d'une API custom avec découpage par unité métier face à l'impossibilité de reprise partielle des outils natifs.

Orchestration asynchrone sans conflits
AsyncCollector · Qonto

Pattern d'orchestration centralisée pour remplacer N schedulers indépendants — un point de contrôle unique metadata-driven comme réponse structurelle aux conflits d'exécution parallèle.

Architecture Decisions — 4 key patterns

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

Apex

  • Design patterns (Strategy, Factory, Observer)
  • Optimisation des governor limits
  • Patterns asynchrones (Batch, Queueable, Platform Events)
  • Architecture metadata-driven
  • Génération SOQL dynamique

Lightning Web Components

  • Extensions custom de LightningDatatable
  • Gestion d'état complexe
  • Architecture événementielle
  • Custom cell types
  • Design natif 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 & gap analysis
  • 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 & DevOps

  • Développement assisté par IA
  • SFDX / Salesforce CLI
  • Gestion de versions Git
  • Pipelines CI/CD

Philosophie

  • Data model first — une mauvaise fondation ne se refactorise pas en prod
  • Scalabilité, gouvernance, observabilité by design — jamais en retrofit
  • Chaque trade-off documenté — les décisions silencieuses coûtent cher
  • De la whiteboard à la prod : j'implémente ce que j'architecture

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

Diplômé de l'EFREI en 2015, ma trajectoire est celle d'une responsabilité architecturale croissante — du Technical Lead qui conçoit son premier modèle de données, au 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 design. Chaque décision a un coût mesurable en production, et c'est exactement là où je me positionne.

Ma spécificité : je ne dissocie pas la réflexion architecturale de l'implémentation. Je conçois, j'arbitre, je construis et j'assume les décisions en production. Depuis 2024, j'intègre l'IA comme levier d'accélération, en conservant la maîtrise complète des choix d'architecture.

2015-2018 — Dassault Systèmes

Développeur Web & Mobile. Team leader technique, architecture du projet Biovia Content Manager, application mobile de gestion des contacts.

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 custom, rollback unitaire par restaurant, chaînage de jobs, Bulk API 2.0). Premières décisions structurantes build vs buy.

2021-2023 — AG2R La Mondiale & Critéo (via Texeï)

Design Authority transverse chez AG2R La Mondiale — arbitrages d'architecture multi-équipes, gouvernance des décisions techniques, Vlocity Insurance, Copado. Mission internationale chez Critéo.

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 metadata-driven (AsyncCollector), migration du modèle PRM custom → standard Salesforce.

En cours — Certifications Architecte

Parcours de certification : Platform Developer I → App Builder → Data Architecture → Sharing & Visibility → Application Architect → System Architect.

Projets Personnels
Quand je ne suis pas sur Salesforce, je construis des choses pour le plaisir — et parfois pour entreprendre.

Surprise Calendar

Projet entrepreneurial 100% sans IA

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 Développé avec IA

Jeu de gravité basé sur Matter.js. Système de fusions (12 types), monstres, obstacles, thèmes visuels et sonores, physics-based gameplay. Direction créative et supervision complète du développement.

Matter.js Canvas2D Physics Engine ~22K lignes
Essayer

Piano Magique

Application éducative pour enfants Développé avec IA

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

Me retrouver
Preview
① Règle ② Aud. ③ Crit. ④ Lead ⑤ Eval. ⑥ Assign. Big Pic.
① Règle