Every 30 minutes
Add new blog posts to my Buffer queue
When a new article appears in a blog's RSS feed, a post with its title and link is added to the Buffer queue of the chosen channels, and an email confirms what was queued.
- Runs
- Every 30 minutes
- Apps
- Buffer
- AI
- Not needed
- Access
- API key
Send this to your assistant
Create a ClickRuntime automation: every 30 minutes, check the RSS feed at https://blog.example.com/feed for new articles and add a post with the title and link to my Buffer queue for LinkedIn and X, then email me what was queued.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Publishing an article and then remembering to share it on every channel is a two-step job, and the second step is the one that slips. Posts go out late, or only on the network the author happens to use.
This automation watches your blog's RSS feed and adds a post with the title and link to your Buffer queue for the channels you choose as soon as a new article appears. Buffer then publishes it in your normal posting slots.
You get an email each time something is queued, so you can open Buffer and tweak the wording before it goes out.
What you get out of it
Every article shared
New posts reach your social channels without a manual step.
Uses your schedule
Posts fill your existing Buffer slots instead of going out at random times.
No back-catalogue flood
Only articles published after setup are queued.
Room to edit
The email lets you adjust wording in Buffer before publishing.
Any RSS feed
Works with WordPress, Ghost, Substack and other feeds.
How it works
What happens, step by step
Every 30 minutes, ClickRuntime reads your blog's RSS feed.
It picks out articles it has not seen before.
For each, it adds a post with the title and link to the Buffer queue of each channel you chose.
Buffer publishes them in your next open slots, and you get an email listing what was queued.
Before it runs live
- Connect Buffer
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Act only on the items that match your own rules, and skip the rest
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Buffer steps into one automation
Under the hood
The code that runs this automation
import xml.etree.ElementTree as ET
from clickruntime import on_trigger, credentials, http, notify, state, report_fetched
FEED = "https://blog.example.com/feed"
CHANNEL_IDS = ["linkedin-channel-id", "x-channel-id"] # from Buffer's channels query
def buffer(query, variables=None):
resp = http.post("https://api.buffer.com", json={"query": query, "variables": variables or {}},
headers={"Authorization": f"Bearer {credentials.secret('BUFFER_API_KEY')}"})
resp.raise_for_status()
return resp.json()["data"]
@on_trigger
def run(event):
root = ET.fromstring(http.get(FEED).content)
items = [(i.findtext("guid") or i.findtext("link"), i.findtext("title"), i.findtext("link"))
for i in root.iter("item")]
seen = state.get("seen")
if seen is None: # first run: remember what's there, don't flood the queue
state.set("seen", [i[0] for i in items])
return {"queued": 0}
new = [i for i in items if i[0] not in seen]
report_fetched(len(new))
for _, title, link in reversed(new):
for ch in CHANNEL_IDS:
buffer("mutation($input: CreatePostInput!) { createPost(input: $input) { ... on PostActionSuccess { post { id } } "
"... on MutationError { message } } }",
{"input": {"channelId": ch, "text": f"{title}\n{link}", "schedulingType": "automatic", "mode": "addToQueue"}})
if new:
notify.email_me(f"{len(new)} blog post{'s' if len(new) > 1 else ''} added to Buffer",
"\n\n".join(f"\"{t}\"\n{l}" for _, t, l in new) +
"\n\nBuffer will publish each in the next open slot for each channel.")
state.set("seen", (seen + [i[0] for i in new])[-500:])
return {"queued": len(new)}FAQ
Common questions
Will it post my whole back catalogue on the first run?
When do the posts go out?
Can it write a different message for each network?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Share each published Buffer post in Slack
Every post Buffer publishes shows up in our marketing channel with its text and link.
See how it worksGet alerted when a Buffer post fails to publish
Every 15 minutes, Buffer is checked for posts that failed to publish, and each new failure is emailed with the channel, the scheduled time and the start of the post.
See how it worksGet warned before a Buffer queue runs out
Each morning I hear about any Buffer channel with too few posts lined up.
See how it worksKeep exploring
Set up “Add new blog posts to my Buffer queue” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.