This workflow corresponds to n8n.io template #13213 — we link there as the canonical source.
This workflow follows the Chat → Chat Trigger 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 →
{
"id": "KNBjlntPnM12K0t3",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Mobile Payments",
"tags": [],
"nodes": [
{
"id": "6d3bfa00-655c-47e0-ae46-c2565b665e71",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-1120,
-288
],
"parameters": {
"path": "mobile-payments",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 1
},
{
"id": "18d3f891-25e2-4032-a05b-b3e896d1cbc6",
"name": "Fetch payments",
"type": "n8n-nodes-base.dataTable",
"position": [
352,
240
],
"parameters": {
"filters": {
"conditions": [
{
"keyName": "groupId",
"keyValue": "={{ $json.from }}"
},
{
"keyName": "groupId",
"keyValue": "={{ $json.groupId }}"
}
]
},
"operation": "get",
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "QWbf1qYJeu6rTyyZ",
"cachedResultUrl": "/projects/Ey0m6JbCXLEMTTR9/datatables/QWbf1qYJeu6rTyyZ",
"cachedResultName": "mobile_payments"
}
},
"typeVersion": 1.1,
"alwaysOutputData": true
},
{
"id": "75370c0b-0ffb-494c-a346-007ce04cd02f",
"name": "Save payment",
"type": "n8n-nodes-base.dataTable",
"position": [
128,
312
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "reference",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "reference",
"defaultMatch": false
},
{
"id": "payer",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "payer",
"defaultMatch": false
},
{
"id": "phone",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "phone",
"defaultMatch": false
},
{
"id": "amount",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "amount",
"defaultMatch": false
},
{
"id": "date",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "date",
"defaultMatch": false
},
{
"id": "time",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "time",
"defaultMatch": false
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "QWbf1qYJeu6rTyyZ",
"cachedResultUrl": "/projects/Ey0m6JbCXLEMTTR9/datatables/QWbf1qYJeu6rTyyZ",
"cachedResultName": "mobile_payments"
}
},
"typeVersion": 1.1
},
{
"id": "1e5cc38b-482c-4ff7-a113-1803e5b499b5",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-232,
128
],
"parameters": {
"color": 7,
"width": 528,
"height": 416,
"content": "## Log Payment \nLog each payment posted in the group chat.\n\n"
},
"typeVersion": 1
},
{
"id": "97684e1b-095b-4fc0-96d1-9e53573cab17",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
144
],
"parameters": {
"color": 7,
"width": 352,
"height": 256,
"content": "## Summarize payments\nUsing group id or sender\n"
},
"typeVersion": 1
},
{
"id": "405bb9fc-7f9b-4748-8a4b-fb3125caf9e7",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
-896,
-288
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "858183fc-ba13-4f14-b835-430af815fa73",
"name": "from",
"type": "string",
"value": "={{ $json.body.From }}"
},
{
"id": "84bb1a45-a2cf-4e71-abe7-423f6e8b6052",
"name": "to",
"type": "string",
"value": "={{ $json.body.To }}"
},
{
"id": "cb79d3cc-4c50-4b53-93ee-01de6fcd306f",
"name": "message",
"type": "string",
"value": "={{ $json.body.Body }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a5bf7d85-3520-4425-ba9c-5012653754a3",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
800,
-72
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "b3cc1322-2c26-4687-b09c-4d77508d1da2",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
744,
-168
],
"parameters": {
"color": 7,
"width": 880,
"height": 256,
"content": "## Send to Whatsapp\nPrepare reply then send it to whatsapp"
},
"typeVersion": 1
},
{
"id": "c99fb8ff-ca29-4aa2-b60b-cf8c6054bf5f",
"name": "Send a WhatsApp message",
"type": "n8n-nodes-base.twilio",
"position": [
1696,
-72
],
"parameters": {
"to": "={{ $json.from.replace('whatsapp:', '') }}",
"from": "={{ $json.to.replace('whatsapp:', '') }}",
"message": "={{$json.message}}",
"options": {},
"toWhatsapp": true
},
"credentials": {
"twilioApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "f4c47eea-59c2-4847-9a06-360cac24119d",
"name": "Build one object",
"type": "n8n-nodes-base.code",
"position": [
1024,
-72
],
"parameters": {
"jsCode": "// Merge all input items into a single object\nconst merged = $input.all().reduce((acc, item) => {\n return { ...acc, ...item.json };\n}, {});\n\nreturn [{ json: merged }];\n"
},
"typeVersion": 2
},
{
"id": "8ea24cf6-e363-4ab3-999c-f8f429bf0fad",
"name": "Airtel Money",
"type": "n8n-nodes-base.code",
"position": [
-160,
384
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const text = $json.message;\n\nconst match = text.match(\n /TID:([A-Z0-9]+).*?Received\\s+Ksh\\s*([\\d,.]+)\\s+from\\s+(.+?)\\s+(\\d{9,15})\\s+on\\s+(\\d{2}\\/\\d{2}\\/\\d{2})\\s+([\\d:]+\\s+(?:AM|PM))/i\n);\n\nif (!match) return {};\n\nreturn {\n json: {\n provider: 'airtel',\n reference: match[1],\n amount: Number(match[2].replace(/,/g, '')),\n payer: match[3].trim(),\n phone: match[4],\n groupId: $json.from, \n date: match[5],\n time: match[6]\n }\n};\n"
},
"typeVersion": 2
},
{
"id": "02509236-5924-46ce-b84b-2a0179456966",
"name": "Mpesa",
"type": "n8n-nodes-base.code",
"position": [
-160,
192
],
"parameters": {
"jsCode": "const text = $json.message;\n\nconst match = text.match(\n /^([A-Z0-9]+)\\s+Confirmed.*?received\\s+Ksh([\\d,.]+)\\s+from\\s+(.+?)\\s+(\\d{9,12})\\s+on\\s+(\\d{1,2}\\/\\d{1,2}\\/\\d{2})\\s+at\\s+([\\d:]+\\s+(?:AM|PM))/i\n);\n\nif (!match) return {};\n\nreturn {\n json: {\n provider: 'mpesa',\n reference: match[1],\n amount: Number(match[2].replace(/,/g, '')),\n payer: match[3].trim(),\n phone: match[4],\n groupId: $json.from, \n date: match[5],\n time: match[6]\n }\n};\n"
},
"typeVersion": 2
},
{
"id": "c3111194-8cbd-4c4c-9010-8b89a1a942ce",
"name": "Classify Message",
"type": "n8n-nodes-base.code",
"position": [
-672,
-192
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "\nconst message = ($json.message || $json.chatInput || '').trim();\nconst sessionId = $json.sessionId;\nconst from = $json.from || sessionId;\nconst to = $json.to || 'unknown';\n\nlet paymentType = 'unknown';\n\nconst closeCampaign = [\n \"close\",\n \"restart\",\n \"refresh\",\n \"delete\",\n \"end\"\n ];\n\nconst summaryKeywords = [\n \"summary\",\n \"total\",\n \"progress\"\n ];\n\nconst text = message.toLowerCase();\n\nif (summaryKeywords.some(keyword => text.includes(keyword))) {\n paymentType = 'summary';\n }\n\nelse if (closeCampaign.some(keyword => text.includes(keyword))) {\n paymentType = 'clean';\n }\n/**\n * AIRTEL MONEY\n * Example:\n * TID:D3IFW8CJ4D4. Received Ksh 1 from Duli...\n */\nelse if (/^TID:[A-Z0-9]+/i.test(message)) {\n paymentType = 'airtel';\n }\n\n/**\n * M-PESA\n * Example:\n * UAUGD53S37 Confirmed. You have received Ksh1...\n */\nelse if (/^[A-Z0-9]+\\s+Confirmed\\b/i.test(message)) {\n paymentType = 'mpesa';\n }\n\nreturn { json: { paymentType, message, from, to, sessionId} };\n\n"
},
"typeVersion": 2
},
{
"id": "f60482cf-ef25-4e01-acfc-af7a1d989f18",
"name": "Route",
"type": "n8n-nodes-base.switch",
"position": [
-448,
0
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "unknown",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "a78781fe-48d5-447c-91af-04c2c2842238",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.paymentType }}",
"rightValue": "unknown"
}
]
},
"renameOutput": true
},
{
"outputKey": "clean",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "fd6ac133-ef25-4c69-a1e4-265d52aee03a",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.paymentType }}",
"rightValue": "clean"
}
]
},
"renameOutput": true
},
{
"outputKey": "summary",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "77def8ba-99b1-452d-b650-5e06d0798683",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.paymentType }}",
"rightValue": "summary"
}
]
},
"renameOutput": true
},
{
"outputKey": "mpesa",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "ff19d123-891a-4cff-b157-48cfb4d35994",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.paymentType }}",
"rightValue": "mpesa"
}
]
},
"renameOutput": true
},
{
"outputKey": "airtel",
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "700991bd-f443-404e-9cb1-c6fc34432e7e",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.paymentType }}",
"rightValue": "airtel"
}
]
},
"renameOutput": true
}
]
},
"options": {},
"looseTypeValidation": true
},
"typeVersion": 3.4
},
{
"id": "1eb578f0-f822-4a0b-a2c2-07d8c84c4dfc",
"name": "Delete payments",
"type": "n8n-nodes-base.dataTable",
"position": [
336,
0
],
"parameters": {
"filters": {
"conditions": [
{
"keyName": "groupId",
"keyValue": "={{ $json.from }}"
},
{
"keyName": "groupId",
"keyValue": "={{ $json.groupId }}"
}
]
},
"options": {},
"operation": "deleteRows",
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "QWbf1qYJeu6rTyyZ",
"cachedResultUrl": "/projects/Ey0m6JbCXLEMTTR9/datatables/QWbf1qYJeu6rTyyZ",
"cachedResultName": "mobile_payments"
}
},
"typeVersion": 1.1
},
{
"id": "df0349cd-cc95-4dfe-9407-1cc1091a9a02",
"name": "Create Message",
"type": "n8n-nodes-base.function",
"position": [
560,
0
],
"parameters": {
"functionCode": "\nreturn [\n {\n json: {\n message:\n `Payment collection campaign has been closed. Details deleted`\n }\n }\n ]\n;\n"
},
"typeVersion": 1
},
{
"id": "3e53a7dd-70eb-4b1a-a938-e285af7f462f",
"name": "Create Summary",
"type": "n8n-nodes-base.function",
"position": [
576,
240
],
"parameters": {
"functionCode": "// Filter out items that don't have a proper .json.amount\nconst validItems = items.filter(item => item.json && typeof item.json.amount === 'number');\n\nif (validItems.length === 0) {\n return [\n { json: { message: \"No payments yet. Paste each MPESA message after receiving payment. Scramble sensitive details\" } }\n ];\n}\n\nlet total = 0;\nlet lines = [];\n\nitems.forEach((item, index) => {\n const row = item.json;\n\n // Defensive checks\n if (typeof row.amount !== 'number') return;\n\n total += row.amount;\n lines.push(`${index + 1}. ${row.payer} \u2013 Ksh ${row.amount}`);\n});\n\nreturn [\n {\n json: {\n message:\n `\ud83d\udcb0 Payment Summary \\n\n ${lines.join('\\n')}\n *Total: Ksh ${total}*`\n }\n }\n ]\n;\n"
},
"executeOnce": true,
"typeVersion": 1
},
{
"id": "05753ca1-574f-4e67-a212-fd41b6b4dc24",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1696,
-400
],
"parameters": {
"width": 512,
"height": 1008,
"content": "## Try It Out!\n### This n8n templates assists with keeping track of mobile payments within a fundraising WhatsApp group.\n\nUse cases: We fundraise alot using whatsapp groups in East Africa, especially in Kenya ! Keeping track of each payment and the tallying requires alot of manual effort and brings unnecessary tension in cases of Errors of Commision or Ommision.\n\nWorks with MPESA and AIRTEL MONEY, for now.\n\n\n### How it works\n* Connect you twillio account / mobile number to the webhook.\n* Send whatsapp message or web chat.\n* We use simple regex to classify the text of the message. \n* A switch node routes payment messages based on the *payment service provider*. The message may be a request for the current total or an instruction to end the campaign and clear the payment logs.\n* A Gemini node will handle deviations from payments topic\n* Clearing may be necessary in case of mistakes since we provide no edit function. It may also be necessary to avoid mixing payments of a previous fundraising campaign with the current one.\n* Payment information is extracted from the message accoding to the SMS format of the service provider. This is then saved to a data table.\n* After each payment, or a request for summary, all payments related to the sender/groupid are fetched and taken to the next node for summarization.\n* A merge node is used to bring in the message metadata (from, to, ) to assist in whatsapp reply via twillio\n\n### How to use\n* As the treasurer / payee keep SMS receipts of all incoming mobile payments.\n* Each SMS receipt will contain the amount and the senders details, among other info.\n* Send each one by one via whatsapp to the phone number above or web chat.\n\n### Requirements\n* Twillio account - for whatsapp\n* Accessible webhook url\n* This example uses a data table `payment_table` but an SQL node is recommended for production use\n\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)!\n\n\\n\\nHappy Hacking!"
},
"typeVersion": 1
},
{
"id": "64117beb-31ee-493c-9d9b-3a481d1ccde8",
"name": "Drop original message",
"type": "n8n-nodes-base.set",
"position": [
576,
-384
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "858183fc-ba13-4f14-b835-430af815fa73",
"name": "from",
"type": "string",
"value": "={{ $json.from }}"
},
{
"id": "84bb1a45-a2cf-4e71-abe7-423f6e8b6052",
"name": "to",
"type": "string",
"value": "={{ $json.to }}"
},
{
"id": "75fb9340-f70a-4c64-b1e2-c6e35facfd8c",
"name": "=sessionId",
"type": "string",
"value": "={{ $json.sessionId }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "11893f1c-607b-4d06-82d8-5c135bd94adf",
"name": "Valid message ?",
"type": "n8n-nodes-base.if",
"position": [
1248,
-72
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e3e95b96-53af-4ff1-aaef-0026947cb4eb",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.message }}",
"rightValue": ""
},
{
"id": "a909dc10-6c2e-4773-9c8e-2fc3bcc916cc",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.message }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "52c44b9f-6ed3-48e5-a238-35a5e16006bc",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
-896,
-96
],
"parameters": {
"public": true,
"options": {},
"initialMessages": "Sasa ! \ud83d\udc4b\nMy name is Mapeni. \nAm here to assist you track MPESA contributions. "
},
"typeVersion": 1.4
},
{
"id": "b32b6585-57da-440a-bb5b-31a2362459eb",
"name": "Respond to Chat",
"type": "@n8n/n8n-nodes-langchain.chat",
"onError": "continueErrorOutput",
"position": [
-1120,
608
],
"parameters": {
"message": "={{ $json.message }}",
"options": {},
"waitUserReply": false
},
"typeVersion": 1
},
{
"id": "2aca8c54-fcea-4aa9-bd9a-bc29a091abd0",
"name": "If sender is a phone",
"type": "n8n-nodes-base.if",
"position": [
1472,
-72
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9643dedb-9e0d-4a77-b17c-040907bb21b7",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.to }}",
"rightValue": "unknown"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "99853f83-c63e-4c9b-82e1-6fb8ee97c9d7",
"name": "Message a model",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
-208,
-128
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "id",
"value": "models/gemini-2.5-flash"
},
"options": {
"systemMessage": "You are a helpful kenyan female GenZ. You are talking to the treasurer of a MPESA fundraising campaign. You only recognize SMS receipts. Keep it short but polite. Maximum 50 words "
},
"messages": {
"values": [
{}
]
},
"builtInTools": {
"urlContext": true,
"googleSearch": true,
"codeExecution": true
}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "01b3abb9-5ccd-4b26-8592-aa3c3cfb3374",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
256,
-256
],
"parameters": {
"jsCode": "const item = $input.first();\n\nconst text =\n item.json?.content?.parts\n ?.map(p => p.text)\n .filter(Boolean)\n .join('\\n') ?? null;\n\nreturn [{ json: { message:text } }];\n"
},
"typeVersion": 2
}
],
"active": true,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "b9fa77a3-0092-4019-892d-1eacf790fa45",
"connections": {
"Merge": {
"main": [
[
{
"node": "Build one object",
"type": "main",
"index": 0
}
]
]
},
"Mpesa": {
"main": [
[
{
"node": "Save payment",
"type": "main",
"index": 0
}
]
]
},
"Route": {
"main": [
[
{
"node": "Message a model",
"type": "main",
"index": 0
}
],
[
{
"node": "Delete payments",
"type": "main",
"index": 0
}
],
[
{
"node": "Fetch payments",
"type": "main",
"index": 0
}
],
[
{
"node": "Mpesa",
"type": "main",
"index": 0
}
],
[
{
"node": "Airtel Money",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Classify Message",
"type": "main",
"index": 0
}
]
]
},
"Airtel Money": {
"main": [
[
{
"node": "Save payment",
"type": "main",
"index": 0
}
]
]
},
"Save payment": {
"main": [
[
{
"node": "Fetch payments",
"type": "main",
"index": 0
}
]
]
},
"Create Message": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Create Summary": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Fetch payments": {
"main": [
[
{
"node": "Create Summary",
"type": "main",
"index": 0
}
]
]
},
"Delete payments": {
"main": [
[
{
"node": "Create Message",
"type": "main",
"index": 0
}
]
]
},
"Message a model": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Valid message ?": {
"main": [
[
{
"node": "If sender is a phone",
"type": "main",
"index": 0
}
],
[]
]
},
"Build one object": {
"main": [
[
{
"node": "Valid message ?",
"type": "main",
"index": 0
}
]
]
},
"Classify Message": {
"main": [
[
{
"node": "Route",
"type": "main",
"index": 0
},
{
"node": "Drop original message",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"If sender is a phone": {
"main": [
[
{
"node": "Send a WhatsApp message",
"type": "main",
"index": 0
}
],
[]
]
},
"Drop original message": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Send a WhatsApp message": {
"main": [
[]
]
},
"When chat message received": {
"main": [
[
{
"node": "Classify Message",
"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.
googlePalmApitwilioApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Use cases: We fundraise alot using whatsapp groups in East Africa, especially in Kenya ! Keeping track of each payment and the tallying requires alot of manual effort and brings unnecessary tension in cases of Errors of Commision or Ommision.
Source: https://n8n.io/workflows/13213/ — 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.
This workflow is for: People who want to quickly launch simple landing pages without paying monthly fees to landing page creators. It’s ideal for rapid prototyping, generation of large amounts of land
Evaluating and comparing responses from multiple LLMs (OpenAI, Claude, Gemini) can be challenging when done manually. Each model produces outputs that differ in clarity, tone, and reasoning structure.
This workflow allows users to ask portfolio-related questions in a simple format (). It validates the input, fetches client data and holdings from Google Sheets, retrieves live market prices via API,
Most career advice is generic. This workflow builds a fully personalized AI coaching system that remembers every user, adapts to their career stage and goals, detects what kind of help they need, and
🤝🖊️🤖 This workflow automates the process of retrieving meeting transcripts from Fireflies.ai, extracting and summarizing relevant content using Google Gemini, and sending or drafting well-formatted su