n8n blueprint · Media and marketing
News to social posts pipeline
A scheduled n8n workflow reads RSS feeds, drops items it has already seen, drafts channel-specific posts through Vercel AI Gateway, holds them for human approval in Slack, then publishes and logs each result. It must never publish a post that no one approved, and it must never post the same story twice.
- Steps
- 8
- Subjective questions
- 33
- Objective questions
- 33
The problem and the outcome
Problem: Social and content teams read dozens of feeds by hand and rewrite each story for LinkedIn, X and other channels. The work is slow and repetitive, and when people copy and paste under time pressure, duplicate or off-brand posts get published.
Outcome: New stories reach Slack as ready-to-review drafts for each channel, and an editor approves, edits or rejects them with one action. Only approved posts are published, and every decision and post ID is logged for audit.
Architecture
How it works, step by step
- A Schedule Trigger fires on a cron interval. One RSS Read node per feed, or a Loop Over Items over a list of feed URLs, fetches the latest items, and a Merge node combines them into one stream.
- A Code node normalises each item (canonical URL with tracking parameters removed, trimmed title) and hashes it. A Postgres insert with ON CONFLICT DO NOTHING on a unique hash column returns only rows that are actually new, and everything else is dropped.
- For each new item, a Basic LLM Chain using an OpenAI Chat Model sub-node, pointed at https://ai-gateway.vercel.sh/v1 with an AI Gateway API key, runs a model such as anthropic/claude-sonnet-4.5. It returns structured JSON with one draft per channel, written to that channel's length and tone rules, plus the source link.
- The Slack node's send-and-wait operation posts the drafts and the source to a review channel, and the execution pauses. While it waits, the execution is persisted, so it uses no worker capacity.
- The editor approves, edits or rejects the drafts in Slack. A Switch node routes on the response, and edited text replaces the model draft before anything is published.
- HTTP Request nodes publish to each channel's API with stored OAuth credentials and retry-on-fail enabled. Each request carries the item hash so that a retry or replay is never sent as a new post.
- Postgres publish_log records the item hash, channel, final text, approver, decision, platform post ID and timestamps. Rejected items and approvals that timed out are logged as well.
- An Error Trigger workflow catches failed executions from model calls, publishing or Slack. It alerts the team in Slack with a link to the execution, and it never publishes anything itself.
Tech stack
- n8n (self-hosted in queue mode with Redis and workers, or n8n Cloud)
- n8n RSS Read, Code, Switch, Merge and Loop Over Items nodes
- Vercel AI Gateway via the OpenAI-compatible chat model node
- Slack node (send and wait for response)
- Postgres for seen-item hashes and the publish log
- LinkedIn and X APIs via HTTP Request with OAuth2 credentials
- n8n Error Trigger workflow for alerting
Key design decisions
- Deduplicate on a hash of the normalised canonical URL plus title, stored in Postgres with a unique constraint. This survives restarts, and n8n's in-memory or static data cannot be shared safely across queue-mode workers.
- Keep a mandatory human approval step with Slack send-and-wait instead of auto-publishing. A model summary can misstate facts or tone, and a published post on a brand account is hard to retract.
- Route all model calls through Vercel AI Gateway with one credential. This allows switching between models like anthropic/claude-sonnet-4.5 and openai/gpt-5, configuring fallbacks and tracking spend without storing provider keys in n8n.
- Ask the model for strict JSON with one field per channel and validate it in a Code node. This lets each channel's character limits and formatting be enforced before a human ever sees the draft.
- Set an approval timeout and treat expiry as a reject that gets logged. Stale news should not be published hours later just because someone clicked an old message.
Common mistakes
- Deduplicating on feed GUID alone. Many feeds change GUIDs or republish with updated timestamps, and the same story arrives through several feeds with different tracking parameters, so normalise URLs first.
- Letting retry-on-fail on the publish node create duplicate posts. When a request times out after the platform has already accepted it, a retry posts again, so check the publish_log for that hash and channel before sending.
- Passing raw feed HTML into the prompt. It wastes tokens and lets text inside the article steer the model, so strip markup and treat article text as untrusted data, not instructions.
- Sending a single huge Slack message for a burst of items. Use Loop Over Items so each story gets its own approval, and a slow decision on one item does not block the rest.
- Ignoring platform rate limits and token expiry. Store OAuth credentials in n8n, handle refresh, and space out publishes rather than firing them all at once.
What to measure
- Duplicate rate: items reaching Slack that were already published or already reviewed
- Approval rate and edit rate per channel, which show draft quality
- Median time from feed publish to approved post
- Publish failure rate and error-workflow alerts per day
- Model spend per published post, as reported by AI Gateway
Most-asked interview questions
Subjective questions 33
1How do you guarantee the same story is never posted twice?Asked almost every time
I handle it in two layers. At ingestion, a Code node normalises each item by stripping tracking parameters from the URL and lowercasing the host, then hashes the URL together with the title. I insert that hash into a Postgres table with a unique constraint using ON CONFLICT DO NOTHING, and only rows that were actually inserted continue. Because this is atomic in the database, it is safe even when several queue-mode workers run at once. At publish time, I check publish_log for that hash and channel before calling the API, and I write the post ID right after. So if retry-on-fail fires after a timeout, or someone replays an execution, it sees the post already exists and skips it.
2Walk me through the end-to-end architecture of this news-to-social pipeline.Asked almost every time
A Schedule Trigger fires on a cron interval. RSS Read nodes, either one per feed or a Loop Over Items over a list of feed URLs, fetch the latest items, and a Merge node combines them. A Code node normalises each item by canonicalising the URL and trimming the title, then hashes it. A Postgres insert with ON CONFLICT DO NOTHING returns only new rows. For each new item, a Basic LLM Chain calls a model through Vercel AI Gateway and returns structured JSON with one draft per channel. Slack send-and-wait pauses the execution for review. A Switch routes approve, edit or reject. HTTP Request nodes publish with OAuth credentials and the item hash. publish_log records every outcome, and an Error Trigger workflow sends alerts.
3How do you make sure nothing is ever published without a human approving it?Asked almost every time
Publishing is only reachable through one path: the approve or edit branch of the Switch node that follows Slack send-and-wait. The reject, timeout and default branches all lead to logging and never to an HTTP Request publish node. The Error Trigger workflow only sends alerts and holds no publish credentials or nodes. I also check that the response came from an authorised approver before the Switch treats it as approval. Every publish row in publish_log records the approver and the decision, so an audit can confirm that each live post has an approval. In code review I treat any new edge into a publish node from outside the approval branch as a blocking defect.
4A publish request times out but the post actually went live. How do you stop retry-on-fail from creating a duplicate?Asked almost every time
This is the classic ambiguous failure, because a timeout does not tell you whether the post succeeded. Each request carries the item hash. Where the platform supports an idempotency key or client reference, the hash goes there, so the platform rejects or merges the repeat. Where it does not, I check publish_log for a row with the same item hash and channel and a platform post ID before sending. I can also query the platform for recent posts that contain the source link. A unique constraint on item hash and channel in publish_log means a second successful write fails loudly instead of silently recording a duplicate. Retries are bounded and spaced out, not unlimited.
5The item is inserted into the dedup table, but drafting then fails. Is that story lost forever?Asked almost every time
With a bare insert-and-forget design, yes. The insert claims the hash, so future runs will treat the story as seen and skip it. To fix that, I add a status column to the items table with values such as new, drafted, pending_approval, published, rejected, timed_out and failed. The Error Trigger alert links to the execution, and failed rows can be reprocessed by a small recovery workflow that picks up items stuck in new or failed beyond a threshold. The claim still prevents duplicates, because recovery works on existing rows and does not re-insert them. That gives you exactly-one claim without at-most-once loss.
6Why put a human approval step in, and how do you stop it becoming a bottleneck?Very often asked
Model summaries can get facts or tone wrong, and a bad post on a brand account is hard to undo, so a person signs off before anything goes public. To keep it fast, I use the Slack node's send-and-wait operation, which pauses the execution and persists it, so it uses no worker capacity while it waits. Each story gets its own message, sent through Loop Over Items, so one slow decision doesn't hold up the others. The editor can approve, reject or edit the text inline. I also set a timeout so that old news expires and is logged as rejected rather than published late. Edit rates per channel tell me where the prompt needs work.
7Why route the model through Vercel AI Gateway instead of calling a provider directly?Very often asked
In n8n it's simply an OpenAI-compatible chat model node with the base URL set to https://ai-gateway.vercel.sh/v1 and one AI Gateway API key. That key reaches many providers, so I can try anthropic/claude-sonnet-4.5 against openai/gpt-5 by changing a model string rather than adding new credentials. The gateway handles fallbacks if a provider is down and gives me spend tracking per workflow. No provider keys live in n8n, which shrinks the blast radius if the instance is ever compromised. For a content pipeline where quality and cost per post both matter, being able to switch models cheaply is worth a lot.
8Why normalise the URL and title before hashing, and what exactly goes into the hash?Very often asked
Feeds often add tracking parameters such as utm_source, switch between http and https, or add trailing slashes. Feeds and syndication partners can also republish the same link with small changes. If you hash raw values, the same story produces different hashes and gets posted twice. The Code node builds a canonical URL by removing tracking parameters, lowercasing the host and stripping fragments, and it trims the title. The hash is usually built mainly from the canonical URL, because titles get edited after publication. If you include the title, a headline correction looks like a new story. I would hash the canonical URL, keep the title as metadata, and document the rule so it stays consistent across versions.
9Design the Postgres tables for this workflow.Very often asked
I would use two core tables. The items table has a hash as its unique primary key, plus canonical_url, title, feed_source, first_seen_at, a status field and an updated_at column. The publish_log table has an id, item_hash as a foreign key, channel, final_text, approver, decision (approved, edited, rejected or timed_out), platform_post_id, requested_at, published_at and an error field. A partial unique index on (item_hash, channel) where the post was published enforces one live post per story per channel. Indexes on status and first_seen_at support recovery jobs. Drafts can be stored on a separate table, so you can compare model output with the final edited text.
10What happens when an editor never responds to the Slack approval?Very often asked
Send-and-wait is configured with a time limit. When the limit passes, the execution resumes on a timeout path, and that path must never lead to publishing. The item is logged in publish_log with decision timed_out and its status is updated. Older news loses value quickly, so I would usually let it expire rather than auto-publish it. If the team wants a second chance, a reminder in Slack or a re-queue for a later review is acceptable, but it still needs an explicit approval. The timeout length is a product decision based on how quickly the news goes stale and how many reviewers are on shift.
11Why ask the model for structured JSON instead of free text?Very often asked
Downstream nodes need to pick out each channel's draft reliably. Structured output with a fixed schema, such as one field per channel plus the source link, lets the Switch and HTTP Request nodes reference fields directly instead of parsing prose. I validate the output against the schema in a Code node or a structured output parser. That check covers required channels, length limits and whether the source URL matches the input item. If validation fails, I retry once and then send the item to the error path. Validation also catches the model inventing a different link, which matters because a wrong source link is a credibility problem.
12Why use a Basic LLM Chain here instead of an AI Agent node?Very often asked
Drafting posts is a single, predictable transformation: article in, drafts out. It needs no tools, no multi-step reasoning and no memory. A Basic LLM Chain makes one model call with a fixed prompt, so it is cheaper, faster and easier to test. An agent decides which tools to call, and here that only adds variability and attack surface, especially because the input is untrusted feed content. If you later need the model to fetch the full article or check facts, you could add a tool. Even then, I would keep it narrow and read-only, and never give the model a publishing tool.
13How do you defend against prompt injection coming from RSS content?Very often asked
Feed text is untrusted input, so an article can contain instructions aimed at the model. The model has no tools and no publishing ability, so the worst it can do is write a bad draft. In the prompt, I wrap the article in clear delimiters and tell the model to treat it as data only. The output is validated against the schema, and I check that the source link matches the item's canonical URL. Most importantly, a human reads every draft before anything goes out. I would also strip HTML and limit input length, which reduces both injection surface and token cost.
14How do you restrict who can approve posts in Slack?Very often asked
Posting to a review channel is not enough on its own, because anyone in that channel could click approve. After send-and-wait resumes, I check the responding Slack user ID against an allowlist of editors before the Switch treats the response as approval. That allowlist can live in Postgres or in a Set node managed through config. An unauthorised response is logged and does not count as approval. The review channel itself should be private, with controlled membership. The approver's ID goes into publish_log, so every live post can be traced to a named person.
15One channel publishes successfully and another fails. How do you handle the partial failure?Very often asked
Each channel is an independent publish with its own row in publish_log, keyed on item hash and channel. If LinkedIn fails after X succeeds, X's row records a platform post ID and LinkedIn's row records the error. A retry must target only the failed channel, so the retry logic checks publish_log first and skips channels that already have a post ID. That way a re-run never reposts to X. The Error Trigger alerts the team with the execution link. I would not try to roll back the successful post automatically, because deleting a live post is a human decision.
16What does the Error Trigger workflow do, and why must it never publish?Very often asked
It is a separate workflow that starts when a linked execution fails, whether from a model call, a publish request or Slack. It posts an alert to a team Slack channel with the workflow name, the failed node, the error message and a link to the execution, so someone can inspect it or retry it. It must never publish, because it runs outside the approval path. A publish from there could send a draft no one approved, or repeat a post that may already have gone live. Recovery happens through deliberate human action or through the normal approval-gated path.
17Is it safe to replay a failed execution from the n8n UI?Very often asked
It can be, provided every side effect is idempotent. The dedup insert uses ON CONFLICT DO NOTHING, so a replay does not create a new item. However, a replay that starts from the beginning may then return no rows and stop, which is safe but does nothing. Publishing is the dangerous step. Because each request carries the item hash and checks publish_log for an existing post ID on that channel, a replay skips channels that already succeeded. The replay also must not skip approval, so I would only replay executions whose approval is recorded.
18Two outlets publish the same story under different URLs. Does your dedup catch it?Very often asked
Not with exact hashing. The hash dedups the same canonical link, not the same event. For many teams that is acceptable, because the editor rejects the second item in Slack. If duplicates become noisy, I would add a second layer: compare the new title, or an embedding of the title and summary, against recent items using a similarity threshold. Close matches get flagged in the Slack message as possible duplicates rather than dropped automatically. Similarity is fuzzy and false positives would hide real stories, so the human stays in the loop for that decision.
19How do you store and protect credentials in this workflow?Very often asked
The AI Gateway API key, the Slack token, the Postgres credentials and each platform's OAuth credentials are stored in n8n's encrypted credential store. Nodes reference them and never hardcode them. Because models go through AI Gateway, no provider keys exist in n8n at all, and one key can be rotated centrally. On self-hosted n8n, the encryption key must be kept secret and backed up, and the editor UI should be limited to a small group. OAuth scopes should allow posting only, and I would use dedicated service accounts so that revoking access does not affect anyone's personal account.
20Give me a rough scaling estimate for this pipeline.Often asked
I would work from stated assumptions rather than guess. Suppose there are 30 feeds polled every 15 minutes, each returning about 20 recent items. That is about 600 items fetched per run, but after dedup perhaps only a handful are new. The fetch volume is trivial. The model calls scale with new items, not fetched items. The real ceiling is human review: if editors can review a limited number of stories per hour, that sets throughput. Waiting executions are persisted and use no worker capacity, so pending approvals are cheap. A single n8n instance handles this easily. Queue mode matters only when feeds or new-item volume grow a lot.
21When would you move this workflow to n8n queue mode?Often asked
Queue mode separates the main instance from workers. It uses Redis to distribute executions across several worker processes. I would move when executions start queuing behind each other: for example, many feeds, frequent schedules, long model calls, or other workflows sharing the instance. Because dedup relies on an atomic Postgres insert, running on several workers stays safe and two workers cannot claim the same hash. Before moving, I would confirm that Postgres, not SQLite, is the n8n database, that Redis is reliable, and that each worker can reach the credentials and network endpoints it needs.
22A scheduled run takes longer than the interval and overlaps the next one. What breaks?Often asked
Very little, by design. Both runs fetch overlapping items, but only one insert per hash can succeed, because the unique constraint with ON CONFLICT DO NOTHING is atomic. Each item is therefore claimed by exactly one execution. The main costs are wasted fetches and possibly more pending approvals at once. If overlap happens often, I would lengthen the interval, reduce the number of items fetched per feed, or move drafting into a sub-workflow so the main run finishes quickly. I would also monitor execution duration, so slow feeds or slow model responses show up before they pile up.
23How do you handle a feed that is down, slow or returns malformed XML?Often asked
One bad feed must not stop the others. I set a timeout on each RSS Read node, enable retry-on-fail with a small number of attempts, and configure the node to continue on error, so the Merge still receives the other feeds. Failures are logged with the feed URL. If a feed fails repeatedly, a Slack alert tells someone to check it. Malformed items, such as ones missing a link, are filtered out in the normalisation Code node before hashing, because a hash of an empty URL would collide and block real items.
24How do you control model cost?Often asked
Cost scales with new items, so dedup before drafting is the biggest saving, because the model never sees stories we have already seen. I send a trimmed title and summary instead of full article HTML, and I cap output length per channel. All drafts come from one call that returns structured JSON, not one call per channel. AI Gateway provides spend tracking across providers, so I can watch cost per day and per model. If quality allows, a cheaper model can handle the drafting. Optionally, a relevance filter before drafting can drop off-topic items.
25What happens if the primary model provider has an outage?Often asked
Requests go through Vercel AI Gateway, so I can configure fallbacks to another provider's model without changing credentials in n8n. The model is just a string such as anthropic/claude-sonnet-4.5 or openai/gpt-5. In n8n, the chat model node also has retry-on-fail for transient errors. If everything fails, the Error Trigger alerts the team, and the item stays in a failed status so the recovery job can draft it later. Outputs from a fallback model still go through schema validation and human review, so a quality difference cannot reach a live channel unnoticed.
26What would you monitor for this pipeline?Often asked
I would monitor execution success and failure counts from n8n's execution log, along with Error Trigger alert volume. From Postgres: new items per run, items stuck in each status, approval rate, edit rate, rejection rate, timeout rate and time-to-approve. From publishing: success rate per channel and retry counts. Spend comes from AI Gateway. A high edit or rejection rate means the prompt or channel rules need work. A rising timeout rate means review capacity is the bottleneck. Items stuck in new or failed indicate silent losses that the recovery job should be clearing.
27Why use Postgres for dedup instead of a Google Sheet?Often asked
Dedup has to be atomic. Postgres gives you a unique constraint and INSERT ... ON CONFLICT DO NOTHING RETURNING, so the database itself decides who wins when two executions see the same item. A sheet has no unique constraint, so you would have to read, check and append, which races under concurrency and in queue mode. Sheets also has API rate limits and becomes slow and fragile as rows grow. Postgres also hosts publish_log with proper indexes and constraints. A sheet could be a read-only reporting view, but it should not be the source of truth.
28How do you handle the editor's edits safely?Often asked
When the Switch routes to the edit branch, a Set or Code node replaces the model draft with the editor's text for each edited channel before any publish node runs. Then I re-check platform limits, such as maximum length, because a human can exceed them too. If an edit breaks a limit, I post back to Slack instead of truncating silently. publish_log stores the final published text, not the draft, along with decision edited. Keeping the original draft separately lets you measure how much editors change and improve the prompt.
29What would you change if feed volume grew tenfold?Often asked
First, I would move the main workflow to just fetching, normalising and claiming items, and hand each new item to a sub-workflow through Execute Workflow so long model calls and waits do not block the schedule. I would turn on queue mode with Redis and several workers. I would add a relevance filter or classifier before drafting, so editors only see stories worth reviewing, because human review becomes the bottleneck long before n8n does. I would also add near-duplicate detection across outlets, and index first_seen_at so the items table stays fast.
30Where do the channel-specific length and tone rules live?Sometimes asked
I keep them as data, not inside the prompt text. A config table or a Set node holds each channel's name, maximum length, tone guidance, hashtag policy and whether to include the link. The prompt is assembled from that config, and the same config drives validation after the model responds and after edits. Changing a rule then means changing one place, and the rule the model was told matches the rule we enforce. Versioning the config lets you see which rules produced a given post.
31How would you add a new social channel?Sometimes asked
I would add the channel to the config with its length and tone rules, and extend the structured output schema so the model returns a draft for it. I would also add a field for it to the Slack review message. Then I would create an n8n OAuth credential with posting-only scope, add an HTTP Request publish node with retry-on-fail that carries the item hash, and log results to publish_log under the new channel name. The partial unique index on item hash and channel already covers it. I would test with a sandbox or private account first.
32What privacy considerations apply to this workflow?Sometimes asked
The content is public news, but the workflow still stores personal data. Approver Slack IDs and names are in publish_log, and OAuth tokens give access to company accounts. I keep logs to what an audit needs, set a retention period for execution data in n8n because executions can contain full payloads, and restrict database and editor access. Article content sent to models goes through AI Gateway to the chosen provider, so I check the provider's data-use terms. Indian teams should also check their obligations under the Digital Personal Data Protection Act for any personal data they store.
33How would you test this workflow before going live?Sometimes asked
I would use a test feed with known items, including duplicates that differ only by tracking parameters, to confirm that normalisation and dedup work. Pinned data on nodes lets me test the LLM chain and validation without refetching feeds. Publishing points to sandbox or private accounts. I would test each Switch branch: approve, edit, reject, timeout and an unauthorised approver. I would simulate failures, such as a model error, a publish timeout or a partial channel failure, and confirm alerts fire and no duplicate or unapproved post appears. Replaying an execution should produce no new posts.
Objective questions 33
1What does a Postgres INSERT with ON CONFLICT DO NOTHING RETURNING on a unique hash column return?Asked almost every time
Why: Rows that hit the conflict are skipped and not returned, so only new items continue.
2Why are tracking parameters removed from URLs before hashing?Asked almost every time
Why: Canonicalising the URL stops variants of the same link from looking like new stories.
3A publish request times out after the platform actually created the post. What prevents a duplicate on retry?Asked almost every time
Why: The hash lets the workflow recognise a repeat send and skip it, rather than create a second post.
4Which approach makes RSS deduplication safe when n8n runs in queue mode with several workers?Very often asked
Why: A unique constraint makes the check-and-insert atomic across concurrent workers and survives restarts. Static data and comparisons with the last execution are not reliable under concurrency or when feeds republish items.
5How is an n8n chat model node configured to use Vercel AI Gateway?Very often asked
Why: AI Gateway exposes an OpenAI-compatible API, so the OpenAI-compatible chat model node only needs the gateway base URL and key. Models are then selected by names like anthropic/claude-sonnet-4.5.
6Which node starts this pipeline?Very often asked
Why: The workflow polls feeds on a cron interval, so a Schedule Trigger starts it.
7Which node routes the workflow on the editor's approve, edit or reject response?Very often asked
Why: A Switch node sends each decision value to its own branch.
8Which Slack node operation provides the human approval pause?Very often asked
Why: Send-and-wait posts the message and pauses the execution until a response arrives.
9Which node drafts the posts in this workflow?Very often asked
Why: Step 3 specifies a Basic LLM Chain using an OpenAI Chat Model sub-node configured for AI Gateway.
10What must the Error Trigger workflow never do?Very often asked
Why: It runs outside the approval path, so it may alert but must never publish.
11An approval times out with no response. What is the correct outcome?Very often asked
Why: Nothing unapproved may be published, and timed-out approvals are logged.
12Which unique key best prevents a story being published twice to the same channel?Very often asked
Why: A unique index on hash and channel allows one live post per story per channel.
13Two overlapping scheduled runs fetch the same new item. What happens?Very often asked
Why: The atomic unique-constraint insert lets exactly one execution claim each hash.
14An item is claimed in the dedup table and drafting then fails. What is the main risk without extra design?Very often asked
Why: The claim marks the item as seen, so it needs a status column and a recovery process to be retried.
15What is the strongest safeguard against prompt injection in feed content?Very often asked
Why: Untrusted input cannot publish anything on its own when the model has no tools and a human reviews every output.
16X publishes successfully and LinkedIn fails. What should a retry do?Very often asked
Why: Per-channel logging keyed on hash and channel makes retries target only the failed channel.
17How should the workflow stop an unauthorised Slack user from approving a post?Very often asked
Why: An explicit allowlist check makes approval mean approval by an authorised editor.
18What happens to an n8n execution while a Slack send-and-wait approval is pending?Often asked
Why: Wait-style operations put the execution into a waiting state that is stored in the database. The execution resumes on the response or timeout, without tying up a worker in the meantime.
19Which node combines the outputs of several RSS Read nodes into one stream?Often asked
Why: The Merge node combines items from several inputs into one stream.
20How is a model named when it is called through Vercel AI Gateway?Often asked
Why: AI Gateway uses provider-prefixed model strings such as anthropic/claude-sonnet-4.5 or openai/gpt-5.
21Why is a Basic LLM Chain preferred over an AI Agent for drafting here?Often asked
Why: Drafting needs no tool use or reasoning loop, so a single chain call is cheaper, easier to test and has less attack surface.
22When an editor edits a draft in Slack, what is published?Often asked
Why: Step 5 states that edited text replaces the model draft before anything is published.
23How does n8n scale execution throughput across several processes?Often asked
Why: Queue mode uses Redis to distribute executions to worker processes.
24Which component provides spend tracking across model providers in this design?Often asked
Why: AI Gateway tracks spend across providers behind a single key.
25Two outlets cover the same event at different URLs. What does exact-hash dedup do?Often asked
Why: Exact hashes match identical canonical links, not the same event reported at different links.
26Why is Postgres preferred over Google Sheets as the dedup store?Often asked
Why: Read-check-append on a sheet races, while a unique constraint makes the database decide atomically.
27Why does the model return structured JSON with one draft per channel?Often asked
Why: A fixed schema lets publish and validation nodes read fields directly instead of parsing prose.
28Where are the platform OAuth tokens kept?Often asked
Why: n8n stores credentials encrypted and nodes reference them, so secrets never appear in workflow data.
29Where should the main dedup decision be made to stay correct with several workers?Often asked
Why: Only a shared, atomic store like a Postgres unique constraint is consistent across separate worker processes.
30What is Loop Over Items used for in step 1?Sometimes asked
Why: It processes the list of feed URLs in batches as an alternative to one RSS Read node per feed.
31Which languages can an n8n Code node run?Sometimes asked
Why: The Code node supports JavaScript and Python.
32How can n8n be deployed?Sometimes asked
Why: n8n is fair-code and can be self-hosted or used through n8n Cloud.
33Which field is NOT part of the publish_log described in the workflow?Sometimes asked
Why: publish_log records the hash, channel, final text, approver, decision, post ID and timestamps, never passwords.
Track your progress through every blueprint in your dashboard.
Start learning