<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ichigowa</title>
    <description>The latest articles on DEV Community by Ichigowa (@ichigowa).</description>
    <link>https://dev.to/ichigowa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4042780%2F0955c020-1150-4226-abcb-5563c4ff2efa.png</url>
      <title>DEV Community: Ichigowa</title>
      <link>https://dev.to/ichigowa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ichigowa"/>
    <language>en</language>
    <item>
      <title>Automate FOMC and CPI Alerts with n8n and a Free Economic Calendar API</title>
      <dc:creator>Ichigowa</dc:creator>
      <pubDate>Wed, 22 Jul 2026 23:34:26 +0000</pubDate>
      <link>https://dev.to/ichigowa/automate-fomc-and-cpi-alerts-with-n8n-and-a-free-economic-calendar-api-3j87</link>
      <guid>https://dev.to/ichigowa/automate-fomc-and-cpi-alerts-with-n8n-and-a-free-economic-calendar-api-3j87</guid>
      <description>&lt;p&gt;If you trade — or just hold anything denominated in dollars — you already know the drill: FOMC decisions, CPI prints, and NFP releases move markets in seconds, and the only warning you get is whatever tab you happened to leave open. This post walks through a small n8n workflow that polls an economic calendar every morning and pushes high-impact USD events straight to Telegram. Total build time: about 15 minutes. Total cost: $0 on free tiers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with checking ForexFactory manually
&lt;/h2&gt;

&lt;p&gt;ForexFactory's calendar is the de facto standard for retail traders, but it's built for humans, not machines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No official API.&lt;/strong&gt; The calendar is rendered HTML with timezone handling done client-side. There's an unofficial weekly XML feed, but it's coarse, cached, and has broken without notice before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual checking doesn't scale.&lt;/strong&gt; You'll check it religiously for a week, then miss the one CPI print that mattered because it landed on a day you didn't look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scraping it yourself is annoying.&lt;/strong&gt; The site uses Cloudflare, session-dependent timezone cookies, and markup that shifts often enough that a naive scraper needs regular babysitting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could pay for a commercial economic calendar API — most start around $30–100/month for the tier that includes forecast/previous values. That's overkill if all you want is "ping me when something big is scheduled today."&lt;/p&gt;

&lt;h2&gt;
  
  
  The actor
&lt;/h2&gt;

&lt;p&gt;Disclosure up front: I built the actor used in this tutorial, so take the recommendation with that in mind.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/ichigowa/economic-calendar-pro" rel="noopener noreferrer"&gt;economic-calendar-pro&lt;/a&gt; is an Apify actor that scrapes the ForexFactory calendar and returns clean JSON. It handles the annoying parts (timezones, session cookies, markup drift) and gives you filters for currency and impact level, plus optional webhook alerts. Each event comes out looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CPI m/m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"High"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"date_utc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-12T12:30:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forecast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previous"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.3%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"actual"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"week"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"this"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forexfactory"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it runs on Apify, you don't host anything — you call one HTTP endpoint and get dataset items back synchronously.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're building
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Schedule (weekdays 07:00)
  → HTTP Request (run actor, get this week's USD high-impact events)
  → Filter (belt-and-suspenders: impact == high, currency == USD)
  → Telegram (one message per event)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If there are no qualifying events, the filter drops everything and nothing gets sent. Quiet days stay quiet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An n8n instance (cloud or self-hosted — &lt;code&gt;docker run -p 5678:5678 n8nio/n8n&lt;/code&gt; works fine)&lt;/li&gt;
&lt;li&gt;A free &lt;a href="https://apify.com" rel="noopener noreferrer"&gt;Apify account&lt;/a&gt; — grab your API token from &lt;strong&gt;Settings → Integrations&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A Telegram bot: message &lt;a href="https://t.me/BotFather" rel="noopener noreferrer"&gt;@BotFather&lt;/a&gt;, send &lt;code&gt;/newbot&lt;/code&gt;, save the token. Then message your bot once and get your chat ID from &lt;code&gt;https://api.telegram.org/bot&amp;lt;TOKEN&amp;gt;/getUpdates&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Schedule Trigger
&lt;/h2&gt;

&lt;p&gt;Add a &lt;strong&gt;Schedule Trigger&lt;/strong&gt; node. Switch it to a cron expression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt; * * &lt;span class="m"&gt;1&lt;/span&gt;-&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's 07:00 every weekday, which comfortably beats the 08:30 ET releases (CPI, NFP) and afternoon FOMC statements. Set your instance timezone in n8n settings if you haven't — cron runs in instance time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Call the actor with an HTTP Request node
&lt;/h2&gt;

&lt;p&gt;Add an &lt;strong&gt;HTTP Request&lt;/strong&gt; node (typeVersion 4.x):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method:&lt;/strong&gt; POST&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;https://api.apify.com/v2/acts/ichigowa~economic-calendar-pro/run-sync-get-dataset-items
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headers:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer YOUR_APIFY_TOKEN
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Body (JSON):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"weeks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"this"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"impacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"High"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;run-sync-get-dataset-items&lt;/code&gt; endpoint is the useful one here: it starts the actor, waits for it to finish, and returns the dataset items directly in the response body. No polling for run status, no second request to fetch results. Bump the node's timeout to ~120 seconds since a cold actor run can take 30–60s.&lt;/p&gt;

&lt;p&gt;Hit &lt;strong&gt;Execute step&lt;/strong&gt;. On a day with a CPI print you'll get something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CPI m/m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"impact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"High"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"date_utc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-12T12:30:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forecast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"previous"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.3%"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Core CPI m/m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"impact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"High"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"date_utc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-12T12:30:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forecast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.3%"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"previous"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.3%"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;n8n automatically splits the array into one item per event, which is exactly what we want downstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Filter (defense in depth)
&lt;/h2&gt;

&lt;p&gt;The actor already filtered server-side, but I like a &lt;strong&gt;Filter&lt;/strong&gt; node here anyway — it protects you if you later widen the actor input to all currencies and forget this workflow feeds Telegram. Two conditions, combined with AND:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;{{ $json.impact }}&lt;/code&gt; equals &lt;code&gt;High&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{ $json.currency }}&lt;/code&gt; equals &lt;code&gt;USD&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cheap insurance, zero cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Telegram message
&lt;/h2&gt;

&lt;p&gt;Add a &lt;strong&gt;Telegram&lt;/strong&gt; node, operation &lt;strong&gt;Send Message&lt;/strong&gt;, using the bot credentials you created. Set the chat ID, enable Markdown parse mode, and use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔔 *{{ $json.title }}*
Currency: {{ $json.currency }} | Impact: {{ $json.impact }}
Time (UTC): {{ $json.date_utc }}
Forecast: {{ $json.forecast || 'n/a' }} | Previous: {{ $json.previous || 'n/a' }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the filter outputs one item per event, you get one message per event. On FOMC day that's typically two or three messages (rate decision, statement, press conference); most days it's zero or one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it
&lt;/h2&gt;

&lt;p&gt;Execute the whole workflow once manually to sanity-check, then toggle it &lt;strong&gt;Active&lt;/strong&gt;. Sample output in Telegram:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔔 &lt;strong&gt;Consumer Price Index (CPI) m/m&lt;/strong&gt;&lt;br&gt;
Currency: USD | Impact: High&lt;br&gt;
Time (UTC): 2026-08-12T12:30:00Z&lt;br&gt;
Forecast: 0.2% | Previous: 0.3%&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n:&lt;/strong&gt; free self-hosted; cloud starts at ~€20/month but this workflow fits in any tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apify:&lt;/strong&gt; free plan includes $5 of monthly platform credit. One daily run of this actor uses a few cents' worth — a weekday-morning schedule stays comfortably inside the free tier. No credit card needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram:&lt;/strong&gt; free.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;A few failure modes I've seen people hit with this exact setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP 401 from Apify.&lt;/strong&gt; The header must be literally &lt;code&gt;Authorization: Bearer apify_api_xxx...&lt;/code&gt; — a common mistake is pasting the token without the &lt;code&gt;Bearer&lt;/code&gt; prefix, or using the account password instead of the API token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP 408 / timeout on the sync endpoint.&lt;/strong&gt; &lt;code&gt;run-sync-get-dataset-items&lt;/code&gt; caps waits at 300 seconds. If the actor run exceeds your HTTP node timeout, raise the node timeout first; the actor itself rarely takes over a minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty array when you expected events.&lt;/strong&gt; The &lt;code&gt;weeks&lt;/code&gt; parameter fetches whole calendar weeks ("this", "next", "last"), so an empty result usually means your filters were too tight — e.g. &lt;code&gt;impacts: ["High"]&lt;/code&gt; on a week with only medium-impact USD events. Impact values are capitalized: &lt;code&gt;High&lt;/code&gt;, &lt;code&gt;Medium&lt;/code&gt;, &lt;code&gt;Low&lt;/code&gt;, &lt;code&gt;Holiday&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram sends nothing, no error.&lt;/strong&gt; Usually the bot was never messaged first (bots can't initiate chats), or the chat ID is a group ID missing the leading &lt;code&gt;-&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate alerts after editing.&lt;/strong&gt; If you re-activate a workflow n8n may fire a catch-up execution depending on your settings; check &lt;strong&gt;Workflow Settings → Timezone/Execution&lt;/strong&gt; if you get a surprise 2 a.m. message.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Variations worth trying
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wider net:&lt;/strong&gt; set &lt;code&gt;"currencies": ["USD", "EUR", "GBP"]&lt;/code&gt; and drop the filter's currency condition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same-hour warning:&lt;/strong&gt; add a second schedule that runs every 30 minutes, and a Filter condition like &lt;code&gt;{{ $json.date_utc }}&lt;/code&gt; within the next hour, so you get a nudge right before the release rather than at breakfast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different sink:&lt;/strong&gt; swap the Telegram node for Discord/Slack — the actor output doesn't change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push instead of pull:&lt;/strong&gt; the actor supports webhook alerts natively if you'd rather skip the schedule entirely and use an n8n Webhook trigger.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Actor: &lt;a href="https://apify.com/ichigowa/economic-calendar-pro" rel="noopener noreferrer"&gt;apify.com/ichigowa/economic-calendar-pro&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ready-made template for this exact workflow (import via &lt;strong&gt;Workflow → Import from File&lt;/strong&gt;): &lt;a href="https://github.com/Ichigowa/apify-datafeeds/blob/main/n8n-templates/fomc-cpi-telegram-alert.json" rel="noopener noreferrer"&gt;&lt;code&gt;fomc-cpi-telegram-alert.json&lt;/code&gt;&lt;/a&gt; in the &lt;a href="https://github.com/Ichigowa/apify-datafeeds" rel="noopener noreferrer"&gt;apify-datafeeds repo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questions or broken edge cases, drop a comment — the actor is actively maintained and issue reports genuinely help.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>api</category>
      <category>finance</category>
    </item>
  </channel>
</rss>
