Telegram to WordPress, polished posts published fast
Your Telegram channel is active, but your WordPress site looks neglected. Copying posts over sounds simple until you’re fixing formatting, hunting for images, and realizing you already published that same update yesterday.
This Telegram WordPress automation hits news publishers first, honestly. But content marketers keeping a blog alive and social media managers juggling multiple channels feel it too. You’ll turn Telegram updates into clean, categorized WordPress posts without babysitting the process.
Below is what this workflow does, how the pieces fit together, and what you’ll want to tweak so the posts sound like you, not like a bot.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Telegram to WordPress, polished posts published fast
flowchart LR
subgraph sg0["Telegram rss feed 1 Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Category - Actualitate", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Category - Externe", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Category - Interne", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Category - Interne1", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Category ID & Guid", pos: "b", h: 48 }
n5["<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/merge.svg' width='40' height='40' /></div><br/>Merge1"]
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Category - Interne2", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If news exists", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Message a model5", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields7", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Message a model7", pos: "b", h: 48 }
n12["<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/merge.svg' width='40' height='40' /></div><br/>Merge5"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request4"]
n14["<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 Request5"]
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 Request6"]
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch1", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request7"]
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/merge.svg' width='40' height='40' /></div><br/>Merge3"]
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Category - Social1", pos: "b", h: 48 }
n20@{ icon: "mdi:robot", form: "rounded", label: "Message a model1", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Default Image ID1", pos: "b", h: 48 }
n22@{ icon: "mdi:play-circle", form: "rounded", label: "Telegram rss feed 1", pos: "b", h: 48 }
n23@{ icon: "mdi:play-circle", form: "rounded", label: "Telegram rss feed 2", pos: "b", h: 48 }
n24@{ icon: "mdi:play-circle", form: "rounded", label: "Telegram rss feed 3", pos: "b", h: 48 }
n25@{ icon: "mdi:play-circle", form: "rounded", label: "Telegram rss feed 4", pos: "b", h: 48 }
n26@{ icon: "mdi:play-circle", form: "rounded", label: "Telegram rss feed 5", pos: "b", h: 48 }
n27@{ icon: "mdi:play-circle", form: "rounded", label: "Telegram rss feed 6", pos: "b", h: 48 }
n28["<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 in JavaScript"]
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/merge.svg' width='40' height='40' /></div><br/>Merge"]
n30@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If2", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-vertical", form: "rounded", label: "News exists", pos: "b", h: 48 }
n32@{ icon: "mdi:swap-vertical", form: "rounded", label: "News exists1", pos: "b", h: 48 }
n33["<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"]
n34@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n35@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n36@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign image and video", pos: "b", h: 48 }
n37@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set article", pos: "b", h: 48 }
n38@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set data", pos: "b", h: 48 }
n39@{ icon: "mdi:swap-vertical", form: "rounded", label: "Image", pos: "b", h: 48 }
n40@{ icon: "mdi:swap-vertical", form: "rounded", label: "Video", pos: "b", h: 48 }
n41@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Has video?", pos: "b", h: 48 }
n42@{ icon: "mdi:swap-vertical", form: "rounded", label: "Asign video player", pos: "b", h: 48 }
n34 --> n31
n34 --> n30
n30 --> n35
n30 --> n32
n39 --> n36
n29 --> n28
n40 --> n36
n5 --> n14
n5 --> n21
n5 --> n9
n5 --> n4
n18 --> n16
n12 --> n41
n16 --> n39
n16 --> n40
n38 --> n12
n41 --> n13
n41 --> n42
n35 --> n33
n35 --> n29
n31 --> n8
n37 --> n12
n10 --> n6
n33 --> n29
n32 --> n8
n13 --> n6
n14 --> n15
n15 --> n20
n15 --> n18
n17 --> n6
n8 --> n5
n6 --> n5
n6 --> n35
n20 --> n18
n9 --> n11
n9 --> n38
n11 --> n37
n21 --> n18
n42 --> n17
n28 --> n34
n22 --> n0
n23 --> n1
n24 --> n19
n25 --> n2
n26 --> n3
n27 --> n7
n36 --> n12
n4 --> n12
n1 --> n10
n2 --> n10
n19 --> n10
n3 --> n10
n7 --> n10
n0 --> n10
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 n22,n23,n24,n25,n26,n27 trigger
class n9,n11,n20 ai
class n8,n16,n30,n34,n41 decision
class n13,n14,n15,n17,n33 api
class n28 code
classDef customIcon fill:none,stroke:none
class n5,n12,n13,n14,n15,n17,n18,n28,n29,n33 customIcon
Why This Matters: Telegram Updates Don’t Magically Become Articles
Telegram is fast. WordPress is where the long-term traffic lives. The problem is the gap between them. A short Telegram update often needs a real headline, an intro that makes sense on your site, cleaner structure, and a featured image that won’t break your theme. Then there’s the “did we already post this?” anxiety, because Telegram reposts, edits, and forwarded content can look deceptively new. The result is a constant drip of manual work that steals focus from actual publishing decisions.
The friction compounds. Here’s where it usually breaks down.
- Someone has to copy text, clean it up, and make it readable as a standalone post.
- Images and videos get missed, uploaded twice, or added without the right placement in the article.
- Duplicate posts slip through because the “same story” looks slightly different across updates.
- Categories drift over time, so your site navigation and SEO get messier every week.
What You’ll Build: Telegram RSS to WordPress Publishing Pipeline
This workflow watches one or more Telegram channel RSS feeds and turns each new update into a proper WordPress post. When an item appears, it first normalizes the incoming fields (title, content, GUID, media URL) so everything downstream is predictable. Next, it checks your WordPress site for duplicates using the GUID logic, so reposted or repeated items don’t pollute your archive. If the post is new, GPT-4o rewrites it in a clean news-style format, then runs a second pass to add context and improve flow. Finally, it downloads any attached image or video, uploads it to WordPress, maps media IDs correctly, and publishes the post with the right category and excerpt.
The workflow begins with Telegram RSS triggers (multiple feeds, each mapped to a category). Then it runs duplicate prevention and AI rewriting in two stages. After that, it handles media (image vs. video) and publishes via WordPress REST requests, with a video shortcode inserted when needed.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you publish 5 Telegram updates per weekday and each one needs a quick rewrite, category selection, and a media upload. Manually, that’s maybe 15 minutes per post, so roughly 75 minutes a day (and it gets worse when there’s video). With this workflow, you spend a few minutes up front setting your tone and categories, then each new item is processed and published automatically while you do other work. The “hands-on” part drops to near zero unless you want to review a specific story.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Telegram channel RSS URL for the feeds you want to monitor.
- WordPress site with REST API enabled for publishing.
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Beginner. You’ll connect accounts, paste a few URLs/keys, and test one item end-to-end.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A Telegram RSS item appears. One of the Telegram RSS Trigger nodes fires, and the workflow assigns an initial category based on which feed the item came from.
Duplicates get filtered out early. The workflow queries WordPress posts (with paging) and compares GUIDs. If it finds a match, it flags the item as already published and moves on, which keeps your site clean.
The content gets rewritten into an article. GPT-4o handles a full rewrite with structure first, then a second AI pass enhances context. In the same stretch, the workflow also sets SEO-friendly fields like excerpt and prepares the post payload.
Media is handled and attached automatically. If there’s an image or video, the file is downloaded, uploaded to WordPress, and mapped to the post. Video items can get a shortcode inserted before publishing so they display correctly.
You can easily modify the rewrite style to match your publication voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the RSS Feed Trigger
Set up the Telegram RSS triggers that ingest channel updates and start the workflow.
- Open Telegram RSS Trigger A and set Feed URL to
https://tg.i-c-a.su/rss/bbcnewschannel. - Repeat the same Feed URL and polling schedule for Telegram RSS Trigger B, Telegram RSS Trigger C, Telegram RSS Trigger D, Telegram RSS Trigger E, and Telegram RSS Trigger F.
- Confirm each trigger is connected to its category node: Telegram RSS Trigger A → Set Category Actualitate, Telegram RSS Trigger B → Set Category External, Telegram RSS Trigger C → Set Category Social, Telegram RSS Trigger D → Set Category Internal, Telegram RSS Trigger E → Set Category Internal B, Telegram RSS Trigger F → Set Category Internal C.
Step 2: Configure Category Mapping and Normalization
Map RSS payloads to categories, default image IDs, and GUID fields, then normalize fields for downstream processing.
- In Set Category Actualitate, set article to
{{ $json.contentSnippet }}, image to{{ $json.enclosure.url }}, category_id to46, default_image_id to17505, and guid to{{$json["guid"].split('/').pop()}}. - Repeat the same field mapping pattern for Set Category External (category
43, default image17475), Set Category Social (category17, default image17506), Set Category Internal (category1, default image17504), Set Category Internal B (category1, default image17509), and Set Category Internal C (category44, default image17647, GUID expression{{$json["guid"].split('=').pop()}}). - In Normalize Fields, map article to
{{ $json.article }}, image to{{ $json.image }}, category_id to{{$json.category_id}}, default_image_id to{{ $json.default_image_id }}, guid to{{$json.guid}}, and set next_page to1. - Send Normalize Fields into Batch Iterator to control pagination and batching.
Step 3: Configure Duplicate Checks and Paging
Query WordPress for existing posts with the same GUID and decide whether to continue processing.
- In Query WP Posts, set URL to
https://your-domain.com/wp-json/wp/v2/postsand include query parameters: meta_keyn8n_guid, meta_value{{ $json.guid }}, per_page50, and page{{ $json.current_page }}. - Credential Required: Connect your wordpressApi credentials in Query WP Posts.
- Confirm Update Paging Fields sets guid to
{{ $json.guid }}and current_page to{{ $json.next_page }}. - Ensure Combine Posts Data merges response data before Custom JS Logic runs.
- Verify Check Pages Left evaluates
{{ $json.next_page }}≤{{ $json.total_pages }}and routes to Update Paging Fields or Flag News Missing. - Confirm the flow: Custom JS Logic → Check Duplicates → Flag News Found or paging loop.
Step 4: Set Up AI Rewriting and SEO Enrichment
Use AI to rewrite content, enhance context, and extract SEO metadata.
- In Rewrite Article AI, keep JSON Output enabled and verify it consumes
{{ $json.article }}. - Credential Required: Connect your openAiApi credentials in Rewrite Article AI.
- Confirm parallel execution: Rewrite Article AI outputs to both Context Enhancer AI and Set SEO Fields in parallel.
- In Context Enhancer AI, keep JSON Output enabled and ensure it uses
{{ $json.message.content.headline }},{{ $json.message.content.article_body }}, and{{ $json.message.content.seo_meta.focus_keyword }}. - Credential Required: Connect your openAiApi credentials in Context Enhancer AI.
- In Set SEO Fields, set title to
{{ $json.message.content.headline }}, article to{{ $json.message.content.article_body }}, seo_description to{{ $json.message.content.seo_meta.meta_description }}, and seo_keywords to{{ $json.message.content.seo_meta.focus_keyword }}. - In Set Enhanced Article, set enhanced_article to
{{ $json.message.content.enhanced_article }}and feed into Combine Streams B.
Step 5: Configure Media Download, Upload, and Type Routing
Download media, upload to WordPress, detect type with AI, and map image/video IDs.
- In Combine Streams A, verify it combines inputs and then branches in parallel to Download Media File, Apply Default Image, Rewrite Article AI, and Fetch Category & GUID.
- In Download Media File, set URL to
{{ $json.image }}and keep response format set to file. - In Upload Media to WP, set URL to
https://your-domain.com/wp-json/wp/v2/mediaand keep headers to{"Content-Disposition":"attachment; filename={{$binary.data.fileName.slice(-10)}}","Content-Type":"{{$binary.data.fileType}}"}. - Credential Required: Connect your wordpressApi credentials in Upload Media to WP.
- In Detect Media AI, keep JSON Output enabled and provide
{{ $json.mime_type }}and{{ $json.media_type }}. - Credential Required: Connect your openAiApi credentials in Detect Media AI.
- Confirm parallel execution: Upload Media to WP outputs to both Detect Media AI and Combine Media Data in parallel.
- In Route Media Type, keep rules for
{{ $json.message.content.type }}equalsimageorvideo, routing to Image Media Mapping or Video Media Mapping. - Verify Image Media Mapping sets image_id to
{{ $json.id }}and video_id tono, while Video Media Mapping sets image_id to{{ $json.default_image_id }}and video_id to{{ $json.id }}. - Confirm Map Media IDs outputs image_id as
{{ $json.image_id }}and video_id as{{ $json.video_id }}.
data in Input Data Field Name, resulting in empty media uploads.Step 6: Assemble Content and Route by Media Type
Combine content, media IDs, and SEO fields, then choose publishing path based on video presence.
- In Combine Streams B, keep Mode as
combineand Combine By ascombineByPositionwith Number Inputs set to4. - Confirm Set SEO Fields, Set Enhanced Article, Fetch Category & GUID, and Map Media IDs all feed into Combine Streams B.
- In Evaluate Video Presence, keep the condition
{{ $json.video_id }}equalsnoto route image posts to Publish Post Request. - In Insert Video Shortcode, set enhanced_article to
[playlist type="video" ids="{{ $json.video_id }}" tracklist="false"]{{ $json.enhanced_article }}and keep field mappings for title, article, seo_description, seo_keywords, image_id, video_id, and guid. - Confirm Insert Video Shortcode outputs to Publish Post with Video.
Step 7: Configure WordPress Publishing Requests
Publish posts to WordPress for both image-only and video-enhanced content.
- In Publish Post Request, set URL to
https://your-domain.com/wp-json/wp/v2/postsand keep the JSON body template using{{ $json.title }},{{ JSON.stringify( $json.enhanced_article )}},{{ $json.seo_description }},{{ $json.category_id }},{{ $json.image_id }}, and{{$json.guid}}. - Credential Required: Connect your wordpressApi credentials in Publish Post Request.
- In Publish Post with Video, use the same URL and JSON body structure to publish posts with video shortcode inserted.
- Credential Required: Connect your wordpressApi credentials in Publish Post with Video.
- Ensure both Publish Post Request and Publish Post with Video return to Batch Iterator for continued processing.
Step 8: Test and Activate Your Workflow
Validate the end-to-end flow and enable the automation.
- Click Execute Workflow and manually trigger one of the RSS feeds from Telegram RSS Trigger A to verify ingestion.
- Check that Query WP Posts returns results and that Check Duplicates routes correctly (existing posts should stop, new posts should continue).
- Confirm AI outputs in Rewrite Article AI and Context Enhancer AI produce JSON with content and SEO metadata.
- Verify media uploads in WordPress by checking a new media item created by Upload Media to WP.
- Confirm new posts are published by Publish Post Request or Publish Post with Video and include the n8n_guid meta field.
- When satisfied, toggle the workflow to Active for production use.
Troubleshooting Tips
- WordPress Application Passwords can fail if the user role lacks publishing rights. If posts won’t publish, check the user permissions and the REST API response in the HTTP Request node first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- OpenAI prompts that are left generic will output “fine” writing that still doesn’t match your site. Add your tone rules and formatting preferences in the Rewrite Article AI node so you’re not editing every post later.
Quick Answers
About 10–15 minutes if you already have your RSS feed and WordPress credentials.
No. You’ll mostly paste in URLs, connect WordPress/OpenAI, and test a sample Telegram item.
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 API costs, which are usually low for short rewrites.
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 you should. Most people start by adjusting the prompt in the Rewrite Article AI and Context Enhancer AI nodes so the output matches their editorial style. You can also change category mapping by editing the category Set nodes tied to each Telegram RSS trigger, and tweak media behavior by changing the Route Media Type logic (for example, always forcing a default featured image).
Usually it’s an invalid Application Password or the wrong username paired with it. Update the credentials used by the WordPress HTTP Request nodes, then re-run a single item and check the error body returned by WordPress. If you’re getting permission errors, make sure the WordPress user can publish posts and upload media. Some hosts or security plugins also block REST requests, so you may need to whitelist the endpoint.
For most small sites, it can handle dozens of posts per day without trouble.
Often, yes, because this workflow has branching logic (duplicate checks, paging through WP posts, image vs. video handling, and two AI stages) that gets awkward and expensive in simpler automation tools. n8n also gives you more control over the raw WordPress REST requests, which matters when you need specific fields like excerpts, media IDs, or video shortcodes. If you self-host, you’re not counting every step as a billable task the same way. The tradeoff is that you’ll spend a little more time setting it up the first time. If you’re unsure, Talk to an automation expert and we’ll point you in the right direction.
Once this is running, your Telegram channel stops being a dead-end and starts feeding your site automatically. You get consistency without the daily grind.
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.