site-mva-global-fret/cloudflare-worker/DEPLOIEMENT.md
MVA Global Fret 0ef9f01fd9 Worker: cron post-confirmation pour envoyer le welcome email après opt-in
Architecture finale (Option A choisie) :

1. User submit form → contact créé en HubSpot avec reference_client
2. HubSpot envoie l'email de double opt-in (sans la ref ni l'adresse Paris)
3. User clique 'Confirmer' → HubSpot met hs_emailconfirmationstatus = CONFIRMED
4. Cron Cloudflare (toutes les 5 min) :
   - Liste les contacts CONFIRMED + créés après le cutoff
   - Filtre via Cloudflare KV (welcomed:<email>) pour idempotence
   - Envoie le welcome email via EmailJS REST API avec :
     • firstname
     • reference_client
     • paris_address (depuis env var PARIS_DEPOT_ADDRESS)
   - Marque envoyé dans KV avec TTL 1 an

Protection :
- L'adresse du dépôt Paris ne quitte JAMAIS Cloudflare/EmailJS
- Elle n'arrive au client que dans le mail de bienvenue post-opt-in
- Bots qui n'ont pas un vrai email ne peuvent pas valider → ne reçoivent rien
- Anti-spam et anti-cartons-vides blindé

Ajout d'une action 'triggerWelcomeQueue' pour debug/manual run.
Doc complète dans cloudflare-worker/DEPLOIEMENT.md (étapes 1 à 6).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 23:24:26 +02:00

186 lines
8.2 KiB
Markdown

# 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é. ✅