Notion + LinkedIn: posts scheduled and published
LinkedIn posting gets messy fast. Ideas live in one place, drafts in another, media files in a random folder, and “I’ll post later” turns into “I forgot again.”
This Notion LinkedIn automation hits marketing managers first, but founders and consultants feel it too. You stop babysitting drafts and start publishing on a predictable schedule, with every post tracked in one Notion database.
Below, you’ll see how the workflow turns a simple idea into AI-written LinkedIn posts, stores everything in Notion, and publishes text, images, or documents automatically.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Notion + LinkedIn: posts scheduled and published
flowchart LR
subgraph sg0["On form submission 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/form.svg' width='40' height='40' /></div><br/>On form submission"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Idea available?", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Create 10 LinkedIn Posts", pos: "b", h: 48 }
n3["<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/notion.dark.svg' width='40' height='40' /></div><br/>Create a database page"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "Create 3 LinkedIn Posts from..", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "file uploaded?", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Upload file", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set fields", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set File Url", 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/notion.dark.svg' width='40' height='40' /></div><br/>Update database page (with f.."]
n18@{ icon: "mdi:swap-horizontal", form: "rounded", label: "File uploaded", pos: "b", h: 48 }
n15 --> n4
n14 --> n3
n13 --> n16
n16 --> n1
n18 --> n17
n18 --> n4
n12 --> n13
n12 --> n1
n1 --> n2
n1 --> n5
n4 --> n14
n0 --> n12
n3 --> n18
n2 --> n15
n17 --> n4
n5 --> n15
end
subgraph sg1["Schedule Flow"]
direction LR
n11["<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/linkedin.svg' width='40' height='40' /></div><br/>Create a post"]
n19@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
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/notion.dark.svg' width='40' height='40' /></div><br/>Get Ready Posts"]
n21["<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/notion.dark.svg' width='40' height='40' /></div><br/>Update Notion Posted Status"]
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/linkedin.svg' width='40' height='40' /></div><br/>Create a post with image"]
n23@{ icon: "mdi:swap-horizontal", form: "rounded", label: "LinkedIn Media?", pos: "b", h: 48 }
n24["<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/>Get file"]
n25@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Extension", pos: "b", h: 48 }
n26@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n27["<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/linkedin.svg' width='40' height='40' /></div><br/>Create a post with document"]
n24 --> n25
n25 --> n22
n25 --> n27
n11 --> n21
n26 --> n21
n20 --> n23
n23 --> n24
n23 --> n11
n19 --> n20
n22 --> n21
n27 --> n26
end
subgraph sg2["Notion Flow"]
direction LR
n6@{ icon: "mdi:cog", form: "rounded", label: "Replace text", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Copy file", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Message a model", 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/notion.dark.svg' width='40' height='40' /></div><br/>Get many database pages"]
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/notion.dark.svg' width='40' height='40' /></div><br/>Update a database page"]
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/notion.dark.svg' width='40' height='40' /></div><br/>Notion Trigger"]
n7 --> n6
n6 --> n10
n28 --> n9
n8 --> n7
n9 --> n8
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 n0,n19,n28 trigger
class n2,n5,n8 ai
class n1,n12,n18,n23,n25 decision
class n3,n17,n20,n21,n9,n10 database
class n24 api
classDef customIcon fill:none,stroke:none
class n0,n3,n17,n11,n20,n21,n22,n24,n27,n9,n10,n28 customIcon
The Problem: LinkedIn Content Falls Apart Between Draft and Post
You can usually write a decent post. The painful part is everything around it. You jot an idea down, then you hunt for the right template, then you rewrite the hook three times, then you remember you wanted to attach a PDF carousel, then you can’t find the latest file, then it’s suddenly “not the right time to post.” Multiply that by three to five posts a week and it becomes a constant background stress. And when you’re working from scattered notes, you also lose the one thing that makes consistency possible: a clear pipeline with statuses.
It adds up fast. Here’s where it usually breaks down in real teams.
- You waste about 20 minutes per post just moving text and media between tools.
- Drafts get “stuck” because nobody knows what’s ready, what needs edits, and what was already published.
- Carousels and attachments create a second workflow, so they either ship late or don’t ship at all.
- Manual posting makes you dependent on motivation, which is not a scheduling strategy.
The Solution: A Notion-First LinkedIn System That Writes, Queues, and Publishes
This workflow gives you one place to run LinkedIn content: a Notion database that holds the idea, the generated draft, the media link, the scheduled date, and the publishing status. It starts with a simple form submission (an idea plus an optional file). From there, OpenAI generates multiple LinkedIn-ready post options, and n8n maps the outputs into clean fields like title, funnel stage, and final post text. Each draft gets saved to your “LinkedIn Auto Posts” database in Notion, so you can review and edit in the same place you plan. When a post is marked “Ready for Post” and the scheduled time arrives, n8n publishes it to LinkedIn automatically as text, an image post, or a document post. Finally, the workflow updates Notion to “Posted,” so your pipeline stays honest.
The workflow begins with form intake, then uses AI to generate drafts and store them in Notion. A second track watches Notion for “Create Carousel” items, builds a Google Slides-based carousel, saves the file to Drive, and writes the link back to Notion. On schedule, it pulls “Ready for Post” items and publishes them to LinkedIn, then marks each one as posted.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 4 times a week and each post normally takes about 20 minutes to copy, format, upload media, and manually post. That’s roughly 80 minutes weekly just on the “moving pieces” part, not writing. With this workflow, you drop one idea into the form in about 2 minutes, then you review drafts in Notion and mark one “Ready for Post.” Publishing happens automatically on schedule. You get back about an hour a week, and the process feels calmer because nothing is scattered.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Notion to store drafts, statuses, and schedules
- LinkedIn to publish posts automatically
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, map a few Notion fields, and test each publishing type once.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Idea intake triggers everything. You submit an idea through the “LinkedIn Post Generator” form, optionally attaching a file. If a file is included, it gets uploaded to Google Drive and saved as a link for later use.
AI turns the idea into usable drafts. OpenAI generates multiple LinkedIn posts, then the workflow splits the output into individual items. n8n maps fields like post title, funnel stage, and final copy so the database stays clean.
Notion becomes the control panel. Each draft is created as a Notion record, and if there’s an uploaded file, the record is updated with that link. A separate Notion change trigger can pick up “Create Carousel” items, prompt OpenAI for slide text, duplicate a Google Slides template, and populate it automatically.
Scheduled publishing runs in the background. Every hour, a schedule trigger pulls Notion items that match your filters (like “Ready for Post” plus a scheduled date). The workflow checks whether the post needs media, downloads it if required, publishes to LinkedIn as text/image/document, and marks the Notion item as “Posted.”
You can easily modify the Notion filters to match your own statuses and review process. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the intake form and time-based triggers that kick off the LinkedIn content pipeline.
- Open Form Intake Trigger and set Form Title to
LinkedIn Post Generator. - Add form fields for What is your idea? and a file upload field labeled Upload file.
- Set Form Description to
This LinkedIn Post Generator creates a specific post. If left empty, it will generate 10 new posts.. - In Scheduled Poll Trigger, set the rule to run every minute to check scheduled posts.
- In Notion Change Trigger, set Event to
pagedUpdatedInDatabaseand Poll Times toeveryMinute. - Credential Required: Connect your notionApi credentials in Notion Change Trigger.
Step 2: Connect Notion
Configure all Notion database reads and writes that store posts, media links, and status updates.
- In Create Notion Record, set Database ID to your target Notion database and Title to
={{ $json['message.content.posts']['Post Title'] }}. - Map properties in Create Notion Record using the provided expressions, including Funnel Stage to
={{ $json['message.content.posts']['Funnel Stage'] }}and Post Content to={{ $json['message.content.posts']['Full Post Text'] }}. - In Update Record With File, set the file URL to
={{ $('Assign File Link').item.json["File url"] }}in the File uploaded property. - In Fetch Notion Records, set the filter to Status equals
2. Create Carousel. - In Retrieve Ready Posts, use filters for Status equals
3. Ready for Postand Scheduled Date between={{$now}}and={{$now.plus({minutes:60})}}. - In Mark Notion Posted, set Status to
4. Postedand Page ID to={{ $('Retrieve Ready Posts').item.json.id }}. - Credential Required: Connect your notionApi credentials in Create Notion Record, Update Record With File, Fetch Notion Records, Modify Notion Record, Retrieve Ready Posts, and Mark Notion Posted.
Status, Post Content, File uploaded) or updates will silently fail.Step 3: Set Up AI Content Generation
Configure AI nodes that generate LinkedIn post content and carousel slide copy.
- In Generate 10 LinkedIn Posts, select model
chatgpt-4o-latestand keep JSON Output enabled. - In Generate 3 Idea Posts, select model
chatgpt-4o-latestand include the idea payload with={{ $('Form Intake Trigger').item.json['What is your idea?'] }}. - Set Split Posts Array to split Field to Split Out as
message.content.posts. - In Map Output Fields, map Creation date to
={{ $today }}, Status to1. Review, and Type toPost. - In Prompt AI Model, use the inputs
{{$json.property_post_content}}and{{$json.name}}to generate slide-ready JSON. - Credential Required: Connect your openAiApi credentials in Generate 10 LinkedIn Posts, Generate 3 Idea Posts, and Prompt AI Model.
Step 4: Configure Google Workspace Carousel Generation
Automate Google Slides carousel creation when Notion records move to the carousel stage.
- In Duplicate Slide File, set Operation to
copyand Name to= {{ new Date().toISOString().split('T')[0].replace(/-/g, '.');}} - {{ $json.message.content.PostTitle }}. - Set File ID and Drive ID in Duplicate Slide File to your template and drive IDs (replace
[YOUR_ID]). - In Populate Slide Text, set Presentation ID to
={{ $json.id }}and map each placeholder to={{ $('Prompt AI Model').item.json.message.content.* }}. - In Modify Notion Record, set Google Carousel Link to
=https://docs.google.com/presentation/d/{{ $json.presentationId }}and Status to3. Ready for Post. - Credential Required: Connect your googleDriveOAuth2Api credentials in Duplicate Slide File and your googleSlidesOAuth2Api credentials in Populate Slide Text.
Step 5: Configure LinkedIn Publishing and Notifications
Publish posts to LinkedIn based on media type and send email alerts for document uploads.
- In Upload Drive File, set Name to
={{ $('Form Intake Trigger').item.json['Upload file'][0].filename }}and Input Data Field Name toUpload_file. - In Assign File Link, set File url to
={{ $json.webViewLink }}, then route into Idea Presence Check. - In Download Media File, set URL to
={{ $json.property_linked_in_media }}, then route to Detect File Extension. - In Detect File Extension, ensure the
jpgandpdfrules match={{$binary.data.fileExtension}}to route to Publish LinkedIn Image or Publish LinkedIn Document. - In Publish LinkedIn Image and Publish LinkedIn Document, set Text to
={{ $json.property_post_content }}and replace[YOUR_ID]with your LinkedIn person ID. - In Dispatch Email Alert, set Send To to
[YOUR_EMAIL], Subject toLinkedIn Carousel - ACTION NEEDED, and Message toAdd document to LinkedIn Carousel. - In Publish LinkedIn Text, set Text to
={{ $json.property_post_content }}for text-only posts. - Credential Required: Connect your googleDriveOAuth2Api credentials in Upload Drive File, your linkedInOAuth2Api credentials in Publish LinkedIn Image, Publish LinkedIn Document, and Publish LinkedIn Text, and your gmailOAuth2 credentials in Dispatch Email Alert.
[YOUR_ID] and [YOUR_EMAIL] placeholder before testing or LinkedIn/Gmail actions will fail.Step 6: Test and Activate Your Workflow
Validate all branches and activate the workflow for production use.
- Click Test Workflow and submit a sample form in Form Intake Trigger with and without an idea to validate both AI routes.
- Verify that Create Notion Record adds new rows and that Update Record With File attaches the Drive link when a file is uploaded.
- Manually update a Notion record to
2. Create Carouseland confirm Notion Change Trigger → Prompt AI Model → Populate Slide Text completes successfully. - Set a Notion post to
3. Ready for Postwithin the next hour and confirm Scheduled Poll Trigger → Retrieve Ready Posts routes to the correct LinkedIn node. - When results look correct, switch the workflow to Active to run automatically.
Common Gotchas
- Notion credentials can expire or need specific permissions. If things break, check your n8n Notion credential and the database sharing settings 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.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 60 minutes if your Notion database and LinkedIn access are ready.
No. You’ll mostly connect accounts and map fields between Notion, OpenAI, and LinkedIn.
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 usage, which is usually a few cents per batch of drafts.
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 a common tweak. Keep the Notion database as-is, but change your “Ready for Post” filter to something like “Approved,” then add a Slack message node when a draft is created so someone can review it. You can also route approved items into the existing scheduled publishing path, while everything else stays in “Draft” until it’s cleared.
Most of the time it’s expired permissions or a LinkedIn account that doesn’t have posting access for the target profile/page. Reconnect the LinkedIn credential in n8n, then confirm you’re publishing to the same identity you authenticated. If only document posts fail, check file size and file type first because LinkedIn is pickier there than with text updates.
If you self-host, there’s no fixed execution limit; it mainly depends on your server and how often you publish. On n8n Cloud, the practical cap is your monthly execution allowance, and this workflow can use multiple executions per post because it generates drafts, updates Notion, and publishes on schedule. For most small teams posting once a day (or a few times a week), it’s comfortably within entry plans.
Often, yes, if you want the whole system (generation, Notion syncing, file handling, and scheduled publishing) in one place. n8n is better when the logic branches a lot, like “if there’s media, download it, detect type, then publish the right LinkedIn format.” It’s also easier to self-host, which can matter when you publish frequently. Zapier or Make can be quicker for a simple “Notion status changed → post to LinkedIn” flow, honestly. Talk to an automation expert if you want help choosing.
Once this is running, Notion becomes your content command center and LinkedIn posting stops living in your head. Set it up, tune the prompts, and let the workflow do the repetitive parts.
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.