Fonction de récupération du panier abandonné avec analyse par Gmail et Google Sheets

Intermédiaire

Ceci est unSocial Mediaworkflow d'automatisation du domainecontenant 13 nœuds.Utilise principalement des nœuds comme If, Set, Code, Wait, Gmail. Fonction de récupération de panier abandonné avec Gmail et analyse Google Sheets

Prérequis
  • Compte Google et informations d'identification Gmail API
  • Point de terminaison HTTP Webhook (généré automatiquement par n8n)
  • Informations d'identification Google Sheets API
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "nodes": [
    {
      "id": "1",
      "name": "Panier Abandonné Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        300
      ],
      "parameters": {
        "path": "cart-abandoned",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1
    },
    {
      "id": "2",
      "name": "Note Adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        140,
        180
      ],
      "parameters": {
        "width": 240,
        "height": 160,
        "content": "## Cart Recovery Config\n\n⚙️ **Customize these settings:**\n- Recovery sequence timing\n- Discount percentages\n- Email templates\n- Exclusion rules"
      },
      "typeVersion": 1
    },
    {
      "id": "3",
      "name": "Paramètres de Récupération",
      "type": "n8n-nodes-base.set",
      "position": [
        440,
        300
      ],
      "parameters": {
        "values": {
          "number": [
            {
              "name": "firstDiscount",
              "value": 10
            },
            {
              "name": "secondDiscount",
              "value": 15
            },
            {
              "name": "finalDiscount",
              "value": 20
            }
          ],
          "string": [
            {
              "name": "fromEmail",
              "value": "sales@your-store.com"
            },
            {
              "name": "baseUrl",
              "value": "https://your-store.com"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4",
      "name": "Qualifier le Panier",
      "type": "n8n-nodes-base.if",
      "position": [
        640,
        300
      ],
      "parameters": {
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.cart_value }}",
              "rightValue": 50
            },
            {
              "operator": {
                "type": "string",
                "operation": "isNotEmpty"
              },
              "leftValue": "={{ $json.customer_email }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "5",
      "name": "Générer les Données de Récupération",
      "type": "n8n-nodes-base.code",
      "position": [
        840,
        300
      ],
      "parameters": {
        "jsCode": "// Generate discount codes for recovery sequence\nconst cartId = $json.cart_id;\nconst customerEmail = $json.customer_email;\nconst timestamp = Date.now();\n\n// Create unique discount codes\nconst codes = {\n  firstCode: `SAVE${$node['Recovery Settings'].json.firstDiscount}-${cartId.slice(-4)}`,\n  secondCode: `SAVE${$node['Recovery Settings'].json.secondDiscount}-${cartId.slice(-4)}`,\n  finalCode: `SAVE${$node['Recovery Settings'].json.finalDiscount}-${cartId.slice(-4)}`\n};\n\n// Calculate recovery schedule\nconst schedules = {\n  firstEmail: new Date(timestamp + 1 * 60 * 60 * 1000).toISOString(), // 1 hour\n  secondEmail: new Date(timestamp + 24 * 60 * 60 * 1000).toISOString(), // 24 hours\n  finalEmail: new Date(timestamp + 72 * 60 * 60 * 1000).toISOString()  // 72 hours\n};\n\nreturn {\n  ...codes,\n  ...schedules,\n  cartData: $json,\n  recoveryId: `recovery_${cartId}_${timestamp}`\n};"
      },
      "typeVersion": 1
    },
    {
      "id": "6",
      "name": "Attendre 1 Heure",
      "type": "n8n-nodes-base.wait",
      "position": [
        1040,
        200
      ],
      "parameters": {
        "unit": "hours",
        "amount": 1
      },
      "typeVersion": 1
    },
    {
      "id": "7",
      "name": "Envoyer le Premier E-mail de Récupération",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1240,
        200
      ],
      "parameters": {
        "sendTo": "={{ $node['Generate Recovery Data'].json.cartData.customer_email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 0; padding: 20px; background-color: #f8f9fa; }\n    .container { max-width: 600px; margin: 0 auto; background: white; border-radius: 10px; padding: 30px; }\n    .header { text-align: center; margin-bottom: 30px; }\n    .product-item { border: 1px solid #eee; padding: 20px; margin: 10px 0; border-radius: 8px; }\n    .cta-button { background: #007bff; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n    .discount { background: #28a745; color: white; padding: 10px; text-align: center; margin: 20px 0; border-radius: 5px; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h2>Your cart is waiting for you! 🛒</h2>\n      <p>Hello {{ $node['Generate Recovery Data'].json.cartData.customer_name }},</p>\n      <p>You left some items in your cart. Don't let them get away!</p>\n    </div>\n    \n    {{#each $node['Generate Recovery Data'].json.cartData.items}}\n    <div class=\"product-item\">\n      <h3>{{ this.name }}</h3>\n      <p>Price: {{ this.price }} €</p>\n      <p>Quantity: {{ this.quantity }}</p>\n    </div>\n    {{/each}}\n    \n    <div class=\"discount\">\n      <h3>🎉 Special offer - 10% discount!</h3>\n      <p>Code: <strong>{{ $node['Generate Recovery Data'].json.firstCode }}</strong></p>\n    </div>\n    \n    <div style=\"text-align: center;\">\n      <a href=\"{{ $node['Recovery Settings'].json.baseUrl }}/cart/{{ $node['Generate Recovery Data'].json.cartData.cart_id }}\" class=\"cta-button\">\n        Complete my order\n      </a>\n    </div>\n    \n    <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n      This offer expires in 24 hours. Hurry up!\n    </p>\n  </div>\n</body>\n</html>",
        "options": {
          "contentType": "html"
        },
        "subject": "You forgot something in your cart 🛒"
      },
      "typeVersion": 1
    },
    {
      "id": "8",
      "name": "Attendre 23 Heures de Plus",
      "type": "n8n-nodes-base.wait",
      "position": [
        1440,
        200
      ],
      "parameters": {
        "unit": "hours",
        "amount": 23
      },
      "typeVersion": 1
    },
    {
      "id": "9",
      "name": "Envoyer le Deuxième E-mail de Récupération",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1640,
        200
      ],
      "parameters": {
        "sendTo": "={{ $node['Generate Recovery Data'].json.cartData.customer_email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 0; padding: 20px; background-color: #f8f9fa; }\n    .container { max-width: 600px; margin: 0 auto; background: white; border-radius: 10px; padding: 30px; }\n    .header { text-align: center; margin-bottom: 30px; }\n    .urgency { background: #dc3545; color: white; padding: 15px; text-align: center; margin: 20px 0; border-radius: 5px; }\n    .cta-button { background: #28a745; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n    .discount { background: #ffc107; color: #212529; padding: 15px; text-align: center; margin: 20px 0; border-radius: 5px; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h2>🚨 Your cart expires soon!</h2>\n      <p>Hello {{ $node['Generate Recovery Data'].json.cartData.customer_name }},</p>\n    </div>\n    \n    <div class=\"urgency\">\n      <h3>⏰ Only a few hours left!</h3>\n      <p>Your cart will be automatically deleted soon</p>\n    </div>\n    \n    <div class=\"discount\">\n      <h3>🎁 Exceptional offer - 15% discount!</h3>\n      <p>Code: <strong>{{ $node['Generate Recovery Data'].json.secondCode }}</strong></p>\n      <p>Valid only for the next 24 hours</p>\n    </div>\n    \n    <div style=\"text-align: center;\">\n      <a href=\"{{ $node['Recovery Settings'].json.baseUrl }}/cart/{{ $node['Generate Recovery Data'].json.cartData.cart_id }}\" class=\"cta-button\">\n        I'll recover my cart now\n      </a>\n    </div>\n    \n    <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n      Your cart total: {{ $node['Generate Recovery Data'].json.cartData.cart_value }} €\n    </p>\n  </div>\n</body>\n</html>",
        "options": {
          "contentType": "html"
        },
        "subject": "Last chance - Your discount is waiting! 💸"
      },
      "typeVersion": 1
    },
    {
      "id": "10",
      "name": "Attendre 48 Heures de Plus",
      "type": "n8n-nodes-base.wait",
      "position": [
        1840,
        200
      ],
      "parameters": {
        "unit": "hours",
        "amount": 48
      },
      "typeVersion": 1
    },
    {
      "id": "11",
      "name": "Envoyer l'E-mail de Récupération Final",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2040,
        200
      ],
      "parameters": {
        "sendTo": "={{ $node['Generate Recovery Data'].json.cartData.customer_email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 0; padding: 20px; background-color: #f8f9fa; }\n    .container { max-width: 600px; margin: 0 auto; background: white; border-radius: 10px; padding: 30px; }\n    .header { text-align: center; margin-bottom: 30px; }\n    .final-offer { background: linear-gradient(45deg, #ff6b6b, #ffa500); color: white; padding: 20px; text-align: center; margin: 20px 0; border-radius: 10px; }\n    .cta-button { background: #dc3545; color: white; padding: 20px 40px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; font-size: 18px; }\n    .testimonial { background: #e9ecef; padding: 15px; margin: 20px 0; border-radius: 5px; font-style: italic; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h2>🔥 Final offer - Don't miss this chance!</h2>\n      <p>{{ $node['Generate Recovery Data'].json.cartData.customer_name }}, this is really your last chance...</p>\n    </div>\n    \n    <div class=\"final-offer\">\n      <h2>🎯 EXCLUSIVE OFFER</h2>\n      <h3>20% DISCOUNT</h3>\n      <p>Code: <strong>{{ $node['Generate Recovery Data'].json.finalCode }}</strong></p>\n      <p>⏰ Expires in 24 hours - Definitely!</p>\n    </div>\n    \n    <div class=\"testimonial\">\n      <p>\"I loved my purchases on this site! Fast delivery and quality products.\" - Sarah M.</p>\n    </div>\n    \n    <div style=\"text-align: center;\">\n      <a href=\"{{ $node['Recovery Settings'].json.baseUrl }}/cart/{{ $node['Generate Recovery Data'].json.cartData.cart_id }}\" class=\"cta-button\">\n        I'll take advantage now!\n      </a>\n    </div>\n    \n    <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n      If you no longer want to receive these emails, <a href=\"#\">click here</a>.\n    </p>\n  </div>\n</body>\n</html>",
        "options": {
          "contentType": "html"
        },
        "subject": "Absolutely last chance - 20% discount! 🔥"
      },
      "typeVersion": 1
    },
    {
      "id": "12",
      "name": "Note Adhésive 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1940,
        60
      ],
      "parameters": {
        "width": 240,
        "height": 160,
        "content": "## Recovery Analytics\n\n📊 **Track performance:**\n- Recovery conversion rates\n- Revenue generated\n- Email open rates\n- Best performing sequences"
      },
      "typeVersion": 1
    },
    {
      "id": "13",
      "name": "Suivi du Début de Récupération",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1040,
        400
      ],
      "parameters": {
        "values": {
          "values": [
            "={{ $node['Generate Recovery Data'].json.recoveryId }}",
            "={{ $node['Generate Recovery Data'].json.cartData.customer_email }}",
            "={{ $node['Generate Recovery Data'].json.cartData.cart_value }}",
            "={{ new Date().toISOString() }}",
            "sequence_started"
          ]
        },
        "resource": "sheet",
        "operation": "appendRow",
        "sheetName": "Cart Recovery Tracking",
        "documentId": "your-google-sheet-id"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "1": {
      "main": [
        [
          {
            "node": "3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3": {
      "main": [
        [
          {
            "node": "4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4": {
      "main": [
        [
          {
            "node": "5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5": {
      "main": [
        [
          {
            "node": "6",
            "type": "main",
            "index": 0
          },
          {
            "node": "13",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6": {
      "main": [
        [
          {
            "node": "7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7": {
      "main": [
        [
          {
            "node": "8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8": {
      "main": [
        [
          {
            "node": "9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9": {
      "main": [
        [
          {
            "node": "10",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "10": {
      "main": [
        [
          {
            "node": "11",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Intermédiaire - Réseaux sociaux

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds13
Catégorie1
Types de nœuds8
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34