AutomationFlowsSlack & Telegram › Proposal Generator

Proposal Generator

02 - Proposal Generator. Uses telegramTrigger, supabase, httpRequest, telegram. Event-driven trigger; 37 nodes.

Event trigger★★★★★ complexity37 nodesTelegram TriggerSupabaseHTTP RequestTelegram
Slack & Telegram Trigger: Event Nodes: 37 Complexity: ★★★★★ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

Telegram-auth. Uses telegramTrigger, telegram, supabase, httpRequest. Event-driven trigger; 18 nodes.

Telegram Trigger, Telegram, Supabase +1
Slack & Telegram

Telegram-auth. Uses telegramTrigger, telegram, supabase, httpRequest. Event-driven trigger; 18 nodes.

Telegram Trigger, Telegram, Supabase +1
Slack & Telegram

Http Telegram. Uses telegramTrigger, httpRequest, supabase, telegram. Event-driven trigger; 17 nodes.

Telegram Trigger, HTTP Request, Supabase +1
Slack & Telegram

Http Telegram. Uses telegramTrigger, httpRequest, supabase, telegram. Event-driven trigger; 17 nodes.

Telegram Trigger, HTTP Request, Supabase +1
Slack & Telegram

N8N Complete Final. Uses telegramTrigger, dataTable, telegram, mqtt. Event-driven trigger; 58 nodes.

Telegram Trigger, Data Table, Telegram +3