CreateYourNotionContentMapFirst
If you try to automate anything blog-related without first getting your content source right, you’re mostly just making future-you miserable 🙂 The cleanest starting point I’ve found (after a few broken Airtable bases and an argument with a rogue Google Sheet filter) has been Notion. Not just because it’s pretty, but because Make talks to it cleanly and ChatGPT can easily read from it once you’ve got a stable data structure.
Here’s how I set up my Notion workspace:
1. Create a database called something like “Blog Workflow” or “Content Tracker”.
2. Use columns like:
– Title (plain text)
– Status (select: Idea, Ready for GPT, Final, Pushed)
– Tags
– Word Count (optional, you can populate this later with Make)
– Prompt (multi-line, for whatever you want to ask GPT)
– Output (where GPT’s response goes)
– Publish URL (in case you want to track posted stuff)
Here’s what I ran into: If you let Notion auto-generate database IDs or use templates from other workspaces, Make occasionally just… can’t see them. I had two versions of something named “Workflow” and only one of them would show up in Make’s scenario builder. No error, it just quietly didn’t appear. So now I make everything from scratch 🤷
Once your database is live and you’ve got a couple test rows in it, open Make and just verify that your workspace shows up under the Notion “List Databases” module. If it doesn’t, something’s off with permissions or naming.
SetUpTheMakeScenarioStructure
Open Make, start a new scenario, and mentally prepare for the fact that your first working version will break in some weird way… maybe 15 minutes after you get excited 😅
Here’s the core scenario structure I ended up using:
– **Trigger (Notion Search Rows)**: Look for items where `Status` is “Ready for GPT”
– **ChatGPT Module (Text Completion)**: Feed the prompt from Notion into GPT
– **Set Variable / Formatter (optional)**: This is where I clean the text sometimes (e.g. Do I want to strip the last sentence? Remove calling cards like ‘As an AI…’? Yes. Always yes.)
– **Update Notion Row**: Push GPT’s output into the “Output” column, and change `Status` to “Final”
Quick note: GPT’s output LOVES to throw line breaks weirdly when pasted into Notion. Especially when the reply includes code blocks, lists, or hanging indents. If you’re piping rich text straight in, you might initially think the result is broken (e.g., a bunch of extra newlines in the middle of header text). I had to use a Text Formatter trim module in Make, BEFORE the Notion “Update Row” step, to normalize those entries.
Also — and I don’t know why this is true — sometimes Make will send GPT the exact string you specified, and other times it’ll sort of truncate it mid-paragraph. If your prompt includes a quotation mark right before the text starts, that bug seems worse. I added a “Prompt Sanitizer” step just to clear surrounding quotes, and things got dramatically more stable.
CreateATestRunWithFakeContent
Never test this with your real blog titles. It’s just too messy.
What I usually do is create three test entries in Notion:
– “Make a post about bagels vs croissants”
– “Explain why USB cables only work one way”
– “Write a rant about daylight saving time”
That combination gives me a taste of list-based posts, tech explanation, and toney opinion content. GPT handles these shapes differently, so you’ll want to eyeball if the output formatting works across all three. Especially because posts with numbered items tend to break Notion’s formatting fastest.
Run the scenario manually. Read all three outputs. Do they sound like the same person? Are they too short or too long? GPT loves padding its replies, and sometimes you’ll get a summary at the bottom that you never asked for.
Also — important — double check your Notion status values after the run. If one gets updated but the others don’t, it’s usually because the automation loop failed to recognize the array structure. I had a case where only the *first* item would ever update, and the other two got ignored… because my “Search Rows” module was set to return ‘first match only’. Big facepalm on that one 😛
AddAutoPublishFromNotionToYourCMS
This is the unreliable part, depending what CMS you’re using.
If you’re on WordPress or Webflow, you *can* push post content directly through Make using an API module. But the truth is, each platform seems to treat line breaks, HTML tags, and text length differently. In Webflow, for example, I had to insert `
` at certain break points to prevent all the text from running together. In WordPress, I had to strip slashes from quotes or the post got rejected.
The way I got around this was super dumb, but reliable: I created a Google Doc via Make in my Google Drive that receives the blog content (title as filename, output body as content). Then I just manually copy it when I’m ready to publish. Yeah, it defeats the point of automation. But mistaken HTML tags in a scheduled Webflow post going out live at 4am? No thanks 🙂
That said, Notion makes it really easy to see which blog is in which state. So all I needed to do was update the content status to “Pushed” once I’d dealt with it manually. No ghost drafts, no confusion.
HandleLongGPTResponsesAndCharacterLimits
Sometimes you’ll get a blog output that just ends mid-sentence, like:
> These are just some of the factors in
That’s usually because the response token limit was hit. ChatGPT often cuts off around 1000–1500 words depending on how much context you’ve given it. In Make’s module settings, you can try increasing the max tokens, but that only helps so much.
The real solution: break your GPT ask into smaller chunks. I restructured my prompt like this:
1. Pass the topic title to GPT and ask: “Write an outline.”
2. Store the outline temporarily (I used a Data Store module in Make).
3. Loop through each outline item and send it back to GPT asking for that section only.
4. Stitch all the pieces together and dump into Notion.
Yes, it’s a pain to build. Yes, it works far better. And no, GPT doesn’t always follow its own outline when you do it this way. But at least it doesn’t cut off in the middle of a thought and leave you wondering if something broke.
FixTheWebhookThatOnlyFiresSometimes
Don’t rely on Make’s webhook to trigger your process every time a Notion update happens.
I tried it. It worked for a whole day. Then on Wednesday? Nothing.
Turns out, the webhook only triggers if *certain* fields are updated, and Notion doesn’t send full change logs every time unless the API permission is high enough. My guess is I had the wrong integration token setup, but I didn’t want to nuke the whole scenario.
Instead, I switched the scenario to run every 15 minutes on a schedule, using a filter to check if Status was “Ready for GPT” and Output was empty. That did the trick. No more mystery misses.
I left the webhook in place, just disabled it, as a reminder of my optimism.
MakeASyncLogInYourEmailOrPhone
After debugging this process for way too long, I realized that my real problem wasn’t the automation — it was awareness. Stuff would break and I just wouldn’t notice.
So I added two alert paths:
1. **Email in Make**: If GPT fails (empty output, or error code), send myself a subject line like “🚨 GPT BROKE ON [Post Title]”. Makes it really hard to ignore.
2. **Push notification using Pushover**: This one sounds silly, but getting a buzz on my phone when a new blog lands in Notion Output feels like having a weird editor who’s always quietly cheering for me. It’s nice.
If you don’t want to pay for Pushover or similar, even a simple Gmail filter with colored labels helps. The main idea is that you shouldn’t have to remember to check Notion to know what happened.