AutomationFlowsSlack & Telegram › Send Hourly Cryptocurrency Price Summaries to Telegram with Coingecko

Send Hourly Cryptocurrency Price Summaries to Telegram with Coingecko

ByViktor Mikeska @viktormikeska on n8n.io

The workflow triggers every hour (adjustable) and defines a list of assets to track. Real-time market data (price and change) is fetched via the CoinGecko Public API*. Individual coin data is aggregated into a single dataset. A JavaScript node transforms the raw data into a…

Cron / scheduled trigger★★★★☆ complexity10 nodesCoin GeckoTelegram
Slack & Telegram Trigger: Cron / scheduled Nodes: 10 Complexity: ★★★★☆ Added:

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

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": "rXRUNJLmiUjUyaZK",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Automated Telegram Cryptocurrency Price Updates",
  "tags": [],
  "nodes": [
    {
      "id": "7c94b011-e478-449a-bd5a-2626a6a96274",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        -688
      ],
      "parameters": {
        "width": 928,
        "height": 768,
        "content": "## Automated Telegram Cryptocurrency Price Updates\n\n### This template automatically tracks cryptocurrency prices and sends a formatted summary to your Telegram channel.\n\n## How it works\n* The workflow triggers every hour (adjustable) and defines a list of assets to track.\n* Real-time market data (price and change) is fetched via the **CoinGecko Public API**.\n* Individual coin data is aggregated into a single dataset.\n* A JavaScript node transforms the raw data into a clean, human-readable HTML report.\n* The final report is pushed to your Telegram destination using the Telegram node.\n\n## Requirements\n* A Telegram Bot token.\n* A Telegram Chat ID (Group or Channel).\n\n## How to set up\n* **CoinGecko Node:** \n    * No credentials required (Public API).\n* **Telegram Node:** \n    * Create a bot via [BotFather](https://t.me/botfather) and get your API Token.\n    * Create a new Telegram Credential and paste your token.\n    * Add your bot to a channel or group as an admin and get the Chat ID.\n    * Set the Chat ID parameter in the Telegram node.\n* **Schedule Trigger:**\n    * Default is set to 1 hour. Adjust the interval to your preference.\n\n## How to customize\n* **Edit tracked coins:** Open the **'Define Coins'** node and edit tracked assets in the `coinIds` object using CoinGecko slugs.\n* **Styling:** Edit the **'Generate Telegram Message'** node to change emojis, currency formatting, or the report language.\n\n## See it in action\n* [Check this channel](https://t.me/HourlyCryptoPrices) to see live workflow"
      },
      "typeVersion": 1
    },
    {
      "id": "3c0ea8bb-55de-4d4e-a994-60b505b015da",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -464
      ],
      "parameters": {
        "color": "#3B3B3B",
        "width": 416,
        "height": 304,
        "content": "## 1. Data Preparation\nSetting up the schedule and defining which cryptocurrencies to track via API slugs."
      },
      "typeVersion": 1
    },
    {
      "id": "1dc8200e-4a54-4e8d-abd2-e0773b98e17d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -464
      ],
      "parameters": {
        "color": "#3B3B3B",
        "width": 416,
        "height": 304,
        "content": "## 2. Fetching & Processing\nRetrieving live data from CoinGecko and merging individual items into a single dataset."
      },
      "typeVersion": 1
    },
    {
      "id": "44055ebe-b715-49b0-abaf-cbdfe750cbc5",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -464
      ],
      "parameters": {
        "color": "#3B3B3B",
        "width": 416,
        "height": 304,
        "content": "## 3. Formatting & Sending\nGenerating an HTML-formatted summary and sending it to the Telegram destination."
      },
      "typeVersion": 1
    },
    {
      "id": "cf2bdce1-5ada-417e-8c2d-5b7fa03632bd",
      "name": "Run Hourly",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        -320
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "00c8795c-d6d6-4f13-8bfd-c8a2e47d0f83",
      "name": "Define Coins",
      "type": "n8n-nodes-base.code",
      "position": [
        224,
        -320
      ],
      "parameters": {
        "jsCode": "/**\n * Configuration node: Define assets to track.\n * This node maps human-readable names to CoinGecko API IDs (slugs).\n */\n\n// List of assets to be fetched from the API\nconst coinIds = {\n  Bitcoin: \"bitcoin\",\n  Ethereum: \"ethereum\",\n  BNB: \"binancecoin\",\n  Solana: \"solana\",\n  Hyperliquid: \"hyperliquid\",\n  Cardano: \"cardano\",\n  Chainlink: \"chainlink\",\n  TON: \"the-open-network\",\n  Avalanche: \"avalanche-2\",\n  Sui: \"sui\",\n  Polkadot: \"polkadot\",\n  Uniswap: \"uniswap\"\n};\n\n// Extract API slugs from the configuration object and join them into a comma-separated string for the API request.\nreturn {\n  ids: Object.values(coinIds).join(',')\n};"
      },
      "notesInFlow": true,
      "typeVersion": 2
    },
    {
      "id": "67976fbc-8709-4ee0-939c-271e1ff2733a",
      "name": "Fetch Market Data",
      "type": "n8n-nodes-base.coinGecko",
      "position": [
        448,
        -320
      ],
      "parameters": {
        "options": {
          "ids": "={{ $json.ids }}"
        },
        "operation": "market",
        "baseCurrency": "usd"
      },
      "typeVersion": 1
    },
    {
      "id": "9e4013cb-9664-4dc5-8055-6603220006d6",
      "name": "Merge Results",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        672,
        -320
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "848ef6d8-b78d-4665-a93f-1cd82284dca2",
      "name": "Generate Telegram Message",
      "type": "n8n-nodes-base.code",
      "position": [
        896,
        -320
      ],
      "parameters": {
        "jsCode": "/**\n * Processes cryptocurrency market data and generates \n * a formatted HTML message for Telegram.\n */\n\n// Extract the raw data array from the preceding Aggregate node\nconst coins = $input.first().json.data;\n\n// Initialize message with a concise header\nlet message = \"<b>\ud83d\udcc8 Current Crypto Prices</b>\\n\\n\";\n\n/**\n * Iterate through the dataset to build the report lines.\n * Prices and 24h percentage changes are formatted for readability.\n */\nfor (const coin of coins) {\n  const currentPrice = coin.current_price;\n  const changePercentage = coin.price_change_percentage_24h || 0;\n  \n  // Set directional indicator based on the price movement\n  const trendIndicator = changePercentage >= 0 ? \"\ud83d\udd3c\" : \"\ud83d\udd3b\";\n\n  // Dynamic price formatting: \n  // Use 4 decimal places for low-value assets and 2 for major assets\n  const formattedPrice = currentPrice < 1 \n    ? currentPrice.toFixed(4) \n    : currentPrice.toLocaleString('en-US', { \n        minimumFractionDigits: 2, \n        maximumFractionDigits: 2 \n      });\n\n  const formattedChange = changePercentage.toFixed(2);\n\n  // Build the message line using HTML tags for Telegram ParseMode compatibility\n  message += `${coin.name}: <i>$${formattedPrice} (${formattedChange}%)</i> ${trendIndicator}\\n`;\n}\n\nreturn { message };"
      },
      "typeVersion": 2
    },
    {
      "id": "7f7ffdf2-b757-4f0f-86ee-369f3f44b979",
      "name": "Send to Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1120,
        -320
      ],
      "parameters": {
        "text": "={{ $json.message }}",
        "chatId": "REPLACE_WITH_YOUR_CHAT_ID",
        "forceReply": {},
        "replyMarkup": "=",
        "additionalFields": {
          "parse_mode": "HTML",
          "appendAttribution": false
        },
        "replyKeyboardRemove": {},
        "replyKeyboardOptions": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    }
  ],
  "active": false,
  "settings": {
    "timezone": "Europe/Prague",
    "binaryMode": "separate",
    "callerPolicy": "workflowsFromSameOwner",
    "timeSavedMode": "dynamic",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "5bbed0d7-ab22-438d-8b60-dba78cee9d92",
  "connections": {
    "Run Hourly": {
      "main": [
        [
          {
            "node": "Define Coins",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Define Coins": {
      "main": [
        [
          {
            "node": "Fetch Market Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Results": {
      "main": [
        [
          {
            "node": "Generate Telegram Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Market Data": {
      "main": [
        [
          {
            "node": "Merge Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Telegram Message": {
      "main": [
        [
          {
            "node": "Send to Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

The workflow triggers every hour (adjustable) and defines a list of assets to track. Real-time market data (price and change) is fetched via the CoinGecko Public API*. Individual coin data is aggregated into a single dataset. A JavaScript node transforms the raw data into a…

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

Solo founders and spreadsheet gremlins who track everything in Notion and want crisp Telegram pings without opening a single page.

Telegram, Notion
Slack & Telegram

A robust workflow to back up and synchronize your n8n workflows to a GitHub repository, with intelligent change detection and support for file renames.

GitHub, n8n, Telegram +1
Slack & Telegram

With the increasing popularity of stablecoins like USDC, its becoming easier to pay for everyday items with crypto thanks to debit cards from issuers like MetaMask. These solutions work by processing

Telegram, N8N Nodes 1Shot
Slack & Telegram

This workflow continuously monitors the TikTok Ads Library for new creatives from specific advertisers or keyword searches, scrapes them via Apify, logs them into Google Sheets, and sends concise noti

Google Sheets, Slack, Telegram +1
Slack & Telegram

GNCA AI News Pipeline. Uses rssFeedRead, httpRequest, telegram, errorTrigger. Scheduled trigger; 29 nodes.

RSS Feed Read, HTTP Request, Telegram +1