This workflow follows the Gmail → OpenAI 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 →
{
"name": "Auto-generated offering for service based business",
"nodes": [
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "df8eadc8-486e-4384-8b21-22d7dd2659e5",
"name": "name",
"value": "={{ $json.kundenname }}",
"type": "string"
},
{
"id": "01322fd4-1629-4664-9afe-dfcc3497faee",
"name": "email",
"value": "={{ $json.email }}",
"type": "string"
},
{
"id": "13120ee8-f2a2-4b8d-8889-045163d8a76c",
"name": "Telefonnummer",
"value": "={{ $json.telefonnummer }}",
"type": "string"
},
{
"id": "4467d8be-dc4c-48b4-8f0c-940ed04842d3",
"name": "qm",
"value": "={{ $json.quadratmeter }}",
"type": "string"
},
{
"id": "f3f8e3b7-de4a-484f-a9b6-2ed61c9ca004",
"name": "Service",
"value": "={{ $json.reinigungsservice }}",
"type": "string"
},
{
"id": "21701790-73d0-4afa-8ae6-33a87142de4a",
"name": "ausstellungsDatum",
"value": "={{ $now.toISO() }}",
"type": "string"
},
{
"id": "74211ec1-b936-4a7d-99a9-496e8db75dd0",
"name": "gueltigBis",
"value": "={{ $now.plus(30, 'days').toISO() }}",
"type": "string"
},
{
"id": "80e28595-dfbf-484b-a5f1-3d4a7dd34a72",
"name": "angebotNummer",
"value": "ANG-001",
"type": "string"
},
{
"id": "2f8ff24e-b634-4b5a-b59d-bf3c1ab86f18",
"name": "preisProQm",
"value": "50",
"type": "string"
},
{
"id": "dc946d61-d8ab-4d5e-8259-7ba066e988da",
"name": "Geb\u00e4udetyp",
"value": "={{ $json.gebaudetyp }}",
"type": "string"
},
{
"id": "5d1d777a-7e84-4228-a12d-e825c765170d",
"name": "adresse",
"value": "={{ $json.adresse }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
2080,
688
],
"id": "a69127c6-5861-4a60-8a0f-a2b65e54712b",
"name": "Set Quote Variables (EFH/MFH)"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "=ANGEBOT_DACHREINIGUNG_MFH",
"rightValue": "={{ $json.kategorie }}",
"operator": {
"type": "string",
"operation": "equals"
},
"id": "cc737de4-5b94-4951-80d3-120d1dae2f41"
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "a1bcf5cf-8ec9-4c5a-8b71-c7e03216fbec",
"leftValue": "EMAIL_GESCHAEFTSLEITUNG",
"rightValue": "={{ $json.kategorie }}",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "19e21d42-84d6-4c70-bfd0-57129ac6665b",
"leftValue": "ANGEBOT_DACHREINIGUNG_EFH",
"rightValue": "={{ $json.kategorie }}",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "5b7712cb-fc6a-407d-ad89-0835e5896183",
"leftValue": "NOTFALL_AKUTSCHADEN",
"rightValue": "={{ $json.kategorie }}",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "7c92a163-73a8-44d9-abe6-666fe8de8c6d",
"leftValue": "TERMIN_VOR_ORT",
"rightValue": "={{ $json.kategorie }}",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "6a5ac830-1477-4cc4-a6f6-cd31c2c4b916",
"leftValue": "SONSTIGES",
"rightValue": "={{ $json.kategorie }}",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
}
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.4,
"position": [
1408,
1200
],
"id": "56ded72e-026b-47ef-9e79-16208848f433",
"name": "Route by Request Category"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=Neue Email an Gesch\u00e4ftsleitung von {{ $('Format Tally Data').item.json.kundenname }}: \nAnliegen: {{ $('Format Tally Data').item.json.sonderanliegen }}\nEmail: {{ $('Tally Trigger').item.json.question_E1zP1B.value }}\nTelefon: {{ $('Tally Trigger').item.json.question_rKylK2.value }}\nAdresse: {{ $('Tally Trigger').item.json.question_4kX2kA.value }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2080,
1056
],
"id": "cd9c08f1-2ecc-4325-bd1e-2ddcb4d7c941",
"name": "Telegram: Notify Management",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=Neuer Notfall/ Akutschaden von {{ $('Tally Trigger').item.json.question_1KPrDW.value }}: {{ $('Format Tally Data').item.json.schadensbeschreibung }}\nTelefon: {{ $('Tally Trigger').item.json.question_MOKAvX.value }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2080,
1248
],
"id": "d7fc83eb-814a-46fc-9790-6361edc4dbad",
"name": "Telegram: Emergency Alert",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=Neuer Vorort-Termin von {{ $('Format Tally Data').item.json.kundenname }}:\nMaterialwahl: {{ $('Format Tally Data').item.json.materialwahl }} \nBesichtigung: {{ $('Format Tally Data').item.json.vorortBesichtigung }}\nTelefon: {{ $('Tally Trigger').item.json.question_rKylK2.value }}\nEmail: {{ $('Tally Trigger').item.json.question_E1zP1B.value }}\nAdresse: {{ $('Tally Trigger').item.json.question_4kX2kA.value }}\n",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2080,
1440
],
"id": "615191ee-862c-4381-8764-75825d7a002d",
"name": "Telegram: On-Site Appointment Request",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=Neues Sonderanliegen von {{ $('Format Tally Data').item.json.kundenname }}: {{ $('Format Tally Data').item.json.sonderanliegen }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2080,
1632
],
"id": "47b748ee-7032-44a1-ae0c-4a3e753ac236",
"name": "Telegram: Special Request",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"formId": "YOUR_TALLY_FORM_ID"
},
"type": "n8n-nodes-tallyforms.tallyTrigger",
"typeVersion": 2,
"position": [
144,
1120
],
"id": "3d1c11a2-a3df-44a7-9739-9ccd84f5fd4d",
"name": "Tally Trigger: New Form Submission",
"credentials": {
"tallyApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"modelId": {
"__rl": true,
"value": "gpt-4.1-mini",
"mode": "list",
"cachedResultName": "GPT-4.1-MINI"
},
"responses": {
"values": [
{
"content": "=Du erh\u00e4ltst die Gespr\u00e4chsdaten eines Anrufs oder Formulardaten einer Tally-Anfrage bei [YOUR_BUSINESS_NAME].\n\nGeb\u00e4udetyp: {{ $json.gebaudetyp ?? \"\" }}\nReinigungsservice: {{ $json.reinigungsservice ?? \"\" }}\nKundenname: {{ $json.kundenname ?? \"\" }}\nEmail: {{ $json.email ?? \"\" }}\nTelefonnummer: {{ $json.telefonnummer ?? \"\" }}\nAdresse: {{ $json.adresse ?? \"\" }}\nQuadratmeter: {{ $json.quadratmeter ?? \"\" }}\nReparaturbeschreibung: {{ $json.reparaturbeschreibung ?? \"\" }}\nMaterialwahl: {{ $json.materialwahl ?? \"\" }}\nVor-Ort Besichtigung: {{ $json.vorortBesichtigung ?? \"\" }}\nSchadensbeschreibung: {{ $json.schadensbeschreibung ?? \"\" }}\nSonderanliegen: {{ $json.sonderanliegen ?? \"\" }}\nService: {{ $json.service ?? \"\" }}\n\nRegeln in dieser Priorit\u00e4tsreihenfolge:\n1. Ist \"Schadensbeschreibung\" ausgef\u00fcllt? \u2192 NOTFALL_AKUTSCHADEN\n2. Ist \"Sonderanliegen\" ausgef\u00fcllt? \u2192 EMAIL_GESCHAEFTSLEITUNG\n3. Ist \"Materialwahl\" oder \"Vor-Ort Besichtigung\" ausgef\u00fcllt? \u2192 TERMIN_VOR_ORT\n4. Ist \"Reinigungsservice\" ausgef\u00fcllt UND Geb\u00e4udetyp ist Einfamilienhaus? \u2192 ANGEBOT_DACHREINIGUNG_EFH\n5. Ist \"Reinigungsservice\" ausgef\u00fcllt UND Geb\u00e4udetyp ist Mehrfamilienhaus? \u2192 ANGEBOT_DACHREINIGUNG_MFH\n6. Nichts trifft zu \u2192 SONSTIGES\n\nAntworte NUR mit dem Kategorie-Schl\u00fcssel. Absolut kein weiterer Text, keine Backticks, keine Erkl\u00e4rung."
}
]
},
"builtInTools": {},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.openAi",
"typeVersion": 2.1,
"position": [
688,
1184
],
"id": "776402e3-0115-46d5-9478-44e0f05a2720",
"name": "Classify Request with GPT-4.1-mini",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "1",
"name": "gebaudetyp",
"value": "={{ $json.question_G1vr1L.value }}",
"type": "string"
},
{
"id": "2",
"name": "reinigungsservice",
"value": "={{ $json.question_OP1APY.value }}",
"type": "string"
},
{
"id": "3",
"name": "kundenname",
"value": "={{ $json.question_PEjAEB.value }}",
"type": "string"
},
{
"id": "4",
"name": "email",
"value": "={{ $json.question_E1zP1B.value }}",
"type": "string"
},
{
"id": "5",
"name": "telefonnummer",
"value": "={{ $json.question_rKylK2.value }}",
"type": "string"
},
{
"id": "6",
"name": "adresse",
"value": "={{ $json.question_4kX2kA.value }}",
"type": "string"
},
{
"id": "7",
"name": "quadratmeter",
"value": "={{ $json.question_jMDBMJ.value }}",
"type": "string"
},
{
"id": "8",
"name": "reparaturbeschreibung",
"value": "={{ $json.question_2k84kD.value }}",
"type": "string"
},
{
"id": "9",
"name": "materialwahl",
"value": "={{ $json.question_xQxdQv.value }}",
"type": "string"
},
{
"id": "10",
"name": "vorortBesichtigung",
"value": "={{ $json.question_R4Kz4j.value }}",
"type": "string"
},
{
"id": "11",
"name": "sonderanliegen",
"value": "={{ $json.question_G1vr1k.value }}",
"type": "string"
},
{
"id": "12",
"name": "schadensbeschreibung",
"value": "={{ $json.question_PEjAEe.value }}",
"type": "string"
},
{
"id": "670cd7ef-195b-4ea8-8f5f-1a2c9fbe3fd9",
"name": "service",
"value": "={{ $json.question_oB6ABO.value }}",
"type": "string"
}
]
},
"options": {}
},
"id": "18793a4f-5dbc-46a6-8005-9a8688fe3875",
"name": "Map Tally Fields to Schema",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
432,
1120
]
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "={{ $json.Geb\u00e4udetyp }}",
"rightValue": "Einfamilienhaus",
"operator": {
"type": "string",
"operation": "equals"
},
"id": "49fc066b-bad8-456b-9f4c-1d20713c3945"
}
],
"combinator": "and"
}
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "b172f3c0-7823-4572-9a25-1cf22b314264",
"leftValue": "={{ $json.Geb\u00e4udetyp }}",
"rightValue": "Mehrfamilienhaus",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
}
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.4,
"position": [
2304,
688
],
"id": "6aa361bb-9ba8-4284-b9f5-d479db0e0f16",
"name": "Route by Building Type (EFH vs MFH)"
},
{
"parameters": {
"operation": "sendAndWait",
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"message": "=\ud83d\udd14 Neue Angebotsanfrage\n\n\ud83d\udc64 Kunde:{{ $('Edit Fields').item.json.name }}\n\ud83d\udce7 Email: {{ $('Edit Fields').item.json.email }}\n\ud83d\udcde Telefon: {{ $('Edit Fields').item.json.Telefonnummer }}\n\ud83c\udfe2 Geb\u00e4udetyp: {{ $('Edit Fields').item.json['Geb\u00e4udetyp'] }}\n\ud83d\udcd0 Quadratmeter: {{ $('Edit Fields').item.json.qm }}m\u00b2\n\ud83d\udcb0 Preis pro m\u00b2: 50\u20ac\n\nAngebot versenden?",
"options": {}
},
"id": "2d972a96-34b7-410f-8bb7-d098e144b4eb",
"name": "Telegram: Approval Request EFH",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2800,
608
],
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"documentTemplateId": "=YOUR_PDFMONKEY_TEMPLATE_ID_EFH",
"payload": "={{ { \"name\": $('Edit Fields').item.json.name, \"email\": $('Edit Fields').item.json.email, \"Telefonnummer\": $('Edit Fields').item.json.Telefonnummer, \"qm\": $('Edit Fields').item.json.qm, \"Service\": $('Edit Fields').item.json.Service, \"leistungsart\": $('Edit Fields').item.json.Service, \"ausstellungsDatum\": $now.toISO(), \"gueltigBis\": $now.plus(30, \"days\").toISO(), \"angebotNummer\": \"ANG-\" + $('Edit Fields').item.json.name.substring(0, 3).toUpperCase() + \"-001\", \"preisProQm\": 50 } }}"
},
"type": "n8n-nodes-pdfmonkey.pdfMonkey",
"typeVersion": 1,
"position": [
2576,
592
],
"id": "10a4fd73-8c3c-4801-8248-f98b5ac442c4",
"name": "Generate Quote PDF: Single-Family Home",
"credentials": {
"pdfMonkeyApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": "={{ $('Edit Fields').item.json.email }}",
"subject": "Angebot",
"message": "=<p>Hallo {{ $('Edit Fields').item.json.name }},</p>\n\n<p>vielen Dank f\u00fcr Ihr Interesse! Anbei finden Sie Ihr pers\u00f6nliches Angebot.</p>\n\n<p>Wir haben es sorgf\u00e4ltig auf Ihre Anforderungen abgestimmt und freuen uns auf Ihre R\u00fcckmeldung.</p>\n\n<p>Hier k\u00f6nnen Sie Ihr <a href=\"{{ $('PDFMonkey').item.json.document_card.download_url }}\">Angebot</a> finden.</p>\n\n<p>Bei Fragen stehen wir Ihnen jederzeit gerne zur Verf\u00fcgung.</p>\n\n<p>Mit freundlichen Gr\u00fc\u00dfen,<br>\nElias</p>",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
3248,
592
],
"id": "71866b6f-bf50-4a4d-ae30-4aab36e1832c",
"name": "Gmail: Send Approved Quote EFH",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "={{ $('Send Approval Request').item.json.data.approved }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "equals"
},
"id": "be62f349-76c6-4ad6-b3a5-d39cf6849da2"
}
],
"combinator": "and"
},
"options": {}
},
"id": "99f14f2c-f580-4e30-9b5d-134ba69ec7a0",
"name": "If Approval Approved EFH",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
3008,
608
]
},
{
"parameters": {
"documentTemplateId": "YOUR_PDFMONKEY_TEMPLATE_ID_MFH",
"payload": "={}"
},
"type": "n8n-nodes-pdfmonkey.pdfMonkey",
"typeVersion": 1,
"position": [
2560,
768
],
"id": "557941d6-7c78-48f5-9904-7e6c03c9d071",
"name": "Generate Quote PDF: Multi-Family Home",
"credentials": {
"pdfMonkeyApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "sendAndWait",
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"message": "=\ud83d\udd14 Neue Angebotsanfrage\n\n\ud83d\udc64 Kunde: {{ $('Edit Fields').item.json.name }}\n\ud83d\udce7 Email: {{ $('Edit Fields').item.json.email }}\n\ud83d\udcde Telefon: {{ $('Edit Fields').item.json.Telefonnummer }}\n\ud83c\udfe2 Geb\u00e4udetyp: {{ $('Edit Fields').item.json['Geb\u00e4udetyp'] }}\n\ud83e\uddf9 Service: {{ $('Edit Fields').item.json.Service }}\nAngebot versenden?",
"options": {}
},
"id": "5d8b6c9d-1ade-4c15-a801-f7fa57b194aa",
"name": "Telegram: Approval Request MFH",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
2800,
784
],
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": "={{ $('Edit Fields').item.json.email }}",
"subject": "Angebot",
"message": "=<p>Hallo {{ $('Edit Fields').item.json.name }},</p>\n\n<p>vielen Dank f\u00fcr Ihr Interesse! Anbei finden Sie Ihr pers\u00f6nliches Angebot.</p>\n\n<p>Wir haben es sorgf\u00e4ltig auf Ihre Anforderungen abgestimmt und freuen uns auf Ihre R\u00fcckmeldung.</p>\n\n<p>Hier k\u00f6nnen Sie Ihr <a href=\"{{ $('PDFMonkey2').item.json.document_card.download_url }}\">Angebot</a> finden.</p>\n\n<p>Bei Fragen stehen wir Ihnen jederzeit gerne zur Verf\u00fcgung.</p>\n\n<p>Mit freundlichen Gr\u00fc\u00dfen,<br>\nElias</p>",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
3248,
768
],
"id": "78fc8023-a5c3-43f9-b2e9-8c705ad06b3a",
"name": "Gmail: Send Approved Quote MFH",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "={{ $('Send Approval Request1').item.json.data.approved }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "equals"
},
"id": "be62f349-76c6-4ad6-b3a5-d39cf6849da2"
}
],
"combinator": "and"
},
"options": {}
},
"id": "9dea242f-5133-448a-9715-7296e31e64f0",
"name": "If Approval Approved MFH",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
3008,
784
]
},
{
"parameters": {
"sendTo": " your-business-email@example.com",
"subject": "=Sonderanfrage \u2013 R\u00fcckruf erforderlich \u2013 {{ $('Format Tally Data').item.json.kundenname }} ",
"message": "=Neue Sonderfrage an Gesch\u00e4ftsleitung von {{ $('Format Tally Data').item.json.kundenname }}: Anliegen: {{ $('Format Tally Data').item.json.sonderanliegen }} Email: {{ $('Tally Trigger').item.json.question_E1zP1B.value }} Telefon: {{ $('Tally Trigger').item.json.question_rKylK2.value }} Adresse: {{ $('Tally Trigger').item.json.question_4kX2kA.value }}",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2288,
1056
],
"id": "20547759-6d13-4731-b191-6304bf1850df",
"name": "Gmail: Forward to Management",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": " your-business-email@example.com",
"subject": "=Neuer Vorort-Termin von {{ $('Format Tally Data').item.json.kundenname }}",
"message": "=Neuer Vorort-Termin von {{ $('Format Tally Data').item.json.kundenname }}: Materialwahl: {{ $('Format Tally Data').item.json.materialwahl }} Besichtigung: {{ $('Format Tally Data').item.json.vorortBesichtigung }} Telefon: {{ $('Tally Trigger').item.json.question_rKylK2.value }} Email: {{ $('Tally Trigger').item.json.question_E1zP1B.value }} Adresse: {{ $('Tally Trigger').item.json.question_4kX2kA.value }}",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2288,
1440
],
"id": "251a0328-7427-4ef9-923c-3797479470d5",
"name": "Gmail: On-Site Appointment Notification",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": "=your-business-email@example.com",
"subject": "=Neuer Notfall/ Akutschaden von {{ $('Tally Trigger').item.json.question_1KPrDW.value }}",
"message": "=Neuer Notfall/ Akutschaden von {{ $('Tally Trigger').item.json.question_1KPrDW.value }}: {{ $('Format Tally Data').item.json.schadensbeschreibung }} Telefon: {{ $('Tally Trigger').item.json.question_MOKAvX.value }}",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2288,
1248
],
"id": "c15e1429-d89f-4fcc-a2f6-9b95ccea231f",
"name": "Gmail: Emergency Notification",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sendTo": "your-business-email@example.com",
"subject": "=Neues Sonderanliegen von {{ $('Format Tally Data').item.json.kundenname }}",
"message": "=Neues Sonderanliegen von {{ $('Format Tally Data').item.json.kundenname }}: {{ $('Format Tally Data').item.json.sonderanliegen }}",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
2288,
1632
],
"id": "ad04f750-ebb7-4694-950f-66c6e9e0beb1",
"name": "Gmail: Special Request Notification",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"httpMethod": "POST",
"path": "your-webhook-path-uuid",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
112,
1504
],
"id": "22d0ee24-9f4c-48a1-ba26-ed802826fe6a",
"name": "Webhook: Alternative Intake"
},
{
"parameters": {
"mode": "raw",
"jsonOutput": "={\n \"kundenname\": \"={{ $json.body.call.call_analysis.custom_analysis_data.vorname }} {{ $json.body.call.call_analysis.custom_analysis_data.nachname }}\",\n \"email\": \"={{ $json.body.call.call_analysis.custom_analysis_data.email }}\",\n \"telefonnummer\": \"={{ $json.body.call.call_analysis.custom_analysis_data.telefon }}\",\n \"adresse\": \"={{ $json.body.call.call_analysis.custom_analysis_data.adresse }}\",\n \"gebaudetyp\": \"={{ $json.body.call.call_analysis.custom_analysis_data.gebaeudetyp }}\",\n \"reinigungsservice\": \"={{ $json.body.call.call_analysis.custom_analysis_data.reinigungsservice }}\",\n \"service\": \"\",\n \"quadratmeter\": \"={{ $json.body.call.call_analysis.custom_analysis_data.quadratmeter }}\",\n \"reparaturbeschreibung\": \"\",\n \"materialwahl\": \"\",\n \"vorortBesichtigung\": \"\",\n \"schadensbeschreibung\": \"\"\n}",
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
480,
1344
],
"id": "91579be6-ae64-47f8-8532-6f4ca3acdd50",
"name": "Map Webhook Fields"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "85c20fc4-9e8b-4c4b-82c2-55cbb7cbbcca",
"leftValue": "={{ $json.body.event }}",
"rightValue": "call_analyzed",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "or"
},
"looseTypeValidation": "={{ false }}",
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
336,
1504
],
"id": "40008728-8da3-4a8b-9fa1-3755afc32f5a",
"name": "Check Webhook Payload Valid"
},
{
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const openAiOutput = ($input.item.json.output?.[0]?.content?.[0]?.text ?? $input.item.json.text ?? \"\").trim();\n\n// Hole Kundendaten aus dem richtigen vorherigen Node\nlet customerData = {};\n\ntry {\n customerData = $('Format Tally Data').item.json;\n} catch(e) {\n try {\n customerData = $('Edit Fields1').item.json;\n } catch(e2) {\n customerData = {};\n }\n}\n\nreturn {\n kategorie: openAiOutput,\n kundenname: (customerData.kundenname ?? \"\").replace(/^=/, \"\"),\n email: (customerData.email ?? \"\").replace(/^=/, \"\"),\n telefonnummer: (customerData.telefonnummer ?? \"\").replace(/^=/, \"\"),\n adresse: (customerData.adresse ?? \"\").replace(/^=/, \"\"),\n gebaudetyp: (customerData.gebaudetyp ?? \"\").replace(/^=/, \"\"),\n reinigungsservice: (customerData.reinigungsservice ?? \"\").replace(/^=/, \"\"),\n quadratmeter: (customerData.quadratmeter ?? \"\").replace(/^=/, \"\"),\n service: (customerData.service ?? \"\").replace(/^=/, \"\")\n};"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
992,
1184
],
"id": "9a6500ca-17f5-4ef3-aa11-ae9c0fe6a19a",
"name": "Parse Category from AI Response"
},
{
"parameters": {
"content": "# \ud83c\udfe0 Automated Quote Generation via PDF for Service Businesses with AI Classification Engine, Telegram Approval Bot and Automated Gmail Delivery\n\n## Who's it for\nService businesses such as trade contractors (roofers, plumbers, electricians, cleaners, facility management) who want to send out customer quotes automatically as PDFs \u2014 either triggered by a **Tally form** embedded on their website or by a **Voice AI agent** webhook request. The business owner wants to delegate the operational work without giving up control, so every quote passes through an **approval instance via Telegram** before reaching the customer.\n\n## What it does\n1. **Intake** \u2014 Tally form OR direct webhook (e.g. AI Voice Agent summary)\n2. **AI classification** \u2014 GPT-4.1-mini categorizes the request into 6 buckets:\n - `ANGEBOT_DACHREINIGUNG_EFH` \u2192 auto-generate PDF quote (single-family) + Telegram approval \u2192 email customer\n - `ANGEBOT_DACHREINIGUNG_MFH` \u2192 auto-generate PDF quote (multi-family) + Telegram approval \u2192 email customer\n - `EMAIL_GESCHAEFTSLEITUNG` \u2192 notify management\n - `NOTFALL_AKUTSCHADEN` \u2192 emergency alert\n - `TERMIN_VOR_ORT` \u2192 on-site appointment request\n - `SONSTIGES` \u2192 special request fallback\n3. **Approval-gated quoting** \u2014 quotes are previewed via Telegram `sendAndWait` before any email goes to the customer\n4. **Direct notifications** \u2014 non-quote categories trigger Telegram + Gmail alerts to the team\n\n## How to set up\nEstimated **30-45 min**. See setup sticky on the bottom \u2192\n\n## Requirements\n- OpenAI (GPT-4.1-mini or any chat model)\n- Tally account with form\n- Telegram Bot (chat ID + token)\n- Gmail OAuth2\n- PDFMonkey account with 2 templates (EFH + MFH)\n\n## Customization\n- Change AI categories in the **Classify Request** node prompt\n- Swap GPT for any chat model\n- Replace Telegram with Slack `sendAndWait`\n- Skip approval gate for low-risk categories\n",
"height": 892,
"width": 900
},
"id": "fd27f69e-9e02-4e8d-8532-a1e04566a915",
"name": "Sticky Note - Overview",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-896,
448
]
},
{
"parameters": {
"content": "## \u2699\ufe0f Setup Steps\n\n**1. Credentials** \u2014 connect:\n- OpenAI (any chat model node compatible)\n- Tally API\n- Telegram Bot (get token from @BotFather)\n- Gmail OAuth2\n- PDFMonkey API\n\n**2. Tally Form**\n- Replace `YOUR_TALLY_FORM_ID` in the Tally Trigger node\n- Map your form fields to: `gebaudetyp`, `reinigungsservice`, `kundenname`, `email`, `telefonnummer`, `adresse`, `quadratmeter`, `reparaturbeschreibung`, `materialwahl`, `vorortBesichtigung`, `schadensbeschreibung`, `sonderanliegen`, `service`\n\n**3. Telegram**\n- Replace ALL `YOUR_TELEGRAM_CHAT_ID` placeholders (6 telegram nodes)\n- Different chat IDs per category? Set per-node\n\n**4. Gmail**\n- Replace ALL `your-business-email@example.com` placeholders (4 Gmail nodes)\n\n**5. PDFMonkey**\n- Create 2 templates: one for single-family, one for multi-family quotes\n- Replace `YOUR_PDFMONKEY_TEMPLATE_ID_EFH` and `_MFH`\n\n**6. AI Prompt**\n- Open **Classify Request** node, adapt categories and field names to your business\n\n**7. Test**\n- Submit a test entry per category through Tally\n- Verify each branch fires correctly",
"height": 652,
"width": 620
},
"id": "eed86955-7cfd-4abb-99ac-34c4eda27224",
"name": "Sticky Note - Setup",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-880,
1360
]
},
{
"parameters": {
"content": "## Intake\nTally form OR direct webhook \u2192 field mapping",
"height": 664,
"width": 568,
"color": 7
},
"id": "8f6962e1-50f4-40d5-bf88-056ee14ab99e",
"name": "Sticky Note - Intake",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
32,
976
]
},
{
"parameters": {
"content": "## AI Classification\nGPT-4.1-mini assigns one of 6 categories, then JS parses it",
"height": 344,
"width": 664,
"color": 7
},
"id": "73e1cab5-8a38-4c53-9f83-bbe836eb00be",
"name": "Sticky Note - AI Classification",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
608,
1040
]
},
{
"parameters": {
"content": "## Routing\nSwitch directs to the right branch",
"height": 440,
"width": 360,
"color": 7
},
"id": "c7ff7dbc-bfdd-4113-a1cb-164454a4a637",
"name": "Sticky Note - Routing",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1296,
1104
]
},
{
"parameters": {
"content": "## Quote Generation + Approval\nPDFMonkey \u2192 Telegram sendAndWait \u2192 If approved \u2192 Gmail to customer",
"height": 472,
"width": 1528,
"color": 7
},
"id": "70877649-f6d8-4c94-a6b3-62e8a25563a5",
"name": "Sticky Note - Quote Generation (EFH & MFH)",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2016,
480
]
},
{
"parameters": {
"content": "## Direct Notifications\nManagement / Emergency / On-Site / Special",
"height": 856,
"width": 568,
"color": 7
},
"id": "dd4a1700-f726-4642-b320-c1994edb84cf",
"name": "Sticky Note - Direct Notifications",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2000,
976
]
}
],
"connections": {
"Set Quote Variables (EFH/MFH)": {
"main": [
[
{
"node": "Route by Building Type (EFH vs MFH)",
"type": "main",
"index": 0
}
]
]
},
"Route by Request Category": {
"main": [
[
{
"node": "Set Quote Variables (EFH/MFH)",
"type": "main",
"index": 0
}
],
[
{
"node": "Telegram: Notify Management",
"type": "main",
"index": 0
}
],
[
{
"node": "Set Quote Variables (EFH/MFH)",
"type": "main",
"index": 0
}
],
[
{
"node": "Telegram: Emergency Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "Telegram: On-Site Appointment Request",
"type": "main",
"index": 0
}
],
[
{
"node": "Telegram: Special Request",
"type": "main",
"index": 0
}
]
]
},
"Tally Trigger: New Form Submission": {
"main": [
[
{
"node": "Map Tally Fields to Schema",
"type": "main",
"index": 0
}
]
]
},
"Classify Request with GPT-4.1-mini": {
"main": [
[
{
"node": "Parse Category from AI Response",
"type": "main",
"index": 0
}
]
]
},
"Map Tally Fields to Schema": {
"main": [
[
{
"node": "Classify Request with GPT-4.1-mini",
"type": "main",
"index": 0
}
]
]
},
"Route by Building Type (EFH vs MFH)": {
"main": [
[
{
"node": "Generate Quote PDF: Multi-Family Home",
"type": "main",
"index": 0
}
],
[
{
"node": "Generate Quote PDF: Single-Family Home",
"type": "main",
"index": 0
}
]
]
},
"Telegram: Approval Request EFH": {
"main": [
[
{
"node": "If Approval Approved EFH",
"type": "main",
"index": 0
}
]
]
},
"Generate Quote PDF: Single-Family Home": {
"main": [
[
{
"node": "Telegram: Approval Request EFH",
"type": "main",
"index": 0
}
]
]
},
"If Approval Approved EFH": {
"main": [
[
{
"node": "Gmail: Send Approved Quote EFH",
"type": "main",
"index": 0
}
]
]
},
"Generate Quote PDF: Multi-Family Home": {
"main": [
[
{
"node": "Telegram: Approval Request MFH",
"type": "main",
"index": 0
}
]
]
},
"Telegram: Approval Request MFH": {
"main": [
[
{
"node": "If Approval Approved MFH",
"type": "main",
"index": 0
}
]
]
},
"If Approval Approved MFH": {
"main": [
[
{
"node": "Gmail: Send Approved Quote MFH",
"type": "main",
"index": 0
}
]
]
},
"Telegram: Notify Management": {
"main": [
[
{
"node": "Gmail: Forward to Management",
"type": "main",
"index": 0
}
]
]
},
"Telegram: On-Site Appointment Request": {
"main": [
[
{
"node": "Gmail: On-Site Appointment Notification",
"type": "main",
"index": 0
}
]
]
},
"Telegram: Emergency Alert": {
"main": [
[
{
"node": "Gmail: Emergency Notification",
"type": "main",
"index": 0
}
]
]
},
"Telegram: Special Request": {
"main": [
[
{
"node": "Gmail: Special Request Notification",
"type": "main",
"index": 0
}
]
]
},
"Webhook: Alternative Intake": {
"main": [
[
{
"node": "Check Webhook Payload Valid",
"type": "main",
"index": 0
}
]
]
},
"Map Webhook Fields": {
"main": [
[
{
"node": "Classify Request with GPT-4.1-mini",
"type": "main",
"index": 0
}
]
]
},
"Check Webhook Payload Valid": {
"main": [
[
{
"node": "Map Webhook Fields",
"type": "main",
"index": 0
}
]
]
},
"Parse Category from AI Response": {
"main": [
[
{
"node": "Route by Request Category",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate"
},
"versionId": "13014c38-b92c-459b-9f79-37002e6ade04",
"id": "cX045Xn8vWdlrwFU",
"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.
gmailOAuth2openAiApipdfMonkeyApitallyApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Auto-generated offering for service based business. Uses telegram, n8n-nodes-tallyforms, openAi, n8n-nodes-pdfmonkey. Event-driven trigger; 33 nodes.
Source: https://github.com/Eliasjakob/n8n-workflows/blob/main/workflows/service-quote-generator/workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Service businesses such as trade contractors (roofers, plumbers, electricians, cleaners, facility management) who want to send out customer quotes automatically as PDFs — either triggered by a Tally f
Send a target niche and location via Telegram message Workflow discovers businesses via Google Maps API AI enriches contacts with email and LinkedIn data via Serper GPT-4o scores and qualifies each le
Tags: Logistics, Supply Chain, Warehouse Operations, Paperless processes, Quality Management
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.
💥 Automate YouTube thumbnail creation from video links -vide. Uses telegramTrigger, httpRequest, googleDrive, gmail. Event-driven trigger; 25 nodes.