# Déploiement Cloudflare Worker — Welcome cron MVA Ce Worker fait deux choses : 1. **Proxy HubSpot** (déjà fonctionnel — vérification doublon + numéro de référence) 2. **Cron Welcome** (NOUVEAU — envoie l'email de bienvenue **après** que le client a cliqué sur "Confirmer" dans le mail HubSpot de double opt-in) L'email de bienvenue contient le **numéro de référence client** ET (à ajouter dans le template EmailJS) **l'adresse du dépôt à Paris**. Ces infos ne sont **jamais** envoyées avant validation de l'email — protection contre les bots et les expéditions de cartons vides. --- ## Étapes de déploiement (10 min) ### 1. Mettre à jour le code du Worker 1. Aller sur https://dash.cloudflare.com/ 2. Workers & Pages → cliquer sur **`mva-hubspot-proxy`** 3. Onglet **Modifier le code** (ou *Quick edit*) 4. Tout sélectionner et remplacer par le contenu de `cloudflare-worker/hubspot-proxy.js` (de ce repo) 5. Cliquer **Déployer / Save and deploy** ### 2. Variables d'environnement Dans **Paramètres → Variables et secrets**, ajouter (si pas déjà là) : | Nom | Valeur | |-----|--------| | `HUBSPOT_TOKEN` | `pat-eu1-...` (existant — vérifier que le scope est read+write contacts) | | `EMAILJS_PUBLIC_KEY` | `8KUlaQ7BDVIbkZRyP` | | `EMAILJS_SERVICE_ID` | `service_aeamo3x` | | `EMAILJS_TEMPLATE_ID` | `template_s1kr2et` | | `PARIS_DEPOT_ADDRESS` | **Ton adresse exacte à Paris** (rue, code postal, ville, étage, nom à indiquer sur le carton…) | ⚠️ **`PARIS_DEPOT_ADDRESS`** est l'info la plus sensible — c'est l'adresse que tu veux protéger. Elle ne quitte jamais Cloudflare/EmailJS et n'arrive au client que dans le mail de bienvenue, qui n'est envoyé qu'aux contacts qui ont confirmé leur email. > Si une variable n'est pas définie, le Worker utilise le fallback hardcodé. ### 3. Stockage KV (idempotence — empêche de spammer le welcome) Dans **Paramètres → Stockage et bases de données → Bindings KV** : 1. Cliquer **Ajouter un binding** 2. Variable name : **`WELCOME_KV`** 3. Namespace : **Créer** un nouveau namespace nommé `mva-welcome-tracker` 4. Sauvegarder ### 4. Cron Trigger — toutes les 5 minutes Dans **Paramètres → Déclencheurs (Triggers) → Cron Triggers** : 1. Cliquer **Add Cron Trigger** 2. Schedule : `*/5 * * * *` 3. Sauvegarder ### 5a. EmailJS — mettre à jour le template pour inclure l'adresse Paris 1. Aller sur https://dashboard.emailjs.com/admin/templates 2. Cliquer sur le template `template_s1kr2et` 3. Modifier le contenu pour inclure les variables suivantes : - `{{firstname}}` — prénom du client - `{{reference_client}}` — sa référence (ex : `MVA-001`) - `{{paris_address}}` — l'adresse complète du dépôt à Paris 4. Exemple de corps d'email recommandé : ``` Bonjour {{firstname}}, Bienvenue chez MVA Global Fret ! Votre inscription est confirmée. ══════════════════════════════════════════════ VOTRE NUMÉRO DE RÉFÉRENCE CLIENT {{reference_client}} ══════════════════════════════════════════════ Conservez précieusement ce numéro — il vous permet de suivre vos colis et nous facilite la prise en charge. 📦 ADRESSE DU DÉPÔT À PARIS {{paris_address}} ⚠️ Important : indiquez bien votre numéro de référence ({{reference_client}}) sur chaque colis que vous nous envoyez. Cela nous permet de vous identifier rapidement. Pour toute question, contactez-nous via Messenger ou par WhatsApp. — L'équipe MVA Global Fret +261 38 49 737 51 ``` 5. Sauvegarder le template ### 5b. EmailJS — autoriser les appels serveur (CRITIQUE) Sans cette étape, le Worker ne pourra pas envoyer les emails (erreur 403). 1. Aller sur https://dashboard.emailjs.com/admin/account 2. Onglet **Security** 3. Décocher **"Allow EmailJS API for non-browser applications"** - Le terme est trompeur : décocher autorise les appels serveur - (Cocher = bloquer les appels serveur pour anti-spam) 4. Sauvegarder ### 6. Vérifier le scope HubSpot Le token HubSpot doit avoir : - ✅ `crm.objects.contacts.read` - ✅ `crm.objects.contacts.write` (NOUVEAU — pour mettre à jour la propriété en cas de besoin) - ✅ `crm.lists.read` (déjà bon) Si tu obtiens des erreurs 403, regénère le token sur https://app-eu1.hubspot.com/private-apps/148163754/ --- ## Test manuel Une fois tout déployé, tu peux forcer une exécution du cron sans attendre 5 min : ```bash curl -X POST https://mva-hubspot-proxy.mvaglobalfret.workers.dev \ -H "Content-Type: application/json" \ -d '{"action":"triggerWelcomeQueue"}' ``` Réponse attendue : ```json { "ok": true, "stats": { "scanned": 3, "sent": 1, "skipped": 2, "errors": 0 } } ``` - `scanned` : combien de contacts confirmés ont été inspectés - `sent` : combien d'emails de bienvenue ont été envoyés cette fois-ci - `skipped` : déjà envoyés précédemment (KV tracking) - `errors` : envois qui ont échoué --- ## Logs en production Cloudflare → ton Worker → **Logs (en temps réel)** : tu verras chaque exécution cron avec les stats. --- ## En cas de problème | Symptôme | Cause probable | Fix | |---|---|---| | `EmailJS 403: API access disabled` | Étape 5 pas faite | Décocher "Allow API for non-browser" sur EmailJS | | `HubSpot 403` | Token n'a pas le scope write | Regénérer token avec scope contacts.write | | `HubSpot 401` | Token invalide / expiré | Regénérer un Private App token | | Le cron ne tourne pas | Cron trigger pas activé | Vérifier *Triggers → Cron Triggers* | | KV: `env.WELCOME_KV is undefined` | Binding pas créé | Vérifier *Storage & Databases → KV bindings* | | Aucun email envoyé même après confirmation | Le filtre HubSpot ne matche pas | Inspecter dans Logs : voir si `searchConfirmedContacts` retourne des résultats | --- ## Architecture finale ``` ┌──────────────────────────────────────────────────────────────────┐ │ 1. User remplit le formulaire sur contact.html │ │ ↓ │ │ 2. form-handler.js soumet à HubSpot (Forms API) │ │ ↓ │ │ 3. HubSpot crée le contact AVEC reference_client │ │ ↓ │ │ 4. HubSpot envoie l'email de double opt-in (sujet + bouton │ │ « Confirmer » seulement — PAS la référence ni l'adresse) │ │ ↓ │ │ ─────── User clique sur « Confirmer » ─────── │ │ ↓ │ │ 5. HubSpot met à jour hs_emailconfirmationstatus = CONFIRMED │ │ ↓ │ │ 6. Cron Cloudflare (toutes les 5 min) : │ │ - cherche les contacts CONFIRMED non encore welcomed │ │ - vérifie KV : welcomed:{email} │ │ - envoie email via EmailJS REST API │ │ (template contient : prénom, ref, adresse Paris) │ │ - écrit welcomed:{email} dans KV │ │ ↓ │ │ 7. Le client reçoit son welcome email avec sa référence ET │ │ l'adresse de dépôt à Paris. │ └──────────────────────────────────────────────────────────────────┘ ``` **Conclusion** : il est désormais impossible pour un bot de récupérer ta référence client ou ton adresse Paris sans avoir au préalable un email valide ET cliqué sur le lien de confirmation. Anti-spam blindé. ✅