This workflow follows the HTTP Request → Supabase 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": "02 - Proposal Generator",
"nodes": [
{
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"type": "n8n-nodes-base.telegramTrigger",
"typeVersion": 1.3,
"position": [
-480,
240
],
"id": "11df9d1a-07a1-417d-a254-85edd2174ac4",
"name": "Telegram Trigger",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "jobs",
"filters": {
"conditions": [
{
"keyName": "url",
"condition": "eq",
"keyValue": "={{ $json.message.text }}"
}
]
}
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
0,
128
],
"id": "631a8269-dedc-4143-98da-c5011fbc54ca",
"name": "Get many rows",
"alwaysOutputData": true,
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://api.groq.com/openai/v1/chat/completions",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_GROQ_API_KEY"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"model\": \"llama-3.1-8b-instant\",\n \"messages\": [{\n \"role\": \"user\",\n \"content\": \"Generate TWO freelance proposals for this job.\\n\\nJob: {{ $('Get many rows').first().json.title }}\\n\\nBackground: n8n automation, Telegram bots, Supabase, Docker on Raspberry Pi, 14 Cisco certs, TryHackMe SOC Level 1. 17yo IT student from Luxembourg.\\n\\nFormat EXACTLY like this:\\n===A===\\n[formal proposal under 100 words, sign as Ihor]\\n===B===\\n[hook-first under 70 words, no greetings, start with client problem, sign as Ihor]\\n===END===\"\n }]\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
208,
128
],
"id": "ad15ed8e-35f1-4c1e-ba10-9d1d7245ac6b",
"name": "HTTP Request"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "={{ $json.message }}",
"replyMarkup": "inlineKeyboard",
"inlineKeyboard": {
"rows": [
{
"row": {
"buttons": [
{
"text": "\u2705 \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043b A",
"additionalFields": {
"callback_data": "ab_a_test"
}
},
{
"text": "\u2705 \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043b B",
"additionalFields": {
"callback_data": "ab_b_test"
}
},
{
"text": "\u274c \u041d\u0438 \u043e\u0434\u0438\u043d",
"additionalFields": {
"callback_data": "ab_none_test"
}
}
]
}
}
]
},
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
624,
128
],
"id": "fc5ecfab-cb10-4d17-866d-e78a343a6df5",
"name": "Send a text message",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "={{ $json.message.text }}",
"rightValue": "/add",
"operator": {
"type": "string",
"operation": "startsWith"
},
"id": "2c904e70-799f-4598-a150-25a6a29fcab2"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "add_client"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "f7460483-bea6-46e8-8082-0c25ace67a78",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/list",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "list_clients"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "c3b4b737-3a53-4a3d-8497-f9437c14e1d3",
"leftValue": "={{ $json.message.text }}",
"rightValue": "http",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "proposal"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "da525682-909e-4dbd-9208-f18becfb0b12",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/jobs",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "jobs"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "b0637e95-f069-4e92-a8b3-25a97735075a",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/clients",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "clients"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "22bf3ad6-2d96-4232-bcb7-4581c90348fb",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/stats",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "stats"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "0a0617b3-6c93-4815-a760-a9d73dfc1a7f",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/start",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "menu"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "1152fae8-025a-4ba9-869e-6cb0facd04a6",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/learn",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "learn"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "1daa6033-b1c9-4bff-b4a4-2ae214591279",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/portfolio",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "portfolio"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "b611101a-13c6-422c-adeb-3114cbe373f0",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/dashboard",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "dashboard"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "c338dde6-b984-4f41-aba9-2e7dfd42fb73",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/upwork",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "upwork"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "b5f734ce-b2b9-4b6f-845c-d48cd7b053fa",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/malt",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "malt"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "fb1d6742-a839-44b1-8538-082a7dbbc435",
"leftValue": "={{ $json.message.text }}",
"rightValue": "/sent",
"operator": {
"type": "string",
"operation": "startsWith"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "sent"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "c8230373-1e6e-4964-a07b-a5bc2e83338f",
"leftValue": "={{ $json.callback_query.data }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "callback"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.4,
"position": [
-272,
112
],
"id": "f248085f-02f4-45c8-b20d-9f685d5e5723",
"name": "Switch"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "\ud83e\udd16 Freelance Hunter Bot \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443: \ud83d\udccb /jobs \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u270d\ufe0f \u041e\u0442\u043f\u0440\u0430\u0432\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438 \u043f\u0440\u043e\u043f\u043e\u0437\u0430\u043b \ud83d\udc65 /clients \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u2795 /add \u0418\u043c\u044f \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f email \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \ud83d\udcca /stats \u2014 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \ud83d\udcda /learn [\u043d\u0430\u0432\u044b\u043a] \u2014 roadmap \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
0,
528
],
"id": "4e392d87-ba4f-4ffa-8298-95d3ae5d117b",
"name": "Send a text message1",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "jobs",
"limit": 5,
"orderBy": "found_at.desc"
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
0,
400
],
"id": "87961379-5fad-470d-a778-fb9cdcdd77fb",
"name": "Get many rows1",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83d\udccb \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438:\n\n\ud83d\udccc {{ $json.title }}\n\ud83d\udd17 {{ $json.url }}\n\u2b50 Score: {{ $json.score }}/10\n\ud83d\udcc5 {{ $json.found_at }}\n\n---",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
208,
400
],
"id": "d75363e2-6da7-4e0c-a8f9-18df32034d21",
"name": "Send a text message2",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "clients"
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
0,
272
],
"id": "8c68e8ca-6756-4e4c-ae28-796341b7300f",
"name": "Get many rows2",
"alwaysOutputData": true,
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83d\udc65 \u0412\u0430\u0448\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b: \ud83d\udc64 {{ $json.name }} \ud83c\udfe2 {{ $json.company }} \ud83d\udce7 {{ $json.email }} \ud83d\udcca \u0421\u0442\u0430\u0442\u0443\u0441: {{ $json.status }} \ud83d\udcc5 Follow-up: {{ $json.next_followup }} ---",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
208,
272
],
"id": "e2c6ce49-e2dc-4aa3-8ce8-499947ddcfcf",
"name": "Send a text message3",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "jobs"
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
0,
656
],
"id": "733f75cc-fd4f-4e72-a3b5-f19fa9ab48c6",
"name": "Get many rows3",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "const jobs = $input.all();\nconst total = jobs.length;\nconst scored = jobs.filter(j => j.json.score >= 7).length;\nconst avgScore = jobs.reduce((sum, j) => sum + (j.json.score || 0), 0) / total;\n\nreturn [{\n json: {\n total,\n scored,\n avgScore: avgScore.toFixed(1)\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
208,
656
],
"id": "c51f04b2-9aa9-447e-8f36-53c610d016b1",
"name": "Code in JavaScript"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83e\udd16 Freelance Hunter Bot\n\n\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:\n\n\ud83d\udccb /jobs \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438\n\u270d\ufe0f \u041e\u0442\u043f\u0440\u0430\u0432\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438 \u043f\u0440\u043e\u043f\u043e\u0437\u0430\u043b\n\ud83d\udc65 /clients \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432\n\u2795 /add \u0418\u043c\u044f \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f email \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430\n\ud83d\udcca /dashboard \u2014 \u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430\n\ud83d\udcbc /portfolio \u2014 \u043f\u043e\u0440\u0442\u0444\u043e\u043b\u0438\u043e\n\ud83d\udcda /learn [\u043d\u0430\u0432\u044b\u043a] \u2014 roadmap \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\n\ud83d\udcc8 /stats \u2014 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0437\u0430 \u0434\u0435\u043d\u044c\n\ud83d\udd0d /upwork \u2014 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 Upwork\n\ud83c\uddeb\ud83c\uddf7 /malt \u2014 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u043e\u0433\u043e \u0440\u044b\u043d\u043a\u0430\n\ud83d\udce8 /sent \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u043f\u043e\u0437\u0430\u043b\u044b",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
368,
656
],
"id": "8b78ee93-6266-4f6c-bcd3-7ad7d6566cf9",
"name": "Send a text message4",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "const text = $json.message.text;\n// \u0424\u043e\u0440\u043c\u0430\u0442: /add \u0418\u043c\u044f \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f email\nconst parts = text.split(' ');\nparts.shift(); // \u0443\u0431\u0438\u0440\u0430\u0435\u043c /add\n\nreturn [{\n json: {\n name: parts[0] || '\u0411\u0435\u0437 \u0438\u043c\u0435\u043d\u0438',\n company: parts[1] || '\u0411\u0435\u0437 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438',\n email: parts[2] || '',\n status: 'lead',\n next_followup: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString()\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
0,
-16
],
"id": "016f0fa3-ad94-42ae-8655-513b4805d9ad",
"name": "Code in JavaScript1"
},
{
"parameters": {
"tableId": "clients",
"fieldsUi": {
"fieldValues": [
{
"fieldId": "name",
"fieldValue": "={{ $json.name }}"
},
{
"fieldId": "company",
"fieldValue": "={{ $json.company }}"
},
{
"fieldId": "email",
"fieldValue": "={{ $json.email }}"
},
{
"fieldId": "status",
"fieldValue": "={{ $json.status }}"
},
{
"fieldId": "next_followup",
"fieldValue": "={{ $json.next_followup }}"
}
]
}
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
208,
-16
],
"id": "3861d588-4c8b-4199-9ce4-fce3c3e170dc",
"name": "Create a row",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\u2705 \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! \ud83d\udc64 {{ $json.name }} \ud83c\udfe2 {{ $json.company }} \ud83d\udce7 {{ $json.email }} \ud83d\udcc5 Follow-up \u0447\u0435\u0440\u0435\u0437 3 \u0434\u043d\u044f",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
416,
-16
],
"id": "52d574fb-cb47-42d4-b47c-b3614541dff6",
"name": "Send a text message5",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://api.groq.com/openai/v1/chat/completions",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_GROQ_API_KEY"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"model\": \"llama-3.1-8b-instant\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0445\u043e\u0447\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0432\u044b\u043a: {{ $json.message.text.replace('/learn ', '') }}\\n\\n\u0421\u043e\u0437\u0434\u0430\u0439 learning roadmap \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c:\\n1. \u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c\\n2. \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b\\n3. YouTube \u043a\u0430\u043d\u0430\u043b\u044b\\n4. \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0443\u0436\u043d\u043e\\n5. \u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432 n8n \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438\"\n }\n ]\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
0,
800
],
"id": "1ed50190-9fb6-4e84-b853-60facb3c1b27",
"name": "HTTP Request1"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83d\udcda Learning Roadmap {{ $json.choices[0].message.content }}\n\n",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
208,
800
],
"id": "39598618-d0a0-4721-81a8-33e613891cee",
"name": "Send a text message6",
"alwaysOutputData": false,
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "jobs",
"filters": {
"conditions": [
{
"keyName": "status",
"condition": "eq",
"keyValue": "won"
}
]
}
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
0,
992
],
"id": "1e9659a1-4d74-471e-92a2-e10215bf1a75",
"name": "Get many rows4",
"alwaysOutputData": true,
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83d\udcbc \u0412\u0430\u0448\u0435 \u043f\u043e\u0440\u0442\u0444\u043e\u043b\u0438\u043e: \ud83d\udccc {{ $json.title }} \ud83d\udd17 {{ $json.url }} \ud83d\udcdd {{ $json.description }} \u2705 \u0421\u0442\u0430\u0442\u0443\u0441: {{ $json.status }} ---",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
208,
992
],
"id": "2c7e1a1a-69bc-4274-9fd8-8426703e5823",
"name": "Send a text message7",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "jobs"
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
0,
1184
],
"id": "267c6924-b274-4e58-b6de-2d71378bdd3d",
"name": "Get many rows5",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "clients"
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
208,
1184
],
"id": "c12ad059-251b-4d4a-929f-a7c87d7d3936",
"name": "Get many rows6",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "const allItems = $input.all();\nconst jobs = allItems.filter(i => i.json.url !== undefined);\nconst clients = allItems.filter(i => i.json.email !== undefined);\n\nconst totalJobs = jobs.length;\nconst highScore = jobs.filter(j => j.json.score >= 7).length;\nconst wonJobs = jobs.filter(j => j.json.status === 'won').length;\nconst totalClients = clients.length;\nconst activeClients = clients.filter(c => c.json.status === 'active').length;\n\nreturn [{\n json: {\n totalJobs,\n highScore,\n wonJobs,\n totalClients,\n activeClients\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
416,
1184
],
"id": "6080420a-52a0-41a1-b1f6-71586c137d63",
"name": "Code in JavaScript2"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83d\udcca \u041b\u0438\u0447\u043d\u044b\u0439 Dashboard \ud83d\udd0d \u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0439: {{ $json.totalJobs }} \u2b50 \u0421 \u043e\u0446\u0435\u043d\u043a\u043e\u0439 7+: {{ $json.highScore }} \ud83c\udfc6 \u0412\u044b\u0438\u0433\u0440\u0430\u043d\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432: {{ $json.wonJobs }} \ud83d\udc65 \u041a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 CRM: {{ $json.totalClients }} \u2705 \u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432: {{ $json.activeClients }} \ud83d\udcaa \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u0435\u043d\u044c\u0448\u0435!",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
624,
1184
],
"id": "11e1214c-ec9a-457b-b514-7485487048ee",
"name": "Send a text message8",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://api.apify.com/v2/acts/devcake~upwork-jobs-scraper/runs?token=YOUR_APIFY_TOKEN",
"sendBody": true,
"contentType": "raw",
"rawContentType": "application/json",
"body": "{\"searchQueries\":[\"n8n automation freelance\",\"workflow automation small project\",\"AI automation fixed price\"],\"resultsPerQuery\":5}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
0,
1360
],
"id": "f26d775e-8b17-4671-b806-40c1898d27fa",
"name": "HTTP Request2"
},
{
"parameters": {
"amount": 60
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
208,
1360
],
"id": "10d121ab-b607-4486-8c31-690108ae0dfb",
"name": "Wait"
},
{
"parameters": {
"url": "https://api.apify.com/v2/acts/devcake~upwork-jobs-scraper/runs/last/dataset/items?token=YOUR_APIFY_TOKEN&limit=5",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
416,
1360
],
"id": "24582e73-12fb-497c-a98d-7b40d233cfdf",
"name": "HTTP Request3"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83d\udd0d \u0421\u0432\u0435\u0436\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 Upwork: \ud83d\udccc {{ $json.title }} \ud83d\udd17 {{ $json.url }} \ud83d\udcb0 {{ $json.hourlyRateLow }}-{{ $json.hourlyRateHigh }}/hr \ud83d\udcdd {{ $json.description }} ---",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
624,
1360
],
"id": "8a8fc11f-6308-439d-9ba8-d2b31fe64f9c",
"name": "Send a text message9",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"url": "https://serpapi.com/search?api_key=YOUR_SERPAPI_KEY&engine=google&q=offre+mission+freelance+automatisation+n8n+france&num=10&gl=fr&hl=fr&tbs=qdr:w",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
0,
1520
],
"id": "85603b27-7e0a-4dc8-b91b-6cebd76f5705",
"name": "HTTP Request4"
},
{
"parameters": {
"jsCode": "const items = $input.first().json.organic_results || [];\n\nreturn items.map(item => ({\n json: {\n title: item.title || '',\n link: item.link || '',\n snippet: item.snippet || '',\n source: item.source || 'Google FR'\n }\n}));"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
208,
1520
],
"id": "5e880c6b-d714-4b9d-a54f-f9cc97361f8f",
"name": "Code in JavaScript3"
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83c\uddeb\ud83c\uddf7 Mission freelance France: \ud83d\udccc {{ $json.title }} \ud83d\udd17 {{ $json.link }} \ud83d\udcdd {{ $json.snippet }} \ud83c\udf10 {{ $json.source }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
416,
1520
],
"id": "fb6f42b2-91b9-4db1-85af-65daf0946f71",
"name": "Send a text message10",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"tableId": "proposals",
"dataToSend": "autoMapInputData"
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
784,
128
],
"id": "e0e05d5c-7ff6-41df-8447-e65726f1b642",
"name": "Create a row1",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "getAll",
"tableId": "proposals",
"limit": 5
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
0,
-160
],
"id": "bf9dc19e-0a9f-4e2b-8975-feb3b13b8891",
"name": "Get many rows7",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "YOUR_TELEGRAM_CHAT_ID",
"text": "=\ud83d\udce8 \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u043e\u0437\u0430\u043b\u044b: \ud83d\udcdd {{ $json.content.substring(0, 200) }}... \ud83d\udcc5 {{ $json.created_at }} ---",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
208,
-160
],
"id": "27e4819a-bb31-48c7-9278-163918e13550",
"name": "Send a text message11",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "const raw = $input.first().json.choices[0].message.content;\nconst job = $('Get many rows').first().json;\n\nconst variantA = raw.split('===A===')[1].split('===B===')[0].trim();\nconst variantB = raw.split('===B===')[1].split('===END===')[0].trim();\n\nreturn [{\n json: {\n job_id: job.id,\n job_title: job.title,\n job_url: job.url,\n proposal_a: variantA,\n proposal_b: variantB,\n message: `\ud83c\udfaf *${job.title}*\\n\ud83d\udd17 ${job.url}\\n\\n*\u0412\u0430\u0440\u0438\u0430\u043d\u0442 A (\u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439):*\\n${variantA}\\n\\n*\u0412\u0430\u0440\u0438\u0430\u043d\u0442 B (\u0445\u0443\u043a):*\\n${variantB}`\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
416,
128
],
"id": "5322e67e-246e-40c5-93af-08c7f59d0fd7",
"name": "Code in JavaScript4"
},
{
"parameters": {
"jsCode": "const data = $json.callback_query.data;\nconst chatId = $json.callback_query.message.chat.id;\nconst messageId = $json.callback_query.id;\n\nconst parts = data.split('_');\nconst result = parts[1]; // a, b, \u0438\u043b\u0438 none\nconst jobId = parts[2];\n\nreturn [{\n json: {\n job_id: jobId,\n ab_result: result,\n chat_id: chatId,\n callback_id: messageId\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
0,
1680
],
"id": "b216843c-edfe-4f32-95c1-435fd10391c0",
"name": "Code in JavaScript5"
},
{
"parameters": {
"operation": "update",
"tableId": "proposals",
"filters": {
"conditions": [
{
"keyName": "job_id",
"condition": "eq",
"keyValue": "={{ $json.job_id }}"
}
]
},
"fieldsUi": {
"fieldValues": [
{
"fieldId": "ab_result",
"fieldValue": "={{ $json.ab_result }}"
}
]
}
},
"type": "n8n-nodes-base.supabase",
"typeVersion": 1,
"position": [
208,
1680
],
"id": "f1af8da0-fe91-49e2-9a16-44b7826612aa",
"name": "Update a row",
"credentials": {
"supabaseApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Telegram Trigger": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"Get many rows": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Code in JavaScript4",
"type": "main",
"index": 0
}
]
]
},
"Switch": {
"main": [
[
{
"node": "Code in JavaScript1",
"type": "main",
"index": 0
}
],
[],
[
{
"node": "Get many rows",
"type": "main",
"index": 0
}
],
[
{
"node": "Get many rows1",
"type": "main",
"index": 0
}
],
[
{
"node": "Get many rows2",
"type": "main",
"index": 0
}
],
[
{
"node": "Get many rows3",
"type": "main",
"index": 0
}
],
[
{
"node": "Send a text message1",
"type": "main",
"index": 0
}
],
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
],
[
{
"node": "Get many rows4",
"type": "main",
"index": 0
}
],
[
{
"node": "Get many rows5",
"type": "main",
"index": 0
}
],
[
{
"node": "HTTP Request2",
"type": "main",
"index": 0
}
],
[
{
"node": "HTTP Request4",
"type": "main",
"index": 0
}
],
[
{
"node": "Get many rows7",
"type": "main",
"index": 0
}
],
[
{
"node": "Code in JavaScript5",
"type": "main",
"index": 0
}
]
]
},
"Get many rows1": {
"main": [
[
{
"node": "Send a text message2",
"type": "main",
"index": 0
}
]
]
},
"Get many rows2": {
"main": [
[
{
"node": "Send a text message3",
"type": "main",
"index": 0
}
]
]
},
"Get many rows3": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Send a text message4",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript1": {
"main": [
[
{
"node": "Create a row",
"type": "main",
"index": 0
}
]
]
},
"Create a row": {
"main": [
[
{
"node": "Send a text message5",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request1": {
"main": [
[
{
"node": "Send a text message6",
"type": "main",
"index": 0
}
]
]
},
"Get many rows4": {
"main": [
[
{
"node": "Send a text message7",
"type": "main",
"index": 0
}
]
]
},
"Get many rows5": {
"main": [
[
{
"node": "Get many rows6",
"type": "main",
"index": 0
}
]
]
},
"Get many rows6": {
"main": [
[
{
"node": "Code in JavaScript2",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript2": {
"main": [
[
{
"node": "Send a text message8",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request2": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "HTTP Request3",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request3": {
"main": [
[
{
"node": "Send a text message9",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request4": {
"main": [
[
{
"node": "Code in JavaScript3",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript3": {
"main": [
[
{
"node": "Send a text message10",
"type": "main",
"index": 0
}
]
]
},
"Send a text message": {
"main": [
[
{
"node": "Create a row1",
"type": "main",
"index": 0
}
]
]
},
"Get many rows7": {
"main": [
[
{
"node": "Send a text message11",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript4": {
"main": [
[
{
"node": "Send a text message",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript5": {
"main": [
[
{
"node": "Update a row",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate"
},
"versionId": "a69ea291-a6f2-4f56-9bd4-61742f29d22e",
"meta": {
"templateCredsSetupCompleted": true
},
"nodeGroups": [],
"id": "fSuqWvC5eXsbmvA1",
"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.
supabaseApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
02 - Proposal Generator. Uses telegramTrigger, supabase, httpRequest, telegram. Event-driven trigger; 37 nodes.
Source: https://github.com/ihorpjp/n8n-freelance-autopilot/blob/4262495a559d2a430da4a176be3cc21e5dfa19d4/02_-_Proposal_Generator.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.
Telegram-auth. Uses telegramTrigger, telegram, supabase, httpRequest. Event-driven trigger; 18 nodes.
Telegram-auth. Uses telegramTrigger, telegram, supabase, httpRequest. Event-driven trigger; 18 nodes.
Http Telegram. Uses telegramTrigger, httpRequest, supabase, telegram. Event-driven trigger; 17 nodes.
Http Telegram. Uses telegramTrigger, httpRequest, supabase, telegram. Event-driven trigger; 17 nodes.
N8N Complete Final. Uses telegramTrigger, dataTable, telegram, mqtt. Event-driven trigger; 58 nodes.