Un formulaire multi-étapes élégant pour collecter les informations manquantes de vos contrats, avec intégration n8n.
- Multi-étapes avec barre de progression : Navigation fluide entre les étapes
- Design moderne et responsive : Fonctionne parfaitement sur mobile et desktop
- Validation en temps réel : Validation des champs (email, numéros, dates)
- Intégration n8n complète : Récupération et soumission via webhooks
- Chargement dynamique : Les champs sont générés automatiquement depuis n8n
- Sécurisé : Support de l'authentification par token et clé API
cd /chemin/vers/votre/dossierCréez un fichier config.js à partir du template :
cp config.example.js config.jsÉditez config.js avec vos vraies valeurs :
const CONFIG = {
webhookGetUrl: 'https://votre-instance-n8n.com/webhook/get-contract',
webhookPostUrl: 'https://votre-instance-n8n.com/webhook/submit-contract',
apiKey: 'votre_cle_api_secrete', // Optionnel
maxFieldsPerStep: 3,
texts: {
title: 'Complétez votre contrat',
subtitle: 'Veuillez renseigner les informations manquantes',
// ... personnalisez les textes
}
};Hébergez les fichiers sur un serveur web. Options recommandées :
Option A : Serveur local (pour test)
# Avec Python 3
python -m http.server 8000
# Avec Node.js (http-server)
npx http-server -p 8000Puis accédez à : http://localhost:8000?token=votre_token_test
Option B : Hébergement gratuit
- Netlify (recommandé)
- Vercel
- GitHub Pages
Important : Assurez-vous que config.js contient vos vraies valeurs et n'est pas committé dans Git.
[Trigger CRM] → [Générer Token] → [Créer URL] → [Envoyer Email]
↓
[GET Webhook] ← Formulaire
↓
[POST Webhook] → [MAJ CRM]
URL : https://votre-instance-n8n.com/webhook/get-contract
Méthode : GET
Paramètre : token (query parameter)
Réponse attendue (JSON) :
{
"contractId": "CONT-2024-001",
"clientName": "Jean Dupont",
"clientEmail": "jean.dupont@example.com",
"fields": [
{
"name": "email",
"label": "Adresse email",
"type": "email",
"required": true,
"value": "",
"placeholder": "exemple@email.com"
},
{
"name": "telephone",
"label": "Numéro de téléphone",
"type": "tel",
"required": true,
"value": "",
"placeholder": "+33 6 12 34 56 78"
},
{
"name": "dateDebut",
"label": "Date de début souhaitée",
"type": "date",
"required": true,
"value": ""
},
{
"name": "budget",
"label": "Budget mensuel (€)",
"type": "number",
"required": false,
"value": "",
"min": 100,
"max": 10000,
"placeholder": "1000"
},
{
"name": "commentaires",
"label": "Commentaires additionnels",
"type": "textarea",
"required": false,
"value": "",
"placeholder": "Vos remarques..."
}
]
}URL : https://votre-instance-n8n.com/webhook/submit-contract
Méthode : POST
Headers :
Content-Type: application/json
Authorization: Bearer votre_cle_api_secrete (si configuré)
Body (JSON) :
{
"token": "abc123xyz",
"contractId": "CONT-2024-001",
"formData": {
"email": "jean.dupont@example.com",
"telephone": "+33 6 12 34 56 78",
"dateDebut": "2024-03-15",
"budget": "2500",
"commentaires": "Je souhaite commencer rapidement"
}
}-
Webhook Node : Configurez le webhook GET
- Path :
/webhook/get-contract - Method : GET
- Path :
-
Function Node : Valider le token et récupérer les données CRM
const token = $input.params.token; // Validez le token (vérifiez dans votre base/CRM) // Récupérez les données du contrat return { contractId: "CONT-2024-001", clientName: "Jean Dupont", clientEmail: "jean.dupont@example.com", fields: [ // Vos champs dynamiques ] };
-
Respond to Webhook : Retournez les données
-
Webhook Node : Configurez le webhook POST
- Path :
/webhook/submit-contract - Method : POST
- Path :
-
Function Node : Traitez les données
const { token, contractId, formData } = $input.body; // Validez le token // Mettez à jour votre CRM avec formData return { success: true, message: "Contrat mis à jour avec succès" };
-
CRM Update Node : Mettez à jour votre CRM
-
Respond to Webhook : Confirmez le succès
| Type | Description | Propriétés optionnelles |
|---|---|---|
text |
Texte simple | placeholder |
email |
Email avec validation | placeholder |
tel |
Téléphone avec validation | placeholder |
number |
Nombre | min, max, placeholder |
date |
Sélecteur de date | - |
textarea |
Zone de texte multi-lignes | placeholder |
Dans votre workflow n8n, générez un token unique pour chaque contrat :
https://votre-domaine.com/index.html?token=abc123xyz456
Envoyez ce lien par email à votre client avec n8n.
Le client clique sur le lien, remplit le formulaire en plusieurs étapes, et soumet.
Les données sont envoyées à votre webhook n8n POST, puis mises à jour dans votre CRM.
Dans config.js :
maxFieldsPerStep: 5, // Changez ce nombreDans config.js, section texts :
texts: {
title: 'Mon titre personnalisé',
subtitle: 'Ma description',
submitButton: 'Valider',
// ...
}Dans styles.css, modifiez les variables CSS :
:root {
--primary-color: #4f46e5; /* Votre couleur principale */
--success-color: #10b981;
/* ... */
}- Token unique : Chaque lien contient un token unique à usage unique
- Validation côté serveur : Validez toujours les données dans n8n
- HTTPS : Utilisez toujours HTTPS en production
- Clé API : Ajoutez une clé API pour sécuriser vos webhooks
- Expiration : Implémentez une expiration de token dans n8n
- Vérifiez que l'URL contient bien
?token=... - Vérifiez que le webhook GET n8n est actif
- Ouvrez la console du navigateur (F12) pour voir les erreurs
- Vérifiez que
config.jsexiste et contient les bonnes URLs
Si vous avez une erreur CORS, configurez les headers dans n8n :
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
- Vérifiez que le webhook POST n8n est actif
- Vérifiez les logs n8n pour voir l'erreur
- Vérifiez que le format des données correspond
Pour toute question, vérifiez :
- La console du navigateur (F12 → Console)
- Les logs n8n
- Les paramètres dans
config.js
/
├── index.html # Structure HTML du formulaire
├── styles.css # Styles et animations
├── script.js # Logique JavaScript
├── config.example.js # Template de configuration
├── config.js # Votre configuration (ignoré par Git)
├── .env.example # Template des variables d'environnement
├── .gitignore # Fichiers à ignorer
└── README.md # Cette documentation
- Intégration de la signature électronique
- Support multi-langues
- Mode hors-ligne avec sauvegarde locale
- Export PDF du contrat complété
Projet personnel - Utilisation libre