Función de recuperación de carritos abandonados con análisis usando Gmail y Google Sheets

Intermedio

Este es unSocial Mediaflujo de automatización del dominio deautomatización que contiene 13 nodos.Utiliza principalmente nodos como If, Set, Code, Wait, Gmail. Función de recuperación de carritos abandonados usando Gmail y análisis de Google Sheets

Requisitos previos
  • Cuenta de Google y credenciales de API de Gmail
  • Punto final de HTTP Webhook (n8n generará automáticamente)
  • Credenciales de API de Google Sheets

Categoría

Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "nodes": [
    {
      "id": "1",
      "name": "Carrito Abandonado Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        300
      ],
      "parameters": {
        "path": "cart-abandoned",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1
    },
    {
      "id": "2",
      "name": "Nota Adhesiva",
      "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": "Configuración de Recuperación",
      "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": "Calificar Carrito",
      "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": "Generar Datos de Recuperación",
      "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": "Esperar 1 Hora",
      "type": "n8n-nodes-base.wait",
      "position": [
        1040,
        200
      ],
      "parameters": {
        "unit": "hours",
        "amount": 1
      },
      "typeVersion": 1
    },
    {
      "id": "7",
      "name": "Enviar Primer Correo de Recuperación",
      "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": "Esperar 23 Horas Más",
      "type": "n8n-nodes-base.wait",
      "position": [
        1440,
        200
      ],
      "parameters": {
        "unit": "hours",
        "amount": 23
      },
      "typeVersion": 1
    },
    {
      "id": "9",
      "name": "Enviar Segundo Correo de Recuperación",
      "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": "Esperar 48 Horas Más",
      "type": "n8n-nodes-base.wait",
      "position": [
        1840,
        200
      ],
      "parameters": {
        "unit": "hours",
        "amount": 48
      },
      "typeVersion": 1
    },
    {
      "id": "11",
      "name": "Enviar Correo de Recuperación 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": "Nota Adhesiva 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": "Iniciar Seguimiento de Recuperación",
      "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
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Intermedio - Redes sociales

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Intermedio
Número de nodos13
Categoría1
Tipos de nodos8
Descripción de la dificultad

Adecuado para usuarios con experiencia intermedia, flujos de trabajo de complejidad media con 6-15 nodos

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34