AutomationFlowsEmail & Gmail › Generate Personalized Promo Cards with Email Verification, Gmail & Google Sheets

Generate Personalized Promo Cards with Email Verification, Gmail & Google Sheets

ByJitesh Dugar @jiteshdugar on n8n.io

This workflow automatically generates beautiful, personalized promotional cards with QR codes and sends them via email to verified users. Perfect for e-commerce stores, marketing campaigns, and customer engagement initiatives. Email Verification: Validates email addresses using…

Webhook trigger★★★★☆ complexity19 nodesN8N Nodes HtmlcsstoimageGoogle SheetsN8N Nodes VerifiemailGmail
Email & Gmail Trigger: Webhook Nodes: 19 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #9032 — we link there as the canonical source.

This workflow follows the Gmail → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "",
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "name": "Personalized Promo Code Cards for Verified Users",
  "tags": [],
  "nodes": [
    {
      "id": "b0df3843-bc98-4a04-b9c5-587df865c8d3",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        576,
        816
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "bf99a77f-9879-45b3-b466-1ec73565d9bd",
              "name": "name",
              "type": "string",
              "value": "={{$json.body.name || 'Valued Customer'}}"
            },
            {
              "id": "d5746616-ae00-4394-8c45-b1b2f996b1b0",
              "name": "email",
              "type": "string",
              "value": "={{ $json.body.email }}"
            },
            {
              "id": "78bac585-fbff-4a10-9953-85dbac79b18f",
              "name": "promo_code",
              "type": "string",
              "value": "={{ $json.body.promo_code || 'WELCOME10'}}"
            },
            {
              "id": "f3aae8d3-4d1d-4e3f-8bfc-506321852264",
              "name": "discount_value",
              "type": "string",
              "value": "={{ $json.body.discount_value || '10%' }}"
            },
            {
              "id": "05f0ff79-d917-479d-b7bb-fb9a439fb26c",
              "name": "discount_type",
              "type": "string",
              "value": "={{ $json.body.discount_type || 'percentage' }}"
            },
            {
              "id": "d02a9d89-1474-462c-a9d6-052c9b8aa1fc",
              "name": "timestamp",
              "type": "string",
              "value": "={{new Date().toISOString()}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "af6b8362-eea0-47fa-a524-d8053150504f",
      "name": "Generate Promo Card Image",
      "type": "n8n-nodes-htmlcsstoimage.htmlCssToImage",
      "position": [
        1504,
        688
      ],
      "parameters": {
        "html_content": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Promo Card</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Arial', sans-serif;\n            background: #f5f5f5;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            min-height: 100vh;\n            padding: 20px;\n        }\n\n        .promo-card {\n            width: 400px;\n            height: 550px;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            border-radius: 20px;\n            padding: 25px;\n            color: white;\n            text-align: center;\n            box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2);\n            display: flex;\n            flex-direction: column;\n            justify-content: space-between;\n            overflow: visible;\n        }\n\n        .header {\n            text-align: center;\n        }\n\n        .logo {\n            width: 50px;\n            height: 50px;\n            background: white;\n            border-radius: 50%;\n            margin: 0 auto 15px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: #667eea;\n            font-weight: bold;\n            font-size: 18px;\n        }\n\n        .title {\n            font-size: 24px;\n            font-weight: bold;\n            margin-bottom: 10px;\n            text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n        }\n\n        .content {\n            flex: 1;\n            display: flex;\n            flex-direction: column;\n            justify-content: center;\n            align-items: center;\n            gap: 8px;\n        }\n\n        .greeting {\n            font-size: 18px;\n            margin-bottom: 5px;\n        }\n\n        .discount-circle {\n            width: 90px;\n            height: 90px;\n            background: rgba(255, 255, 255, 0.2);\n            border: 3px solid rgba(255, 255, 255, 0.4);\n            border-radius: 50%;\n            display: flex;\n            flex-direction: column;\n            justify-content: center;\n            align-items: center;\n            margin: 5px 0;\n            backdrop-filter: blur(10px);\n        }\n\n        .discount-value {\n            font-size: 24px;\n            font-weight: bold;\n            line-height: 1;\n        }\n\n        .discount-text {\n            font-size: 10px;\n            opacity: 0.9;\n        }\n\n        .promo-code {\n            background: rgba(255, 255, 255, 0.2);\n            border: 2px solid rgba(255, 255, 255, 0.3);\n            border-radius: 10px;\n            padding: 8px 16px;\n            font-size: 14px;\n            font-weight: bold;\n            letter-spacing: 2px;\n            margin: 8px 0;\n            backdrop-filter: blur(10px);\n        }\n\n        .qr-section {\n            margin: 8px 0;\n        }\n\n        .qr-container {\n            background: white;\n            border-radius: 8px;\n            padding: 8px;\n            display: inline-block;\n            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);\n        }\n\n        .qr-code {\n            width: 70px;\n            height: 70px;\n            background: white;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .qr-code img {\n            width: 100%;\n            height: 100%;\n            display: block;\n        }\n\n        .qr-label {\n            font-size: 10px;\n            margin-top: 8px;\n            opacity: 0.8;\n        }\n\n        .footer {\n            text-align: center;\n            background: rgba(0, 0, 0, 0.2);\n            padding: 10px;\n            border-radius: 10px;\n            margin-top: 5px;\n        }\n\n        .expiry {\n            font-size: 13px;\n            font-weight: bold;\n            color: #ffd700;\n            text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);\n        }\n    </style>\n</head>\n<body>\n    <div class=\"promo-card\">\n        <div class=\"header\">\n            <div class=\"logo\">\ud83c\udf81</div>\n            <h1 class=\"title\">SPECIAL OFFER</h1>\n        </div>\n        \n        <div class=\"content\">\n            <h2 class=\"greeting\">Hi {{ $('Edit Fields').item.json.name }}!</h2>\n            \n            <div class=\"discount-circle\">\n                <span class=\"discount-value\">{{ $('Edit Fields').item.json.discount_value }}</span>\n                <span class=\"discount-text\">OFF</span>\n            </div>\n            \n            <div class=\"promo-code\">{{ $('Edit Fields').item.json.promo_code }}</div>\n            \n            <div class=\"qr-section\">\n                <div class=\"qr-container\">\n                    <div class=\"qr-code\">\n                        <img src=\"https://api.qrserver.com/v1/create-qr-code/?size=70x70&data=https://YOURSTORE.com/checkout?code={{ $('Edit Fields').item.json.promo_code }}&format=png&margin=0\" alt=\"QR Code\">\n                    </div>\n                </div>\n                <p class=\"qr-label\">Scan to Apply</p>\n            </div>\n        </div>\n        \n        <div class=\"footer\">\n            <p class=\"expiry\">Valid until Dec 31, 2024</p>\n        </div>\n    </div>\n</body>\n</html>",
        "response_format_html": "png"
      },
      "credentials": {
        "htmlcsstoimgApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9e1bca1c-4f75-47ad-8a7c-9e42b5b7f776",
      "name": "Log Promo Distribution",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2272,
        688
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{ $('Edit Fields').item.json.name }}",
            "Email": "={{ $('Edit Fields').item.json.email }}",
            "Status": "Sent Successfully",
            "Timestamp": "={{new Date().toISOString()}}",
            "Promo Code": "={{ $('Edit Fields').item.json.promo_code }}",
            "Discount Value": "={{ $('Edit Fields').item.json.discount_value }}"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Promo Code",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Promo Code",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Discount Value",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Discount Value",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_ID/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEETS_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_ID/edit?usp=drivesdk",
          "cachedResultName": "Log Promo Distribution"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "bcea2cef-11a1-4b63-a09f-8726ed5a0aa8",
      "name": "Set Error Data",
      "type": "n8n-nodes-base.set",
      "position": [
        1488,
        1008
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "8c20bbf9-4758-499e-938c-d4a2efc7ca01",
              "name": "error_type",
              "type": "string",
              "value": "Invalid Email"
            },
            {
              "id": "ac6e79cc-a747-4a86-bdb5-f214e94dacfe",
              "name": "timestamp",
              "type": "string",
              "value": "={{new Date().toISOString()}}"
            },
            {
              "id": "b1ccacdf-c151-4107-adc0-eb3f21a5d927",
              "name": "email",
              "type": "string",
              "value": "={{ $('Edit Fields').item.json.email }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "7135f609-3571-46c0-ba3d-79d9095109d8",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        64,
        480
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 480,
        "content": "## PROMO SIGNUP TRIGGER\n\n- API: Promo code signup webhook\n- Method: POST\n- Response: 200 OK with confirmation\n- Expected JSON:\n  ```json\n  {\n    \"name\": \"John Doe\",\n    \"email\": \"customer@email.com\",\n    \"promo_code\": \"SAVE20\",\n    \"discount_value\": \"20%\"\n  }\n  ```\n- Test URL: https://your-n8n-instance.com/webhook/promo-signup\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5c7ce862-2a12-4348-9d59-2c4aa3463cb4",
      "name": "WEBHOOK",
      "type": "n8n-nodes-base.webhook",
      "position": [
        352,
        816
      ],
      "parameters": {
        "path": "promo-signup",
        "options": {
          "responseData": "={\"status\": \"success\", \"message\": \"Promo card being generated!\"}"
        },
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "d5bc4d1a-727d-4a2c-b038-f8f68c8b5573",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        496,
        496
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 480,
        "content": "## DATA SANITIZATION\n\n- Purpose: Clean and prepare incoming data\n- Operations:\n  - Trim whitespace from all fields\n  - Set default values for missing data\n  - Add timestamp for tracking\n  - Validate required fields exist\n  - Normalize discount format\n- Output: Structured data for verification\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "32e56db6-94ef-4d63-ba29-c58024a643d3",
      "name": "Validate Email",
      "type": "n8n-nodes-verifiemail.verifiEmail",
      "position": [
        880,
        816
      ],
      "parameters": {
        "email": "={{ $json.email }}"
      },
      "credentials": {
        "verifiEmailApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4e0776eb-8e47-4d6b-bfc4-48495480514a",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        480
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 496,
        "content": "## EMAIL VALIDATION\n\n- Purpose: Block disposable/invalid emails\n- Check Types:\n  - Syntax validation\n  - Domain verification\n  - Mailbox existence\n  - Disposable email detection\n- Result: Valid/invalid status for IF node\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f6a6612d-7e62-45de-8b02-2b06a848a7f3",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        528
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 416,
        "content": "## VALIDATION GATEWAY\n\n- Purpose: Route based on email validity\n- TRUE Branch: Valid email \u2192 Generate card\n- FALSE Branch: Invalid email \u2192 Error handling\n- Condition: valid = \"true\" OR \"false\"\n- Prevents: Fraud and maintains list quality\n"
      },
      "typeVersion": 1
    },
    {
      "id": "25536778-aefe-45e5-81f1-01006ca85aa7",
      "name": "Validation Gateway",
      "type": "n8n-nodes-base.if",
      "position": [
        1152,
        816
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f7f7e28c-6bf9-4443-8c94-2431a93c354d",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.valid }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "75b3e1f0-1a0c-452c-ae8b-24e22d5d0cda",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1408,
        384
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 480,
        "content": "## PROMO CARD GENERATION\n\n- Purpose: Create personalized promo cards\n- Service: HTML to Image API\n- Template: Professional gradient design\n- Variables: {{name}}, {{promo_code}}, {{discount_value}}\n- QR Code: Embedded checkout link\n- Output: PNG image URL for email attachment\n- Size: 400x500px optimized for email\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "29103362-5f8e-48a8-bcfc-3809cbd69d29",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1776,
        384
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 480,
        "content": "## CUSTOMER EMAIL DELIVERY\n\n- Purpose: Send promo card to verified customers\n- To: {{email}} (validated customer)\n- Subject: \"\ud83c\udf89 Your Exclusive {{discount_value}} Discount is Ready!\"\n- Type: HTML with personalized content\n- Attachment: Generated promo card image\n- Includes: Welcome message, usage instructions\n"
      },
      "typeVersion": 1
    },
    {
      "id": "51f09284-6a75-4f29-9fbc-b98778d7f47f",
      "name": "Success Path",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1904,
        688
      ],
      "parameters": {
        "sendTo": "={{ $('Edit Fields').item.json.email }}",
        "message": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Your Exclusive Offer</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: 'Arial', 'Helvetica', sans-serif; background-color: #f4f4f4;\">\n    <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color: #f4f4f4; padding: 20px 0;\">\n        <tr>\n            <td align=\"center\">\n                <table width=\"600\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color: #ffffff; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 12px rgba(0,0,0,0.1);\">\n                    \n                    <!-- Header with gradient -->\n                    <tr>\n                        <td style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 40px 30px; text-align: center;\">\n                            <h1 style=\"margin: 0; color: #ffffff; font-size: 32px; font-weight: bold; text-shadow: 0 2px 4px rgba(0,0,0,0.2);\">\n                                \ud83c\udf89 Welcome, {{ $('Edit Fields').item.json.name }}!\n                            </h1>\n                            <p style=\"margin: 10px 0 0 0; color: #ffffff; font-size: 16px; opacity: 0.95;\">\n                                Your exclusive offer is ready!\n                            </p>\n                        </td>\n                    </tr>\n                    \n                    <!-- Main Content -->\n                    <tr>\n                        <td style=\"padding: 40px 30px;\">\n                            <p style=\"margin: 0 0 20px 0; color: #333333; font-size: 16px; line-height: 1.6;\">\n                                Thank you for signing up! We're thrilled to have you join our community. \n                                As a warm welcome, we've prepared something special just for you.\n                            </p>\n                            \n                            <!-- Promo Code Box -->\n                            <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin: 30px 0;\">\n                                <tr>\n                                    <td style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 12px; padding: 30px; text-align: center;\">\n                                        <p style=\"margin: 0 0 10px 0; color: #ffffff; font-size: 14px; text-transform: uppercase; letter-spacing: 1px; opacity: 0.9;\">\n                                            Your Exclusive Promo Code\n                                        </p>\n                                        <div style=\"background-color: rgba(255,255,255,0.2); border: 2px dashed rgba(255,255,255,0.5); border-radius: 8px; padding: 15px 25px; display: inline-block; margin: 10px 0;\">\n                                            <p style=\"margin: 0; color: #ffffff; font-size: 28px; font-weight: bold; letter-spacing: 3px;\">\n                                                {{ $('Edit Fields').item.json.promo_code }}\n                                            </p>\n                                        </div>\n                                        <p style=\"margin: 15px 0 0 0; color: #ffd700; font-size: 20px; font-weight: bold;\">\n                                            Save {{ $('Edit Fields').item.json.discount_value }}!\n                                        </p>\n                                    </td>\n                                </tr>\n                            </table>\n                            \n                            <!-- Features -->\n                            <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin: 30px 0;\">\n                                <tr>\n                                    <td width=\"33%\" style=\"padding: 15px; text-align: center; vertical-align: top;\">\n                                        <div style=\"font-size: 32px; margin-bottom: 10px;\">\u2728</div>\n                                        <p style=\"margin: 0; color: #667eea; font-weight: bold; font-size: 14px;\">Easy to Use</p>\n                                        <p style=\"margin: 5px 0 0 0; color: #666666; font-size: 12px;\">Apply at checkout</p>\n                                    </td>\n                                    <td width=\"33%\" style=\"padding: 15px; text-align: center; vertical-align: top;\">\n                                        <div style=\"font-size: 32px; margin-bottom: 10px;\">\ud83c\udf81</div>\n                                        <p style=\"margin: 0; color: #667eea; font-weight: bold; font-size: 14px;\">Exclusive Deal</p>\n                                        <p style=\"margin: 5px 0 0 0; color: #666666; font-size: 12px;\">Just for you</p>\n                                    </td>\n                                    <td width=\"33%\" style=\"padding: 15px; text-align: center; vertical-align: top;\">\n                                        <div style=\"font-size: 32px; margin-bottom: 10px;\">\u23f0</div>\n                                        <p style=\"margin: 0; color: #667eea; font-weight: bold; font-size: 14px;\">Limited Time</p>\n                                        <p style=\"margin: 5px 0 0 0; color: #666666; font-size: 12px;\">Don't miss out</p>\n                                    </td>\n                                </tr>\n                            </table>\n                            \n                            <p style=\"margin: 25px 0; color: #333333; font-size: 16px; line-height: 1.6;\">\n                                We've also created a beautiful promo card for you (see attachment). \n                                Save it or share it with friends!\n                            </p>\n                            \n                            <!-- CTA Button -->\n                            <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin: 30px 0;\">\n                                <tr>\n                                    <td align=\"center\">\n                                        <a href=\"#\" style=\"display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: #ffffff; text-decoration: none; padding: 15px 40px; border-radius: 25px; font-size: 16px; font-weight: bold; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);\">\n                                            Start Shopping Now\n                                        </a>\n                                    </td>\n                                </tr>\n                            </table>\n                            \n                            <p style=\"margin: 25px 0 0 0; color: #333333; font-size: 16px; line-height: 1.6;\">\n                                Happy shopping! \ud83d\udecd\ufe0f\n                            </p>\n                            <p style=\"margin: 5px 0 0 0; color: #666666; font-size: 14px; font-style: italic;\">\n                                We can't wait to see what you choose!\n                            </p>\n                            \n                            <!-- Promo Card Image -->\n                            <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin: 30px 0;\">\n                                <tr>\n                                    <td align=\"center\">\n                                        <p style=\"margin: 0 0 15px 0; color: #333333; font-size: 16px; font-weight: bold;\">\n                                            Your Personalized Promo Card\n                                        </p>\n                                        <img src=\"{{ $json.image_url }}\" alt=\"Your Promo Card\" style=\"max-width: 100%; height: auto; border-radius: 10px; box-shadow: 0 4px 12px rgba(0,0,0,0.15);\" />\n                                    </td>\n                                </tr>\n                            </table>\n                        </td>\n                    </tr>\n                    \n                    <!-- Footer -->\n                    <tr>\n                        <td style=\"background-color: #f8f8f8; padding: 25px 30px; text-align: center; border-top: 1px solid #eeeeee;\">\n                            <p style=\"margin: 0 0 10px 0; color: #999999; font-size: 12px;\">\n                                This offer is valid until Dec 31, 2024\n                            </p>\n                            <p style=\"margin: 0; color: #999999; font-size: 12px;\">\n                                Questions? Contact us at support@yourstore.com\n                            </p>\n                        </td>\n                    </tr>\n                    \n                </table>\n            </td>\n        </tr>\n    </table>\n</body>\n</html>",
        "options": {},
        "subject": "=\ud83c\udf89 Your Exclusive {{ $('Edit Fields').item.json.discount_value }} Discount is Ready!"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "f7a274d9-a415-457c-8948-756bd04fead3",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2144,
        352
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 496,
        "content": "## ANALYTICS TRACKING\n\n- Purpose: Record all successful distributions\n- Google Sheets columns:\n  - Timestamp\n  - Customer Name\n  - Email Address\n  - Promo Code\n  - Discount Value\n  - Delivery Status\n- Used for: Reporting, duplicate prevention, analytics"
      },
      "typeVersion": 1
    },
    {
      "id": "07c54abb-da63-4e5f-9707-ff9193b9a169",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1424,
        992
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 464,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n## ERROR LOGGING\n\n- Purpose: Capture failed validation attempts\n- Data Collected:\n  - Invalid email address\n  - Reason for failure\n  - Timestamp\n  - User details (if available)\n- Prevents: Spam, fraud, system abuse\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9fb1926d-d407-4272-811c-a116658f482b",
      "name": "Error Path",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1824,
        1008
      ],
      "parameters": {
        "sendTo": "YOUR_ADMIN_EMAIL_HERE",
        "message": "=Failed to generate promo card for {{ $('Edit Fields').item.json.email }} - Invalid email address",
        "options": {},
        "subject": "\u26a0\ufe0f Failed Promo Card Generation  ",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "c61c8af0-85bd-41d7-a310-d56056d2b4d1",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        992
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 416,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n## ADMIN NOTIFICATION\n\n- Purpose: Alert team of invalid attempts\n- To: YOUR_ADMIN_EMAIL_HERE\n- Subject: \"\u26a0\ufe0f Failed Promo Card Generation\"\n- Content: Error details and user information\n- Helps: Monitor system health, detect patterns"
      },
      "typeVersion": 1
    },
    {
      "id": "80c29be0-1ebe-431b-8c78-3c6c46019418",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        384
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 784,
        "content": "## AUTOMATED PROMO CARD GENERATOR\n\n- Purpose: Generate personalized discount cards with email verification\n\n**Workflow:**  \nWebhook \u2192 Email Verification \u2192 Card Creation \u2192 Email \u2192 Sheets Log  \n\n**Highlights:**  \n- Fraud prevention  \n- Personalized promo visuals  \n- Automated customer mailing  \n- Real-time Google Sheets logging  \n\n**APIs Used & Where to Get Keys:**\n\n1\ufe0f\u20e3 **Verifi Email API** \u2013 for email verification  \n\ud83d\udd17 Get API key from: [https://verifi.email](https://verifi.email) \n\n2\ufe0f\u20e3 **HTML to Image API** \u2013 for converting HTML promo card to image  \n\ud83d\udd17 Get API key from: [https://htmlcsstoimg.com](https://htmlcsstoimg.com)  \n\n3\ufe0f\u20e3 **Gmail API** \u2013 for sending personalized promo emails  \n\ud83d\udd17 Get credentials from: [https://console.cloud.google.com/](https://console.cloud.google.com/)  \n\u27a1\ufe0f Create project \u2192 Enable Gmail API \u2192 Generate OAuth 2.0 Client ID  \n\n4\ufe0f\u20e3 **Google Sheets API** \u2013 for logging promo data  \n\ud83d\udd17 Get credentials from: [https://console.cloud.google.com/](https://console.cloud.google.com/)  \n\u27a1\ufe0f Enable Google Sheets API \u2192 Create Service Account \u2192 Download JSON key  \n\n- Processing: 30-60 seconds per request\n- Success Rate: 95%+ for valid emails\n- Monitoring:\n  - Email verification rates\n  - Image generation failures\n  - Delivery metrics\n  - API usage limits\n\n\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "",
  "connections": {
    "WEBHOOK": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Validate Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Success Path": {
      "main": [
        [
          {
            "node": "Log Promo Distribution",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Error Data": {
      "main": [
        [
          {
            "node": "Error Path",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate Email": {
      "main": [
        [
          {
            "node": "Validation Gateway",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validation Gateway": {
      "main": [
        [
          {
            "node": "Generate Promo Card Image",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Error Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Promo Card Image": {
      "main": [
        [
          {
            "node": "Success Path",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automatically generates beautiful, personalized promotional cards with QR codes and sends them via email to verified users. Perfect for e-commerce stores, marketing campaigns, and customer engagement initiatives. Email Verification: Validates email addresses using…

Source: https://n8n.io/workflows/9032/ — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

Transform your visitor management process with this fully automated, enterprise-grade workflow. The Verified Visitor Pass Generator eliminates manual data entry, prevents fake registrations through em

N8N Nodes Htmlcsstoimage, Gmail, Slack +3
Email & Gmail

Transform your referral program into a fully automated, fraud-resistant system that delivers professional rewards to verified referrers. This workflow combines email validation, dynamic coupon generat

Gmail, Google Sheets, N8N Nodes Verifiemail +1
Email & Gmail

This comprehensive workflow automates the entire event RSVP process from form submission to attendee confirmation, including real-time email validation and personalized digital badge generation.

Gmail, Google Sheets, N8N Nodes Verifiemail +1
Email & Gmail

Automate press credential verification and badge generation for journalists covering your events

Stop And Error, Gmail, Slack +3
Email & Gmail

A comprehensive n8n workflow template for automating e-commerce return processes with fraud prevention and professional document generation. E-commerce businesses preventing fraudulent returns Custome

N8N Nodes Verifiemail, Stop And Error, N8N Nodes Htmlcsstopdf +2