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>
186 lines
8.2 KiB
Markdown
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é. ✅
|