Publishing content is only one part of a modern content workflow. While Strapi handles content creation and publishing, many teams still rely on other tools to manage their editorial process.
The challenge comes after publishing. Someone still needs to update the tracker, add the live URL, change the status, and notify the team. These small tasks quickly become repetitive and easy to miss as your workflow scales.
Automation solves this by turning a publish event in Strapi into a trigger for the rest of your content workflow.
In this tutorial, you will build an automation workflow using Strapi and n8n that automatically performs the following steps whenever content is published:
This workflow keeps your editorial tracker synchronized with your CMS without requiring manual updates.
By the end, you will have a production-friendly workflow that connects your CMS to your editorial operations.
Here is the flow you will create:
Strapi publish event → n8n webhook → Airtable search → Airtable update → Slack notification
If the Airtable record is missing, the workflow follows a fallback path and emails the editors instead.
This setup is useful for teams that manage:
Before you begin, make sure you have the following:
You should also have a Content type in Strapi that includes at least:
titleslugpublishedAtIn this tutorial, the workflow supports multiple content models, including:
blog-postintegrationcomparatorTo quickly integrate Strapi and n8n, check out the Strapi and n8n integration page.
Automation is the process of using software to perform tasks automatically without manual intervention.
Instead of repeating the same steps every time an event occurs, automation allows you to define a set of rules that handle those tasks for you.
Some key benefits include:
A workflow is a sequence of automated steps that connect a trigger to one or more actions.
At its core: Trigger + Filter + Action = Workflow
For example, when a blog post is published (trigger), check if a matching record exists (filter), then update a tracker and notify the team (actions).
n8n is a workflow automation tool that lets you connect different applications and automate processes visually.
It works by linking together different steps (called nodes) into a workflow.
There are two key concepts in n8n:
Nodes are the building blocks of an n8n workflow.
Each node performs a specific task, such as receiving data, transforming it, or sending it to another service.
You can:
1. Entry Point Nodes: These start the workflow. Examples include Webhook and Schedule Trigger 2. Function / Processing Nodes: These transform or prepare data. Examples include Set node (define variables), Code node (custom logic), and If node (conditional logic) 3. Exit / Action Nodes:: These perform actions in external systems. Examples are Airtable (create/update records), Slack (send messages), and Gmail (send emails).
n8n provides different types of nodes depending on what you want to achieve:
Now, let's create a workflow!
Start by creating an Airtable table to track your content assignments.
Your table can include fields like these:
The key thing here is consistency.
This workflow searches Airtable by title, so the Assignment Name field in Airtable must exactly match the title of the Strapi entry.
For example:
| Assignment Name | Assignment Status | Publish Date | URL |
|---|---|---|---|
| How to Build a Blog with Strapi | 08 - Ready to Publish |
Once the matching Strapi entry is published, the workflow updates that row automatically.
The workflow begins with a Webhook trigger node in n8n.
Configure it like this:
POSTpostsThis gives you a webhook endpoint that Strapi can call whenever an entry is published.
A webhook allows Strapi to push events to n8n in real time. That means your automation runs exactly when content is published instead of relying on a polling schedule.
In Strapi, add a webhook that points to your n8n endpoint.
You want Strapi to send events when entries are published.
The event payload should include information about the entry, including:
Your n8n workflow expects a payload structure like this:
1{
2 "event": "entry.publish",
3 "model": "blog-post",
4 "entry": {
5 "title": "How to Automate Publishing with Strapi",
6 "slug": "how-to-automate-publishing-with-strapi",
7 "publishedAt": "2026-03-10T16:22:07.594Z"
8 }
9}Once your webhook is active, publishing a Strapi entry will trigger the workflow.
After the webhook node, add an If node in n8n. This node checks whether the incoming event is actually entry.publish.
Use a condition like this:
1{{ $json.body.event }} === 'entry.publish'This step prevents the workflow from running on unrelated events.
That is especially useful if your Strapi webhook setup sends multiple event types to the same endpoint.
Next, add a Set node to prepare the Airtable search configuration.
In your workflow, this node defines String values like:
AIRTABLE_BASE_ID: This is the unique identifier of your Airtable base. Every Airtable workspace (called a base) has its own ID, and it tells n8n which database to query.FIELD_NAME: This is the name of the field used to search for a matching record in Airtable.SEARCH_TITLE: This is the actual value used to find the matching record. It comes directly from the Strapi webhook payload:TABLE_ID: Inside each Airtable base, you can have multiple tables. The TABLE_ID specifies which table contains your content assignments. In this tutorial, that table is your Assignments table.✋ NOTE: You can use n8n Environment variable feature to add your sensitive data. But we won't use it for this tutorial.
Example values:
1AIRTABLE_BASE_ID: appX7f9K2LmN8QpR4
2FIELD_NAME: Assignment Name
3SEARCH_TITLE: {{ $json.body.entry.title }}
4TABLE_ID: tblA1b2C3d4E5f6G7This makes the next search step easier to manage and reuse.
Add an Airtable node and set the operation to Search.
This node looks for the record whose Assignment Name matches the title of the published Strapi entry.
Your formula can look like this:
1{{ '{' + String($json.FIELD_NAME).replace(/[{}]/g, '').trim() + '}' }} = "{{ $json.SEARCH_TITLE.trim() }}"It dynamically builds an Airtable formula using the field name and the title from the Strapi webhook.
If a record is found, the workflow continues.
If no record is found, the workflow takes the fallback path and sends an email to your editors.
Here is the output of a matched record:
Add an If node after the Airtable search to check whether a record was found.
In your workflow, this condition checks whether id exists on the Airtable search result.
If the record does not exist, the workflow does two things:
You can check out the n8n Google credentials page to learn more about authenticating your Google account.
This is a smart operational pattern. Instead of failing silently, the workflow tells the team exactly what went wrong.
Here is the message to the editors written in HTML.
1<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; line-height: 1.5; color: #111827;">
2 <h2 style="margin: 0 0 12px; font-size: 18px; font-weight: 700;">
3 Airtable Update Failed
4 </h2>
5
6 <p style="margin: 0 0 12px;">
7 The assignment status for the post titled
8 <strong>{{ $('Webhook').item.json.body.entry.title }}</strong>
9 could not be updated in Airtable.
10 </p>
11
12 <div style="margin: 16px 0; padding: 12px 14px; background: #FEF3C7; border: 1px solid #F59E0B; border-radius: 8px;">
13 <p style="margin: 0; font-weight: 600;">What happened?</p>
14 <p style="margin: 6px 0 0;">
15 The record could not be fetched from Airtable because no matching title was found.
16 </p>
17 </div>
18
19 <div style="margin: 16px 0; padding: 12px 14px; background: #EFF6FF; border: 1px solid #60A5FA; border-radius: 8px;">
20 <p style="margin: 0; font-weight: 600;">How to fix it</p>
21 <p style="margin: 6px 0 0;">
22 Make sure the <strong>Entry Title</strong> in Strapi exactly matches the title in Airtable (including spelling, spacing, and punctuation).
23 </p>
24 </div>
25</div>The email explains:
That makes debugging much faster for content teams.
If the Airtable record exists, the next step is to generate the public URL of the entry.
In your workflow, this happens inside a Code node:
1const webhook = $('Webhook').first().json.body;
2
3const modelToPath = {
4 comparator: 'headless-cms/comparison',
5 integration: 'integrations',
6 'blog-post': 'blog',
7};
8
9const base = 'https://strapi.io/';
10const slug = webhook?.entry?.slug;
11const path = modelToPath[webhook?.model];
12
13if (!path || !slug) {
14 return [];
15}
16
17return [{ entryURL: `${base}/${path}/${slug}` }];This script:
For example:
blog-post becomes /blog/{slug}integration becomes /integrations/{slug}comparator becomes /headless-cms/comparison/{slug}This is a clean way to support multiple content types with one automation.
After generating the live entry URL, add another Set node to prepare the values Airtable needs.
This node sets:
URLASSIGNMENT STATUSPUBLISH_DATERECORD_IDAIRTABLE_BASE_IDAIRTABLE_TABLE_NAMEIn your workflow, the status is set to:
109 - PublishedAnd the publish date is extracted from publishedAt like this:
1{{ $('Webhook').item.json.body.entry.publishedAt
2 ? $('Webhook').item.json.body.entry.publishedAt.split('T')[0]
3 : "" }}This gives Airtable a clean YYYY-MM-DD date string.
Here is an output of the Set Node.
Now add an HTTP Request node to update the Airtable row.
This node sends a PATCH request to Airtable using the record ID returned by the search step.
Here are the authentication parameters:
Here is the JSON body:
The JSON body in your workflow looks like this:
1{
2 "fields": {
3 "Publish Date": "{{ $json.PUBLISH_DATE }}",
4 "URL": "{{ $json.URL }}",
5 "Assignment Status": "{{ $json['ASSIGNMENT STATUS'] }}"
6 }
7}This gives you precise control over the request body and makes the update logic explicit.
Once this runs successfully, Airtable now reflects the published state of the Strapi entry.
After the Airtable update, add another If node to confirm the update succeeded.
When the update is successful, send a message to Slack using a Slack node.
To learn how to add your Slack credential, check out the n8n Slack credential page.
Your Slack message can include:
Example message:
1A new blog-post entry has been published
2
3Title: How to Automate Publishing with Strapi
4Entry URL: https://strapi.io/blog/how-to-automate-publishing-with-strapiThis gives your team immediate visibility when new content goes live.
At this point, your workflow behaves like this:
entry.publishThis is a simple workflow, but it removes several repetitive steps from your publishing process.
Before you move this into production, test your workflow:
Testing these edge cases will make your automation much more reliable.
Once the basic automation is working, here are a few useful upgrades you can add:
Values like your base URL, Airtable base ID, and editor emails are good candidates for environment variables.
That makes the workflow easier to maintain across development, staging, and production.
You can extend your modelToPath object to support more content types as your site grows.
This kind of automation helps content teams in three important ways:
Nobody has to update Airtable by hand after publishing.
Slack notifications help everyone know when content is live.
The email fallback ensures broken editorial links do not go unnoticed.
That combination makes this workflow valuable not only for developers, but also for marketers, editors, and content operations teams.
From here, you can take this workflow further by:
Once Strapi becomes the source of truth for content, workflows like this help the rest of your stack stay in sync.
Strapi is excellent at managing and publishing content. But when you combine it with n8n and other external tools, you can build a much stronger content operations system around it.
With a single publish event, you can update your editorial tracker, generate the live URL, notify your team, and handle exceptions automatically.
That is the real value of automation: fewer repetitive tasks, fewer missed updates, and a smoother workflow for everyone involved.
If you are already using Strapi for content publishing, this is a great automation to add to your stack.
To learn more, visit the Strapi documentation page or the n8n documentation page.
Theodore is a Technical Writer and a full-stack software developer. He loves writing technical articles, building solutions, and sharing his expertise.