AutomationFlowsEmail & Gmail › Signup Intake → CRM Triage

Signup Intake → CRM Triage

Signup Intake → CRM triage. Uses formTrigger, googleSheets, telegram, telegramTrigger. Webhook trigger; 28 nodes.

Webhook trigger★★★★☆ complexity28 nodesForm TriggerGoogle SheetsTelegramTelegram TriggerHTTP RequestGmail
Email & Gmail Trigger: Webhook Nodes: 28 Complexity: ★★★★☆ Added:

This workflow follows the Form Trigger → Gmail 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
{
  "name": "Signup Intake \u2192 CRM triage",
  "nodes": [
    {
      "parameters": {
        "content": "## Signup Intake \u2192 CRM triage\n\nA generic **intake door** for inbound people. Two ways in, one pipeline, a human in the loop.\n\n**Teaching idea:** n8n is useful far beyond any one product. This flow shows how *any* organisation (or a single person) can capture inbound interest \u2014 **with or without a website** \u2014 and route it to a human, without writing a backend.\n\n**Two doors:**\n1. **Waitlist Webhook** \u2014 for senders that *have* a site (e.g. the promptpotter-web `/api/waitlist` function POSTs here, setting its own `source`).\n2. **Hosted Signup Form** \u2014 n8n renders a public form page for you. No website, no code. Bookmark / share / QR the form URL.\n\nBoth land in the **Signups** sheet (NOT the CRM). The CRM (**Entries**) is only *read* \u2014 unless you tap **Add to CRM** in Telegram.",
        "height": 420,
        "width": 460,
        "color": 4
      },
      "id": "a1b2c3d4-0010-4010-8010-000000000010",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -460,
        120
      ]
    },
    {
      "parameters": {
        "content": "### Door 1 \u2014 site senders\n\n`POST /webhook/signup-intake`\n\nBody: `{ email, name, use_case, signup_source }`\n\nThe sender (e.g. promptpotter-web) sets `signup_source`. Responds immediately, then processes async.",
        "height": 260,
        "width": 300,
        "color": 7
      },
      "id": "a1b2c3d4-0011-4011-8011-000000000011",
      "name": "Door 1 label",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40,
        -120
      ]
    },
    {
      "parameters": {
        "content": "### Door 2 \u2014 no website needed\n\nThe **Form Trigger** makes n8n host a public signup page. The form URL is your shareable / bookmarkable link \u2014 that's the whole 'no website' trick.\n\nField labels here MUST match the keys read in *Normalize (Form)*.",
        "height": 260,
        "width": 300,
        "color": 7
      },
      "id": "a1b2c3d4-0012-4012-8012-000000000012",
      "name": "Door 2 label",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40,
        600
      ]
    },
    {
      "parameters": {
        "content": "### Human in the loop\n\nTelegram tells you about each signup and whether they're **already in the CRM** \u2014 and if so, a compact preview of their current record (status \u00b7 groups, last topic, since when).\n\nButtons:\n\u2022 **\u2705 Add to CRM** \u2192 writes them into *Entries* + marks the Signups row `promoted`.\n\u2022 **\ud83d\uddd1 Dismiss** \u2192 marks the row `dismissed`.\n\nAfter a tap, the message KEEPS the signup details, stamps your decision underneath (`\u2705 ADDED TO CRM` / `\ud83d\uddd1 DISMISSED`), and the buttons are REMOVED entirely \u2014 nothing left to re-press.\n\nThe **Telegram Trigger** below catches the button taps (callback queries).\n\n\u26a0 Set your chat ID + bind the Telegram credential on import.",
        "height": 320,
        "width": 320,
        "color": 6
      },
      "id": "a1b2c3d4-0013-4013-8013-000000000013",
      "name": "HITL label",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2000,
        60
      ]
    },
    {
      "parameters": {
        "content": "## Bind on import\n\nThe JSON ships with placeholders. Two SEPARATE spreadsheets are used:\n\n\u2022 **CRM Lookup** + **Add to CRM (Entries)** \u2192 your CRM doc (`YOUR_ENTRIES_SPREADSHEET_ID`), `Entries` tab.\n\u2022 **Append to Signups / Lookup Signup / Mark Promoted / Mark Dismissed** \u2192 the Signups doc (`YOUR_SIGNUPS_SPREADSHEET_ID`).\n\nAfter importing:\n1. On each Google Sheets node bind the *Google Sheets OAuth* credential + re-pick the correct document (per above).\n2. In the Signups doc, the tab is `Sheet1` \u2014 give it headers: `email  first_name  surname  use_case  source  signup_timestamp  known_in_crm  status`.\n3. **Render Email** (HTTP Request) \u2014 set its URL to your confirmation-email endpoint (`YOUR_CONFIRMATION_EMAIL_ENDPOINT`).\n4. **Gmail node** (*Send Confirmation Email*) \u2014 bind the Gmail OAuth credential.\n5. **Telegram nodes** \u2014 bind the bot credential, set `YOUR_CHAT_ID`.\n6. **Activate**, then copy the Webhook **Production URL** into the sender's `N8N_WAITLIST_WEBHOOK_URL`, and grab the **Form Trigger** URL to share/bookmark.",
        "height": 420,
        "width": 460,
        "color": 3
      },
      "id": "a1b2c3d4-0014-4014-8014-000000000014",
      "name": "Setup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        600
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "signup-intake",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "a1b2c3d4-0001-4001-8001-000000000001",
      "name": "Waitlist Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        120,
        40
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "{ \"ok\": true }",
        "options": {}
      },
      "id": "a1b2c3d4-0002-4002-8002-000000000002",
      "name": "Respond OK",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        360,
        -80
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "w-email",
              "name": "email",
              "value": "={{ ($json.body.email || '').toString().trim().toLowerCase() }}",
              "type": "string"
            },
            {
              "id": "w-name",
              "name": "name",
              "value": "={{ ($json.body.name || '').toString().trim() }}",
              "type": "string"
            },
            {
              "id": "w-usecase",
              "name": "use_case",
              "value": "={{ ($json.body.use_case || '').toString().trim() }}",
              "type": "string"
            },
            {
              "id": "w-source",
              "name": "source",
              "value": "={{ ($json.body.signup_source || 'web').toString().trim() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0003-4003-8003-000000000003",
      "name": "Normalize (Web)",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        360,
        120
      ]
    },
    {
      "parameters": {
        "formTitle": "Join the waitlist",
        "formDescription": "Leave your details and we'll be in touch.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Email",
              "fieldType": "email",
              "requiredField": true
            },
            {
              "fieldLabel": "Name",
              "fieldType": "text",
              "requiredField": false
            },
            {
              "fieldLabel": "Use case",
              "fieldType": "textarea",
              "requiredField": false
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0004-4004-8004-000000000004",
      "name": "Hosted Signup Form",
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2,
      "position": [
        120,
        720
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "f-email",
              "name": "email",
              "value": "={{ ($json['Email'] || '').toString().trim().toLowerCase() }}",
              "type": "string"
            },
            {
              "id": "f-name",
              "name": "name",
              "value": "={{ ($json['Name'] || '').toString().trim() }}",
              "type": "string"
            },
            {
              "id": "f-usecase",
              "name": "use_case",
              "value": "={{ ($json['Use case'] || '').toString().trim() }}",
              "type": "string"
            },
            {
              "id": "f-source",
              "name": "source",
              "value": "hosted-form",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0005-4005-8005-000000000005",
      "name": "Normalize (Form)",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        360,
        720
      ]
    },
    {
      "parameters": {
        "jsCode": "// Unify whichever door fired into one canonical signup shape.\nconst j = $json;\nconst name = (j.name || '').toString().trim();\nconst parts = name.split(/\\s+/).filter(Boolean);\nreturn [{\n  json: {\n    email: (j.email || '').toString().trim().toLowerCase(),\n    first_name: parts[0] || '',\n    surname: parts.slice(1).join(' '),\n    use_case: j.use_case || '',\n    source: j.source || 'web',\n    signup_timestamp: $now.toISO()\n  }\n}];"
      },
      "id": "a1b2c3d4-0006-4006-8006-000000000006",
      "name": "Normalize",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        620,
        420
      ]
    },
    {
      "parameters": {
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_ENTRIES_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Entries",
          "mode": "name"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "email",
              "lookupValue": "={{ $('Normalize').item.json.email }}"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0007-4007-8007-000000000007",
      "name": "CRM Lookup",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        840,
        420
      ],
      "alwaysOutputData": true,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "t-email",
              "name": "email",
              "value": "={{ $('Normalize').item.json.email }}",
              "type": "string"
            },
            {
              "id": "t-first",
              "name": "first_name",
              "value": "={{ $('Normalize').item.json.first_name }}",
              "type": "string"
            },
            {
              "id": "t-surname",
              "name": "surname",
              "value": "={{ $('Normalize').item.json.surname }}",
              "type": "string"
            },
            {
              "id": "t-usecase",
              "name": "use_case",
              "value": "={{ $('Normalize').item.json.use_case }}",
              "type": "string"
            },
            {
              "id": "t-source",
              "name": "source",
              "value": "={{ $('Normalize').item.json.source }}",
              "type": "string"
            },
            {
              "id": "t-ts",
              "name": "signup_timestamp",
              "value": "={{ $('Normalize').item.json.signup_timestamp }}",
              "type": "string"
            },
            {
              "id": "t-known",
              "name": "known_in_crm",
              "value": "={{ $json.email ? 'yes' : 'no' }}",
              "type": "string"
            },
            {
              "id": "t-status",
              "name": "status",
              "value": "new",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0008-4008-8008-000000000008",
      "name": "Triage",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1060,
        420
      ]
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SIGNUPS_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Sheet1",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "email"
          ],
          "schema": []
        },
        "options": {}
      },
      "id": "a1b2c3d4-0009-4009-8009-000000000009",
      "name": "Append to Signups",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1280,
        420
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "chatId": "YOUR_CHAT_ID",
        "text": "=\ud83c\udd95 *New signup*\n\n*Name:* {{ $json.first_name }} {{ $json.surname }}\n*Email:* `{{ $json.email }}`\n*Source:* {{ $json.source }}\n*Use case:* {{ $json.use_case || '\u2014' }}\n\n\ud83d\udd0e Already in CRM: *{{ $json.known_in_crm === 'yes' ? 'YES' : 'no' }}*{{ $json.known_in_crm === 'yes' ? `\\n\\n\ud83d\udcc7 In CRM as *${$('CRM Lookup').first().json.status || 'contact'}*${$('CRM Lookup').first().json.groups ? ' \u00b7 ' + $('CRM Lookup').first().json.groups : ''}\\n\ud83d\uddd2 Last topic: ${$('CRM Lookup').first().json.last_topic || '\u2014'}\\n\ud83d\udcc5 Since: ${($('CRM Lookup').first().json.contact_created_at || '').toString().slice(0, 10) || '\u2014'}` : '' }}",
        "additionalFields": {
          "appendAttribution": false,
          "parse_mode": "Markdown"
        },
        "replyMarkup": "inlineKeyboard",
        "inlineKeyboard": {
          "rows": [
            {
              "row": {
                "buttons": [
                  {
                    "text": "\u2705 Add to CRM",
                    "additionalFields": {
                      "callback_data": "=addcrm:{{ $json.email }}"
                    }
                  },
                  {
                    "text": "\ud83d\uddd1 Dismiss",
                    "additionalFields": {
                      "callback_data": "=dismiss:{{ $json.email }}"
                    }
                  }
                ]
              }
            }
          ]
        }
      },
      "id": "a1b2c3d4-000a-400a-800a-00000000000a",
      "name": "Notify (Telegram)",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1720,
        420
      ],
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "updates": [
          "callback_query"
        ],
        "additionalFields": {}
      },
      "id": "a1b2c3d4-000b-400b-800b-00000000000b",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "typeVersion": 1.1,
      "position": [
        120,
        1100
      ],
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Parse the inline-button tap: callback_data is \"action:email\".\nconst cq = $json.callback_query || {};\nconst raw = (cq.data || '').toString();\nconst idx = raw.indexOf(':');\nconst action = idx === -1 ? raw : raw.slice(0, idx);\nconst email = idx === -1 ? '' : raw.slice(idx + 1);\nreturn [{\n  json: {\n    action,\n    email: email.trim().toLowerCase(),\n    message_id: cq.message && cq.message.message_id,\n    chat_id: cq.message && cq.message.chat && cq.message.chat.id,\n    original_text: (cq.message && cq.message.text) || ''\n  }\n}];"
      },
      "id": "a1b2c3d4-000c-400c-800c-00000000000c",
      "name": "Parse Callback",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        360,
        1100
      ]
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "loose"
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.action }}",
                    "rightValue": "addcrm",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "addcrm"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "loose"
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.action }}",
                    "rightValue": "dismiss",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "dismiss"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-000d-400d-800d-00000000000d",
      "name": "Action?",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3,
      "position": [
        580,
        1100
      ]
    },
    {
      "parameters": {
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SIGNUPS_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Sheet1",
          "mode": "name"
        },
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "email",
              "lookupValue": "={{ $('Parse Callback').item.json.email }}"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-000e-400e-800e-00000000000e",
      "name": "Lookup Signup",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        840,
        980
      ],
      "alwaysOutputData": true,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "YOUR_ENTRIES_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Entries",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "email": "={{ $json.email }}",
            "first_name": "={{ $json.first_name }}",
            "surname": "={{ $json.surname }}",
            "status": "lead",
            "groups": "website-waitlist",
            "association": "={{ $json.source }}",
            "last_topic": "Waitlist signup",
            "notes": "={{ $json.use_case }}",
            "contact_created_at": "={{ $now.toISO() }}",
            "contact_updated_at": "={{ $now.toISO() }}"
          },
          "matchingColumns": [
            "email"
          ],
          "schema": []
        },
        "options": {}
      },
      "id": "a1b2c3d4-000f-400f-800f-00000000000f",
      "name": "Add to CRM (Entries)",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1060,
        980
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "fp-email",
              "name": "email",
              "value": "={{ $('Parse Callback').item.json.email }}",
              "type": "string"
            },
            {
              "id": "fp-status",
              "name": "status",
              "value": "promoted",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0024-4024-8024-000000000024",
      "name": "Flag Promoted",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1280,
        980
      ]
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SIGNUPS_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Sheet1",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "email"
          ],
          "schema": []
        },
        "options": {}
      },
      "id": "a1b2c3d4-0020-4020-8020-000000000020",
      "name": "Mark Promoted",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1500,
        980
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "editMessageText",
        "chatId": "={{ $('Parse Callback').item.json.chat_id }}",
        "messageId": "={{ $('Parse Callback').item.json.message_id }}",
        "text": "={{ $('Parse Callback').item.json.original_text }}\n\n\u2705 ADDED TO CRM",
        "additionalFields": {}
      },
      "id": "a1b2c3d4-0021-4021-8021-000000000021",
      "name": "Confirm Added",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1720,
        980
      ],
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SIGNUPS_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Sheet1",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "email": "={{ $('Parse Callback').item.json.email }}",
            "status": "dismissed"
          },
          "matchingColumns": [
            "email"
          ],
          "schema": []
        },
        "options": {}
      },
      "id": "a1b2c3d4-0022-4022-8022-000000000022",
      "name": "Mark Dismissed",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        840,
        1240
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "editMessageText",
        "chatId": "={{ $('Parse Callback').item.json.chat_id }}",
        "messageId": "={{ $('Parse Callback').item.json.message_id }}",
        "text": "={{ $('Parse Callback').item.json.original_text }}\n\n\ud83d\uddd1 DISMISSED",
        "additionalFields": {}
      },
      "id": "a1b2c3d4-0023-4023-8023-000000000023",
      "name": "Confirm Dismissed",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1060,
        1240
      ],
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "YOUR_CONFIRMATION_EMAIL_ENDPOINT",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ { first_name: $('Triage').item.json.first_name, use_case: $('Triage').item.json.use_case } }}",
        "options": {}
      },
      "id": "a1b2c3d4-0040-4040-8040-000000000040",
      "name": "Render Email",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1500,
        200
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "operation": "send",
        "sendTo": "={{ $('Triage').item.json.email }}",
        "subject": "={{ $json.subject }}",
        "emailType": "html",
        "message": "={{ $json.html }}",
        "options": {
          "appendAttribution": false,
          "senderName": "PromptPotter"
        }
      },
      "id": "a1b2c3d4-0041-4041-8041-000000000041",
      "name": "Send Confirmation Email",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1720,
        200
      ],
      "onError": "continueRegularOutput",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## Confirmation email\n\nThe branded confirmation email is **not** built in this workflow \u2014 its HTML/copy lives on the website (single source of truth, alongside the brand images) and is rendered by an endpoint: `\u2026/api/waitlist-email`.\n\n*Render Email* (HTTP Request) POSTs `first_name` + `use_case` and gets back `{ subject, html, text }`; *Send Confirmation Email* (Gmail) sends it to the signup's address. Runs on a **parallel branch** to the Telegram alert \u2014 *Render Email* uses an error output and Gmail is *continue on error*, so a render/bounce failure never blocks your operator notification.\n\n\u26a0 Set the endpoint URL on *Render Email* + bind the **Gmail OAuth** credential on import.",
        "height": 300,
        "width": 320,
        "color": 4
      },
      "id": "a1b2c3d4-0042-4042-8042-000000000042",
      "name": "Email label",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1620,
        -200
      ]
    }
  ],
  "connections": {
    "Waitlist Webhook": {
      "main": [
        [
          {
            "node": "Respond OK",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Respond OK": {
      "main": [
        [
          {
            "node": "Normalize (Web)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize (Web)": {
      "main": [
        [
          {
            "node": "Normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Hosted Signup Form": {
      "main": [
        [
          {
            "node": "Normalize (Form)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize (Form)": {
      "main": [
        [
          {
            "node": "Normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize": {
      "main": [
        [
          {
            "node": "CRM Lookup",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "CRM Lookup": {
      "main": [
        [
          {
            "node": "Triage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Triage": {
      "main": [
        [
          {
            "node": "Append to Signups",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append to Signups": {
      "main": [
        [
          {
            "node": "Notify (Telegram)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Render Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Parse Callback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Callback": {
      "main": [
        [
          {
            "node": "Action?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Action?": {
      "main": [
        [
          {
            "node": "Lookup Signup",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark Dismissed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lookup Signup": {
      "main": [
        [
          {
            "node": "Add to CRM (Entries)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add to CRM (Entries)": {
      "main": [
        [
          {
            "node": "Flag Promoted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Flag Promoted": {
      "main": [
        [
          {
            "node": "Mark Promoted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Promoted": {
      "main": [
        [
          {
            "node": "Confirm Added",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Dismissed": {
      "main": [
        [
          {
            "node": "Confirm Dismissed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Render Email": {
      "main": [
        [
          {
            "node": "Send Confirmation Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "tags": []
}

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

Signup Intake → CRM triage. Uses formTrigger, googleSheets, telegram, telegramTrigger. Webhook trigger; 28 nodes.

Source: https://github.com/runfish5/micro-services/blob/main/projects/n8n/shared/signup-intake.n8n.json — 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

What This Flow Does

Gmail, Google Sheets, HTTP Request +1
Email & Gmail

Automate short-term trading research by generating high-quality trade ideas using MCP (Market Context Protocol) signals and AI-powered analysis. 📈🤖 This workflow evaluates market context, catalysts, m

Slack, Asana, HTTP Request +4
Email & Gmail

This workflow handles Twilio recording-complete webhooks, downloads the call audio, transcribes it with OpenAI Whisper, and uses Anthropic Claude to extract structured call insights. It logs every cal

HTTP Request, Google Sheets, Gmail
Email & Gmail

Automatically extract structured information from emails using AI-powered document analysis. This workflow processes emails from specified domains, classifies them by type, and extracts structured dat

Gmail, HTTP Request, AWS S3 +1
Email & Gmail

Workflow1-2-3. Uses httpRequest, gmail, telegram, postgres. Webhook trigger; 34 nodes.

HTTP Request, Gmail, Telegram +2