Telegram + PDF.co: client-ready portfolio PDFs sent
Your “weekly portfolio update” starts as a good intention, then turns into a messy mix of screenshots, half-finished notes, and last-minute PDF formatting. By the time it’s ready, the market has already moved and you’re still hunting for the right version of the file.
This hits advisors and newsletter operators first. But if you’re running a small investment community on Telegram, you feel it too. Telegram PDF reports shouldn’t take your whole Friday afternoon.
This automation turns research, holdings data, and commentary into a polished PDF, then delivers it to every registered subscriber on Telegram. You’ll see what it does, what you need, and how teams typically use it week after week.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Telegram + PDF.co: client-ready portfolio PDFs sent
flowchart LR
subgraph sg0["Telegram Flow"]
direction LR
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Telegram Trigger"]
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>GET Supabase User"]
n21@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF User Exists", pos: "b", h: 48 }
n22["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>Create Supabase User"]
n23["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Download PDF Telegram"]
n24@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Analysis", pos: "b", h: 48 }
n25@{ icon: "mdi:robot", form: "rounded", label: "Agent Analysis PDF", pos: "b", h: 48 }
n26["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send Analysis Confirmation"]
n27@{ icon: "mdi:robot", form: "rounded", label: "Conversation Agent", pos: "b", h: 48 }
n28@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Conversation", pos: "b", h: 48 }
n29["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Send Reply Conversation"]
n30["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code"]
n31["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>Supabase"]
n32@{ icon: "mdi:memory", form: "rounded", label: "Postgres Chat Memory", pos: "b", h: 48 }
n33@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF You Have PDF", pos: "b", h: 48 }
n34@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n35["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request1"]
n36["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request2"]
n37["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>GET Supabase User1"]
n38["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>Update wallet"]
n39@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n40["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request3"]
n41["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>Created Supabase Wallet"]
n42["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>Supabase1"]
n43@{ icon: "mdi:swap-vertical", form: "rounded", label: "update_wallet", pos: "b", h: 48 }
n44["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request4"]
n45["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>HTML1"]
n46@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser1", pos: "b", h: 48 }
n47@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n48@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model4", pos: "b", h: 48 }
n49["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/perplexity.dark.svg' width='40' height='40' /></div><br/>Message a model1"]
n50@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model5", pos: "b", h: 48 }
n51@{ icon: "mdi:robot", form: "rounded", label: "RESEARCH REQUEST SPECIALIST ..", pos: "b", h: 48 }
n52["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>PARSE RESEARCH1"]
n53["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Perplexity Response Formatter1"]
n54@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n55@{ icon: "mdi:robot", form: "rounded", label: "HTML FORMATTER AGENT1", pos: "b", h: 48 }
n56["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>HTML Report Generator1"]
n57@{ icon: "mdi:web", form: "rounded", label: "PDF Generator1", pos: "b", h: 48 }
n58["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Telegram1"]
n39 --> n38
n39 --> n41
n30 --> n27
n34 --> n35
n45 --> n57
n31 --> n30
n58 --> n42
n35 --> n36
n36 --> n25
n40 --> n58
n44 --> n34
n38 --> n26
n43 -.-> n27
n21 --> n33
n21 --> n22
n57 --> n40
n33 --> n23
n33 --> n31
n24 -.-> n25
n52 --> n49
n49 --> n53
n19 --> n20
n20 --> n21
n25 --> n37
n27 --> n29
n37 --> n39
n47 -.-> n55
n48 -.-> n46
n50 -.-> n51
n28 -.-> n27
n22 --> n33
n32 -.-> n27
n23 --> n44
n55 --> n56
n56 --> n45
n41 --> n26
n54 -.-> n46
n46 -.-> n55
n26 --> n51
n53 --> n55
n51 --> n52
end
subgraph sg1["Schedule Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>HTML"]
n1@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n4@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/perplexity.dark.svg' width='40' height='40' /></div><br/>Message a model"]
n7@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "RESEARCH REQUEST SPECIALIST ..", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>PARSE RESEARCH"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Perplexity Response Formatter"]
n11@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "HTML FORMATTER AGENT", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>HTML Report Generator"]
n14@{ icon: "mdi:web", form: "rounded", label: "PDF Generator", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Telegram"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/postgres.svg' width='40' height='40' /></div><br/>Search Clients"]
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/supabase.svg' width='40' height='40' /></div><br/>Update Sent"]
n0 --> n14
n16 --> n18
n18 --> n5
n15 --> n16
n14 --> n15
n9 --> n6
n17 --> n5
n5 --> n8
n6 --> n10
n4 --> n17
n3 -.-> n1
n2 -.-> n12
n7 -.-> n8
n12 --> n13
n13 --> n0
n11 -.-> n1
n1 -.-> n12
n10 --> n12
n8 --> n9
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n19,n4 trigger
class n25,n27,n46,n51,n54,n55,n1,n8,n11,n12 ai
class n24,n28,n47,n48,n50,n2,n3,n7 aiModel
class n32 ai
class n21,n33,n39 decision
class n17 database
class n35,n36,n40,n44,n57,n14,n15 api
class n30,n52,n53,n56,n9,n10,n13 code
classDef customIcon fill:none,stroke:none
class n19,n20,n22,n23,n26,n29,n30,n31,n35,n36,n37,n38,n40,n41,n42,n44,n45,n49,n52,n53,n56,n58,n0,n6,n9,n10,n13,n15,n16,n17,n18 customIcon
The Problem: Weekly portfolio PDFs are a time sink
Clients and subscribers love “a clean PDF.” You probably don’t. The slow part isn’t the market thinking. It’s the packaging: pulling data from wherever you track positions, summarizing what happened this week, making it look professional, exporting it, then sending it to the right people. One missed chart, one stale number, or one forgotten recipient and suddenly you’re doing damage control. And the more your list grows, the worse it gets because distribution becomes its own job.
The friction compounds. Here’s where it usually breaks down.
- You spend about 2 hours a week just assembling the update, even when the content is “simple.”
- PDF formatting turns into a rabbit hole, which means the report looks inconsistent from week to week.
- Distribution is manual, so someone gets skipped or gets the wrong file version.
- When a subscriber asks a question mid-week, you answer from memory instead of a reliable source of truth.
The Solution: Automated PDF reports delivered via Telegram
This n8n setup actually behaves like two connected automations working together. One flow runs on a schedule and creates the weekly report. It pulls your subscriber list from a database, runs market research through Perplexity, and uses an OpenAI chat model to turn raw findings into a readable narrative. Then it formats the report as HTML, hands that to PDF.co to generate a professional PDF, and sends the finished file to every registered Telegram user. The second flow runs continuously as a Telegram bot, so subscribers can upload a PDF for analysis or ask questions about portfolio changes in plain English, with memory stored in Postgres/Supabase so the conversation stays coherent.
The weekly report flow starts with a Cron schedule (every 7 days). From there, it batches through your users, builds the report content with AI agents, and generates a final PDF via PDF.co. Finally, Telegram delivers it to each recipient and the workflow marks the update as sent so you can track delivery.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you send a weekly PDF to 40 subscribers. Manually, you might spend about 2 hours building the report, plus maybe 1 minute per person to deliver it and handle “can you resend?” messages, so roughly 3 hours total. With this workflow, the scheduled run handles research, writing, PDF generation, and Telegram delivery in the background. You check the output and approve wording (about 10 minutes), then you’re done for the week.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram for subscriber delivery and bot conversations
- PDF.co to generate polished PDFs from HTML
- OpenAI API key (get it from the OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, set environment variables, and test a few runs end-to-end.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A schedule kicks off the weekly run. A Cron-style trigger starts the workflow every 7 days, then pulls your current subscriber list from Postgres so the report always goes to the right people.
Research and data get shaped into “report-ready” content. Perplexity is used for market research, and AI agents map that response into structured sections. There’s also parsing and cleanup (so the final report doesn’t include odd formatting or broken tables).
The report is assembled and turned into a PDF. The workflow builds HTML, applies a consistent layout, then sends it to PDF.co to generate the final document. This is the moment that replaces all the manual copy-paste and template tweaking, honestly the part most teams hate.
Telegram delivers it, and delivery is recorded. The bot sends the PDF to each user and marks the report as sent in your database (Supabase is used for updates and status), which helps when someone asks, “Did I get last week’s report?”
You can easily modify the report sections to match your strategy (or compliance needs) based on your audience. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set up the scheduled run that starts the automated research report pipeline for all clients.
- Add and open Scheduled Start Trigger.
- Choose your preferred schedule settings for the report cadence (daily, weekly, or custom).
- Confirm the flow continues from Scheduled Start Trigger to Retrieve Client List.
Step 2: Connect Client Data Sources and Iteration
Configure database access and batching to pull client records and process them one at a time.
- Open Retrieve Client List and connect it to your customer database query.
- Credential Required: Connect your Postgres credentials.
- Open Iterate Records and set your batch size to control how many clients are processed per run.
- Verify the path Retrieve Client List → Iterate Records → Research Request Agent.
Step 3: Configure Telegram Intake and User Checks
Set up the inbound Telegram channel that lets users request and download PDFs, then route requests through user checks.
- Open Telegram Incoming Trigger and connect your bot.
- Credential Required: Connect your Telegram credentials.
- Open Fetch Supabase User, User Exists Check, and Create Supabase Record to map Telegram users to your database.
- Credential Required: Connect your Supabase credentials for all Supabase nodes in this flow (Fetch Supabase User, Create Supabase Record, Supabase Lookup, Fetch Supabase User B, Update Wallet Record, Create Wallet Record, Mark Sent Update, Supabase Update).
- Confirm the routing: User Exists Check → Check PDF Availability or Create Supabase Record.
Step 4: Set Up the AI Research Pipeline
Configure the agents, parsers, and LLMs that generate structured research and HTML-ready content.
- Open Research Request Agent, Parse Research Data, Perplexity Query, and Perplexity Response Mapper to define the research prompt and mapping logic.
- Credential Required: Connect your Perplexity credentials to Perplexity Query and Perplexity Query B.
- Connect OpenAI credentials to the language model nodes: OpenAI Chat Engine, OpenAI Chat Engine A, OpenAI Chat Engine B, OpenAI Chat Engine C, OpenAI Chat Engine D, OpenAI Chat Engine E, OpenAI Conversation Model, and OpenAI Analysis Model.
- Ensure Structured Result Parser and Auto Repair Parser are attached to HTML Formatting Agent via the AI output parser connections, and Structured Result Parser B and Auto Repair Parser B to HTML Formatting Agent B.
- For conversational flows, ensure Postgres Memory Store and Wallet Update Tool are attached to Dialogue Agent as memory and tool inputs.
Step 5: Configure HTML and PDF Generation
Build HTML reports and convert them to PDFs before distribution.
- Confirm the formatting chain: HTML Formatting Agent → HTML Report Builder → HTML Formatter → PDF Build Service.
- Repeat for the secondary path: HTML Formatting Agent B → HTML Report Builder B → HTML Formatter B → PDF Build Service B.
- Credential Required: Connect your PDFco credentials in PDF Build Service and PDF Build Service B.
Step 6: Configure External API Calls and Delivery
Route PDFs through external API steps and deliver them via Telegram with status updates.
- Verify the primary delivery path: PDF Build Service → External API Call → Telegram Dispatch → Mark Sent Update → Iterate Records.
- Configure the secondary delivery path: PDF Build Service B → Quaternary API Call → Telegram Dispatch B → Supabase Update.
- Credential Required: Connect your Telegram credentials for all Telegram nodes (Telegram Dispatch, Telegram Dispatch B, Telegram PDF Download, Send Analysis Notice, Send Conversation Reply).
- If your httpRequest nodes require authentication, add the relevant API credentials to Initial API Call, Secondary API Call, Tertiary API Call, Quaternary API Call, and External API Call.
Step 7: Configure PDF Analysis, Wallet Updates, and Dialogue
Finalize the conversational loop, credit checks, and post-analysis notice pipeline.
- Confirm the analysis pipeline from Telegram PDF Download → Initial API Call → Delay Step → Secondary API Call → Tertiary API Call → PDF Analysis Agent.
- Verify wallet routing: Fetch Supabase User B → Wallet Condition → Update Wallet Record or Create Wallet Record → Send Analysis Notice.
- Ensure conversation flow from Supabase Lookup → Transform Script → Dialogue Agent → Send Conversation Reply.
Step 8: Test and Activate Your Workflow
Run a manual test to confirm each branch works, then activate the workflow for production use.
- Click Execute Workflow and verify the Scheduled Start Trigger path runs through Retrieve Client List → Telegram Dispatch with valid outputs.
- Send a test message to your bot to trigger Telegram Incoming Trigger and confirm Send Conversation Reply returns a response.
- Check that PDFs are generated at PDF Build Service and delivered by Telegram Dispatch and Telegram Dispatch B.
- When successful, toggle the workflow to Active to enable scheduled production runs.
Common Gotchas
- Telegram bot permissions can be the silent killer. If messages stop sending, check the bot token, chat ID mapping, and whether the bot is allowed to post in the target chats.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- PDF.co templates can look “off” if your HTML/CSS is slightly inconsistent. Keep your HTML formatter strict, and test with a long report so page breaks don’t surprise you.
Frequently Asked Questions
Plan for about 60–90 minutes if your Telegram bot and API keys are ready.
No. You’ll mostly connect accounts and paste API keys. Light edits to prompts or HTML are optional, not required.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI and Perplexity usage, plus PDF.co credits depending on how many PDFs you generate.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s one of the best reasons to use n8n here. You can change the weekly schedule by adjusting the Scheduled Start Trigger, and you can swap report sections by editing the HTML Report Builder and HTML Formatter steps. Common tweaks include adding your logo and disclaimers, changing the order of sections (holdings first vs. market recap first), and sending different PDFs to different user segments based on what’s stored in Supabase/Postgres.
Most of the time it’s a bad bot token or a chat ID mismatch after someone changes usernames or moves to a new group. Regenerate the token in BotFather if needed, then confirm your workflow is sending to the right chat IDs from your database. If it fails only on some messages, Telegram rate limits can also be the culprit when you broadcast to a large list in a tight loop.
A few hundred recipients per weekly run is realistic for most setups.
Often, yes, because you’re doing more than moving data from A to B. This workflow chains research, AI writing, HTML formatting, PDF generation, and a broadcast-style Telegram send, plus it tracks users in a database and remembers conversations. Zapier or Make can handle pieces of that, but the moment you need branching logic, batching, retries, and “mark as sent” tracking, it gets expensive and brittle. n8n also gives you the option to self-host, which matters when execution volume grows. If you want a sanity check on complexity and cost, Talk to an automation expert.
Once this is in place, your weekly report becomes a routine, not a scramble. The workflow handles the repetitive parts so you can spend your time on the actual decisions.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.