AutomationFlowsSlack & Telegram › Manage Supabase Database Records with Telegram Bot Commands

Manage Supabase Database Records with Telegram Bot Commands

ByDiego Alejandro Parrás @diegoalejandroparras on n8n.io

Receive message — Telegram trigger captures incoming bot messages Validate user — Checks if sender's chat ID is in the authorized list Parse command — Extracts command type (/add, /list, etc.) and parameters Route & execute — Performs the appropriate Supabase operation (INSERT,…

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

This workflow corresponds to n8n.io template #13166 — we link there as the canonical source.

This workflow follows the Supabase → Telegram 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
{
  "id": "ZrMZ6kmAjmMVe3MWBht-W",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Manage Supabase database with Telegram commands",
  "tags": [],
  "nodes": [
    {
      "id": "489db1e4-058f-4c8a-b570-6aec40dbe3a5",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -1840,
        368
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "c42dbc91-8b38-422c-9121-6a1bb1171097",
      "name": "Extract Message Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -1616,
        368
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "field-chatId",
              "name": "chatId",
              "type": "number",
              "value": "={{ $json.message.chat.id }}"
            },
            {
              "id": "field-text",
              "name": "text",
              "type": "string",
              "value": "={{ $json.message.text }}"
            },
            {
              "id": "field-firstName",
              "name": "firstName",
              "type": "string",
              "value": "={{ $json.message.from.first_name }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0c7cf41a-0950-4985-88e5-26e5c79305e7",
      "name": "Is Authorized?",
      "type": "n8n-nodes-base.if",
      "position": [
        -1392,
        368
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "condition-auth-1",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.chatId }}",
              "rightValue": 123456789
            },
            {
              "id": "condition-auth-2",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.chatId }}",
              "rightValue": 987654321
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "28e1ac01-179b-4203-8e2a-a6d5edaf31f9",
      "name": "Parse Command and Parameters",
      "type": "n8n-nodes-base.code",
      "position": [
        -1168,
        368
      ],
      "parameters": {
        "jsCode": "/*\n * Parse Telegram Command\n * ======================\n * Purpose: Extracts the command and parameters from the Telegram message.\n *          Supports: /add, /list, /get, /update, /delete, /search, /help\n * \n * Input: Telegram message text\n * Output: Parsed command object with command name and parameters\n */\n\nconst text = $input.first().json.text || '';\nconst chatId = $input.first().json.chatId;\n\nconst commandMatch = text.match(/^\\/([a-z]+)/i);\nconst command = commandMatch ? commandMatch[1].toLowerCase() : 'unknown';\nconst paramsText = text.replace(/^\\/[a-z]+\\s*/i, '').trim();\n\nlet parsed = {\n  command: command,\n  chatId: chatId,\n  rawParams: paramsText,\n  params: {}\n};\n\nswitch (command) {\n  case 'add':\n    const addParts = paramsText.split(',').map(p => p.trim());\n    if (addParts.length >= 4) {\n      parsed.params = {\n        name: addParts[0],\n        price: parseFloat(addParts[1]) || 0,\n        quantity: parseInt(addParts[2]) || 0,\n        category: addParts[3]\n      };\n    } else {\n      parsed.params.error = 'Invalid format. Use: /add name, price, quantity, category';\n    }\n    break;\n  case 'list':\n    parsed.params.category = paramsText || null;\n    break;\n  case 'get':\n    parsed.params.id = parseInt(paramsText) || null;\n    if (!parsed.params.id) parsed.params.error = 'Invalid format. Use: /get id';\n    break;\n  case 'update':\n    const updateParts = paramsText.split(' ');\n    parsed.params.id = parseInt(updateParts[0]) || null;\n    parsed.params.updates = {};\n    if (parsed.params.id) {\n      for (let i = 1; i < updateParts.length; i++) {\n        const [field, value] = updateParts[i].split('=');\n        if (field && value !== undefined) {\n          if (field === 'price') parsed.params.updates[field] = parseFloat(value);\n          else if (field === 'quantity') parsed.params.updates[field] = parseInt(value);\n          else parsed.params.updates[field] = value;\n        }\n      }\n      if (Object.keys(parsed.params.updates).length === 0) {\n        parsed.params.error = 'No valid updates. Use: /update id field=value';\n      }\n    } else {\n      parsed.params.error = 'Invalid format. Use: /update id field=value';\n    }\n    break;\n  case 'delete':\n    parsed.params.id = parseInt(paramsText) || null;\n    if (!parsed.params.id) parsed.params.error = 'Invalid format. Use: /delete id';\n    break;\n  case 'search':\n    parsed.params.searchText = paramsText;\n    if (!paramsText) parsed.params.error = 'Invalid format. Use: /search text';\n    break;\n  case 'help':\n    break;\n  default:\n    parsed.params.error = 'Unknown command. Use /help to see available commands.';\n}\n\nreturn [{ json: parsed }];"
      },
      "typeVersion": 2
    },
    {
      "id": "c591a0af-a344-4a68-acdc-9fb79a43fdf5",
      "name": "Route by Command",
      "type": "n8n-nodes-base.switch",
      "position": [
        -944,
        272
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "add",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "b56d6ee5-28ed-4bdb-b8fa-4ca2180a66a9",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.command }}",
                    "rightValue": "add"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "list",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "95a0ed9b-9638-4e21-9c19-f2397499da93",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.command }}",
                    "rightValue": "list"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "get",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "275caeec-ffe6-40d2-8556-0889df27746c",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.command }}",
                    "rightValue": "get"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "update",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "0e0e9994-9efa-4a91-ae90-9680217ba67e",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.command }}",
                    "rightValue": "update"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "delete",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "7874ddd3-8c0f-4851-b5e7-c69c35761179",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.command }}",
                    "rightValue": "delete"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "search",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "5c96f930-9866-4f54-abf9-5ccef8ed8717",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.command }}",
                    "rightValue": "search"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "help",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "07cf0917-9987-4330-ab8f-34aa15c59a73",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.command }}",
                    "rightValue": "help"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "2d73fe4d-5cc1-4a09-ba63-d42bd5e885cb",
      "name": "Add Has Error?",
      "type": "n8n-nodes-base.if",
      "position": [
        -720,
        -976
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition-error",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.params.error }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "55fb6dea-5fd1-40e1-8f15-5adda8057f28",
      "name": "Supabase Insert Product",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -496,
        -880
      ],
      "parameters": {
        "tableId": "products",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldValue": "={{ $json.params.name }}"
            },
            {
              "fieldValue": "={{ $json.params.price }}"
            },
            {
              "fieldValue": "={{ $json.params.quantity }}"
            },
            {
              "fieldValue": "={{ $json.params.category }}"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1b62e61f-dfad-4c95-8dde-5f8496e1295b",
      "name": "Send Add Success",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -272,
        -880
      ],
      "parameters": {
        "text": "=\u2705 Product added successfully!\n\n\ud83d\udce6 Name: {{ $json.name }}\n\ud83d\udcb0 Price: ${{ $json.price }}\n\ud83d\udcca Quantity: {{ $json.quantity }}\n\ud83c\udff7\ufe0f Category: {{ $json.category }}\n\ud83c\udd94 ID: {{ $json.id }}",
        "chatId": "={{ $('Parse Command and Parameters').item.json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "c4623db7-78b7-453c-bb8e-49748cb7ec35",
      "name": "Send Add Error",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -496,
        -1072
      ],
      "parameters": {
        "text": "=\u274c Error: {{ $json.params.error }}\n\n\ud83d\udcdd Correct format:\n/add name, price, quantity, category\n\nExample:\n/add iPhone 15, 999.99, 50, electronics",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "687c5ea4-d7f8-4eb3-ab17-2dfb77b0fe3b",
      "name": "Filter by Category?",
      "type": "n8n-nodes-base.if",
      "position": [
        -720,
        -592
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition-category",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.params.category }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4f0e9584-9da4-443d-9d39-06b201a4fde2",
      "name": "Supabase List Filtered",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -496,
        -688
      ],
      "parameters": {
        "tableId": "products",
        "operation": "getAll",
        "returnAll": true,
        "filterType": "string",
        "filterString": "category=eq.{{ $json.params.category }}"
      },
      "typeVersion": 1
    },
    {
      "id": "1f2f0ffa-a240-48c4-959d-998b662e194c",
      "name": "Supabase List All",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -496,
        -496
      ],
      "parameters": {
        "tableId": "products",
        "operation": "getAll",
        "returnAll": true
      },
      "typeVersion": 1
    },
    {
      "id": "740c9210-44dc-4cd6-9f76-44d2170018bc",
      "name": "Format Product List",
      "type": "n8n-nodes-base.code",
      "position": [
        -272,
        -592
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst chatId = $('Parse Command and Parameters').first().json.chatId;\nconst category = $('Parse Command and Parameters').first().json.params.category;\n\nif (items.length === 0) {\n  return [{\n    json: {\n      chatId: chatId,\n      message: category \n        ? `\ud83d\udced No products found in category \"${category}\"`\n        : '\ud83d\udced No products in database'\n    }\n  }];\n}\n\nlet message = category \n  ? `\ud83d\udce6 Products in \"${category}\" (${items.length}):\\n\\n`\n  : `\ud83d\udce6 All Products (${items.length}):\\n\\n`;\n\nitems.forEach((item, index) => {\n  const p = item.json;\n  message += `${index + 1}. [ID: ${p.id}] ${p.name}\\n`;\n  message += `   \ud83d\udcb0 $${p.price} | \ud83d\udcca Qty: ${p.quantity} | \ud83c\udff7\ufe0f ${p.category}\\n\\n`;\n});\n\nreturn [{ json: { chatId, message } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "98596398-5e01-45f6-9c0b-3da66360eab5",
      "name": "Send Product List",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -48,
        -592
      ],
      "parameters": {
        "text": "={{ $json.message }}",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "ba38d3a8-ccb3-4c4f-9109-9a9538e246d8",
      "name": "Get Has Error?",
      "type": "n8n-nodes-base.if",
      "position": [
        -720,
        -208
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition-error-get",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.params.error }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "50649ea2-0d2e-402d-a9f4-d03294922ddb",
      "name": "Supabase Get Product",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -512,
        -112
      ],
      "parameters": {
        "limit": 1,
        "tableId": "products",
        "operation": "getAll",
        "filterType": "string",
        "filterString": "id=eq.{{ $json.params.id }}"
      },
      "typeVersion": 1
    },
    {
      "id": "8f30e94f-162c-4bc7-ba5b-6a653361adfd",
      "name": "Send Product Details",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -288,
        -112
      ],
      "parameters": {
        "text": "=\ud83d\udce6 Product Details:\n\n\ud83c\udd94 ID: {{ $json.id }}\n\ud83d\udce6 Name: {{ $json.name }}\n\ud83d\udcb0 Price: ${{ $json.price }}\n\ud83d\udcca Quantity: {{ $json.quantity }}\n\ud83c\udff7\ufe0f Category: {{ $json.category }}",
        "chatId": "={{ $('Parse Command and Parameters').item.json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "fe7e3537-d833-4533-a271-54ccec98f9af",
      "name": "Send Get Error",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -512,
        -304
      ],
      "parameters": {
        "text": "=\u274c Error: {{ $json.params.error }}\n\n\ud83d\udcdd Correct format:\n/get id\n\nExample:\n/get 15",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "68c690c1-54b1-4330-87aa-eb525b58b259",
      "name": "Update Has Error?",
      "type": "n8n-nodes-base.if",
      "position": [
        -720,
        176
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition-error-update",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.params.error }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c17faffe-664c-4ebe-beba-eb6a1d0d106c",
      "name": "Prepare Update Data",
      "type": "n8n-nodes-base.set",
      "position": [
        -512,
        288
      ],
      "parameters": {
        "options": {
          "ignoreConversionErrors": true
        },
        "assignments": {
          "assignments": [
            {
              "id": "update-id",
              "name": "id",
              "type": "number",
              "value": "={{ $json.params.id }}"
            },
            {
              "id": "update-name",
              "name": "name",
              "type": "string",
              "value": "={{ $json.params.updates.name }}"
            },
            {
              "id": "update-price",
              "name": "price",
              "type": "number",
              "value": "={{ $json.params.updates.price }}"
            },
            {
              "id": "update-quantity",
              "name": "quantity",
              "type": "number",
              "value": "={{ $json.params.updates.quantity }}"
            },
            {
              "id": "update-category",
              "name": "category",
              "type": "string",
              "value": "={{ $json.params.updates.category }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2fb60504-55bf-44bb-827e-509a6094f824",
      "name": "Supabase Update Product",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -288,
        288
      ],
      "parameters": {
        "tableId": "products",
        "operation": "update",
        "filterType": "string",
        "filterString": "id=eq.{{ $json.id }}"
      },
      "typeVersion": 1
    },
    {
      "id": "569b1d21-1f0d-4efb-beb8-a380696e6a8c",
      "name": "Send Update Success",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -64,
        288
      ],
      "parameters": {
        "text": "=\u2705 Product updated successfully!\n\n\ud83c\udd94 ID: {{ $json.id }}\nUpdated fields have been saved.",
        "chatId": "={{ $('Parse Command and Parameters').item.json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "adb1157b-a0f7-40c7-983d-c9e6e4049889",
      "name": "Send Update Error",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -528,
        112
      ],
      "parameters": {
        "text": "=\u274c Error: {{ $json.params.error }}\n\n\ud83d\udcdd Correct format:\n/update id field=value field=value\n\nExample:\n/update 15 price=899 quantity=45\n\nValid fields: name, price, quantity, category",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "5c85a5e0-c854-48b0-884b-9de3500d1cff",
      "name": "Delete Has Error?",
      "type": "n8n-nodes-base.if",
      "position": [
        -720,
        560
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition-error-delete",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.params.error }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2b747995-9ad7-45af-83aa-52e29b8d1a67",
      "name": "Supabase Delete Product",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -496,
        656
      ],
      "parameters": {
        "tableId": "products",
        "operation": "delete",
        "filterType": "string",
        "filterString": "id=eq.{{ $json.params.id }}"
      },
      "typeVersion": 1
    },
    {
      "id": "874359fc-363d-43bf-aece-bad14b0cee5f",
      "name": "Send Delete Success",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -272,
        656
      ],
      "parameters": {
        "text": "=\ud83d\uddd1\ufe0f Product deleted successfully!\n\nID {{ $('Parse Command and Parameters').item.json.params.id }} has been removed from the database.",
        "chatId": "={{ $('Parse Command and Parameters').item.json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "ea553b05-a0f2-423e-846c-bd653ff3d63a",
      "name": "Send Delete Error",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -496,
        464
      ],
      "parameters": {
        "text": "=\u274c Error: {{ $json.params.error }}\n\n\ud83d\udcdd Correct format:\n/delete id\n\nExample:\n/delete 15",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "da42f0e5-5858-40e7-bcee-1a38a28bbe17",
      "name": "Search Has Error?",
      "type": "n8n-nodes-base.if",
      "position": [
        -720,
        944
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition-error-search",
              "operator": {
                "type": "string",
                "operation": "exists"
              },
              "leftValue": "={{ $json.params.error }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "cfe21419-6e35-4ce3-9191-db448f8122a6",
      "name": "Supabase Search Products",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -496,
        1040
      ],
      "parameters": {
        "tableId": "products",
        "operation": "getAll",
        "returnAll": true,
        "filterType": "string",
        "filterString": "name=ilike.*{{ $json.params.searchText }}*"
      },
      "typeVersion": 1
    },
    {
      "id": "51ca1339-0864-4fdd-a068-f3aaba97d36f",
      "name": "Format Search Results",
      "type": "n8n-nodes-base.code",
      "position": [
        -272,
        1040
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nconst chatId = $('Parse Command and Parameters').first().json.chatId;\nconst searchText = $('Parse Command and Parameters').first().json.params.searchText;\n\nif (items.length === 0) {\n  return [{\n    json: {\n      chatId: chatId,\n      message: `\ud83d\udd0d No products found matching \"${searchText}\"`\n    }\n  }];\n}\n\nlet message = `\ud83d\udd0d Search results for \"${searchText}\" (${items.length}):\\n\\n`;\n\nitems.forEach((item, index) => {\n  const p = item.json;\n  message += `${index + 1}. [ID: ${p.id}] ${p.name}\\n`;\n  message += `   \ud83d\udcb0 $${p.price} | \ud83d\udcca Qty: ${p.quantity} | \ud83c\udff7\ufe0f ${p.category}\\n\\n`;\n});\n\nreturn [{ json: { chatId, message } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "d6b791df-df03-4aba-93a3-4bbbd6c142d3",
      "name": "Send Search Results",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -48,
        1040
      ],
      "parameters": {
        "text": "={{ $json.message }}",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "c572235c-384e-4e39-94c1-c1e418170b3c",
      "name": "Send Search Error",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -496,
        848
      ],
      "parameters": {
        "text": "\u274c Error: {{ $json.params.error }}\n\n\ud83d\udcdd Correct format:\n/search text\n\nExample:\n/search iPhone",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "00d4fabb-b25d-41e9-8fd5-96395624b1bc",
      "name": "Send Help Message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -720,
        1136
      ],
      "parameters": {
        "text": "=\ud83d\udcda *Available Commands*\n\n\u2795 */add* name, price, quantity, category\nAdd a new product to the database\nExample: `/add iPhone 15, 999.99, 50, electronics`\n\n\ud83d\udccb */list* \\[category\\]\nList all products or filter by category\nExample: `/list` or `/list electronics`\n\n\ud83d\udd0d */get* id\nGet details of a specific product\nExample: `/get 15`\n\n\u270f\ufe0f */update* id field=value\nUpdate product fields\nExample: `/update 15 price=899 quantity=45`\n\n\ud83d\uddd1\ufe0f */delete* id\nDelete a product\nExample: `/delete 15`\n\n\ud83d\udd0e */search* text\nSearch products by name\nExample: `/search iPhone`\n\n\u2753 */help*\nShow this help message",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "12d7c984-6daa-4fa7-8abb-5354efbf225c",
      "name": "Send Unknown Command",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -720,
        1328
      ],
      "parameters": {
        "text": "=\u2753 Unknown command.\n\nUse /help to see available commands.",
        "chatId": "={{ $json.chatId }}",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "8bb58b4c-aeb7-47a1-bf59-d9a5b9dd419d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2672,
        -480
      ],
      "parameters": {
        "width": 576,
        "height": 1300,
        "content": "## How it works\nThis workflow turns Telegram into a database management interface for Supabase. Send commands to your bot to create, read, update, delete, and search records in your database - all from your phone.\n\n1. **Receive message** - Telegram trigger captures incoming messages\n2. **Validate user** - Checks if sender's chat ID matches authorized list\n3. **Parse command** - Extracts command type and parameters\n4. **Route & execute** - Performs the appropriate Supabase operation\n5. **Respond** - Sends formatted results back to Telegram\n\n## Setup steps\n1. Create a Telegram bot via @BotFather and get your API token\n2. Configure Telegram credentials in n8n\n3. Create a Supabase project and get your API credentials\n4. Create your `products` table (see SQL below)\n5. Edit the \"Is Authorized?\" node and add your Telegram chat ID(s)\n6. Activate the workflow and test with /help\n\n## Supabase table SQL\n```sql\nCREATE TABLE products (\n  id SERIAL PRIMARY KEY,\n  name TEXT NOT NULL,\n  price DECIMAL(10,2),\n  quantity INTEGER DEFAULT 0,\n  category TEXT,\n  created_at TIMESTAMP DEFAULT NOW()\n);\n```\n\n## Add authorized users\nTo authorize more users, edit the \"Is Authorized?\" node and add more OR conditions with their chat IDs.\n\n## Customization Guide\n\n**To use a different table:**\n1. Change `products` to your table name in all Supabase nodes\n2. Update field names in \"Parse Command\" node\n3. Update field mappings in \"Supabase Insert\" node\n4. Adjust response formatting in Code nodes\n\n**To add more authorized users:**\n1. Open the \"Is Authorized?\" node\n2. Add another OR condition\n3. Set it to check chatId equals the new user's ID"
      },
      "typeVersion": 1
    },
    {
      "id": "564354f4-db78-4911-9e50-5ae3ed89062f",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1686,
        256
      ],
      "parameters": {
        "color": 7,
        "width": 412,
        "height": 272,
        "content": "### \ud83d\udd10 Authorization\nExtracts chat ID from message and validates against authorized list using OR conditions. To add more users, edit the If node and add more conditions."
      },
      "typeVersion": 1
    },
    {
      "id": "22d93087-692b-4901-9e49-688005af6cb1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 472,
        "height": 576,
        "content": "### \ud83d\udd00 Command Router\nParses the message to extract the command and routes to the appropriate handler. Supports: /add, /list, /get, /update, /delete, /search, /help"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "e6913d36-9002-42b6-be32-9a71209b6466",
  "connections": {
    "Add Has Error?": {
      "main": [
        [
          {
            "node": "Send Add Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase Insert Product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Has Error?": {
      "main": [
        [
          {
            "node": "Send Get Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase Get Product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Authorized?": {
      "main": [
        [
          {
            "node": "Parse Command and Parameters",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Route by Command": {
      "main": [
        [
          {
            "node": "Add Has Error?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Filter by Category?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get Has Error?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update Has Error?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Delete Has Error?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Search Has Error?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Help Message",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Unknown Command",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Extract Message Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete Has Error?": {
      "main": [
        [
          {
            "node": "Send Delete Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase Delete Product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Has Error?": {
      "main": [
        [
          {
            "node": "Send Search Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase Search Products",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Product List": {
      "main": [
        []
      ]
    },
    "Supabase List All": {
      "main": [
        [
          {
            "node": "Format Product List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Has Error?": {
      "main": [
        [
          {
            "node": "Send Update Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Prepare Update Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter by Category?": {
      "main": [
        [
          {
            "node": "Supabase List Filtered",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Supabase List All",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Product List": {
      "main": [
        [
          {
            "node": "Send Product List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Update Data": {
      "main": [
        [
          {
            "node": "Supabase Update Product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Message Data": {
      "main": [
        [
          {
            "node": "Is Authorized?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Get Product": {
      "main": [
        [
          {
            "node": "Send Product Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Search Results": {
      "main": [
        [
          {
            "node": "Send Search Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase List Filtered": {
      "main": [
        [
          {
            "node": "Format Product List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Delete Product": {
      "main": [
        [
          {
            "node": "Send Delete Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Insert Product": {
      "main": [
        [
          {
            "node": "Send Add Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Update Product": {
      "main": [
        [
          {
            "node": "Send Update Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase Search Products": {
      "main": [
        [
          {
            "node": "Format Search Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Command and Parameters": {
      "main": [
        [
          {
            "node": "Route by Command",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Receive message — Telegram trigger captures incoming bot messages Validate user — Checks if sender's chat ID is in the authorized list Parse command — Extracts command type (/add, /list, etc.) and parameters Route & execute — Performs the appropriate Supabase operation (INSERT,…

Source: https://n8n.io/workflows/13166/ — 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

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Telegram Trigger, n8n, Telegram +4
Slack & Telegram

This template is ideal for users managing Telegram channels who want to automate the process of posting messages, including text and images, directly from an bot.

Telegram Trigger, Postgres, Telegram
Slack & Telegram

This template is for developers and automation specialists looking to create a Telegram bot that enables users to select items from a predefined list and save their choices to a Postgres database.

Telegram, Postgres, Telegram Trigger
Slack & Telegram

This workflow is for Telegram bot developers or marketers who want to verify user subscriptions to specific Telegram channels and optionally reward them with downloadable files.

Telegram, Postgres, Google Drive +1
Slack & Telegram

This workflow is ideal for businesses or individuals who want to run Telegram-based giveaways that require users to subscribe to certain channels in order to participate.

Telegram, Postgres, Telegram Trigger