How GPT Lets You Build Checklists That Refuse to Behave
1. Prompting GPT to write checklists seems simple until it loops
I used to ask GPT-4 to write project handoff checklists. Easy, right? Something like, “Make a checklist for onboarding a frontend dev.” What came back looked fine — until I realized it just duplicated the headers with slightly different phrasings and no actual task logic. One version had three bullets for access setup spread across two sections. Another forgot the testing environment altogether but wrote a glorious intro paragraph about team synergy. That’s the moment you stop trusting the nice sentences.
The fix was to specify roles and outcomes in the prompt — something like:
"Create a checklist of technical onboarding tasks for a frontend developer on a React + Vite + Supabase stack. Output only bullet points as task titles, no explanation."
That mostly works — unless GPT hallucinates platform support steps that don’t exist (still waiting on Vite to have admin dashboards). Be prepared to manually prune nonsense. It’s not fully automatic, but at least it won’t pitch Docker if you didn’t mention containers.
2. Auto-generating checklist templates inside Notion usually breaks headers
There was a week when I thought I could auto-generate structured checklists in Notion via the API by pumping a well-formatted JSON payload from GPT. I even massaged the output by setting the model temperature to 0.3 and giving it a known schema for to-do blocks. Output looked legit. But as soon as the script ran, half the database entries were raw text blocks without checkboxes.
I still don’t know what Notion’s rendering engine decides when it sees a block with "type": "to_do"
but missing a "checked": false
flag. No error. It just silently defaults to plain text. I had hundreds of checklist items with no interactivity, and I didn’t notice until a team member asked, “Is this page just for reference?” because they couldn’t check anything off.
If you’re pushing generated checklists into a Notion database with the API, make sure you:
- Explicitly set
"checked": false
even if GPT says “it’s false by default” - Avoid newline characters in
"text"
— they kill the rendering - Throttle API calls — some endpoints drop requests quietly without rate errors
- Split every checkbox as a separate block — do NOT send as text blobs
The API docs at notion.so skip a lot of the character-count and formatting quirks that actually break this.
3. Pipedream plus GPT should work great but the output payload mutates
In Pipedream, I set up a workflow where I catch a webhook from a scheduling form, pass the data to GPT to generate a prep checklist, then send the output to Slack. Worked once, then broke mid-demo. Instead of a clean list, the message sent a single string — all bullets collapsed with no line breaks. GPT still returned the correct format in logs.
After too much sandboxing, I found that Pipedream adds an invisible character translation layer when the JSON response includes escaped newline characters + Markdown bullets. Something in the Slack action flattens \n
if the string isn’t wrapped in a Markdown block explicitly. The “aha” moment came when I printed the JSON just before the final send:
{ "text": "\u2022 Update calendar access\n\u2022 Prep welcome email" }
To make it stop flattening, I had to wrap the output in \`\`\`
manually. Not automatically — GPT had to learn to output triple backticks only when sending to Slack, but NOT when writing to Airtable. So now there’s an inline system prompt that says:
"If output_target is Slack, wrap the checklist in triple backticks. Else, return plain text with \n"
And hilariously, if you forget to update that directive when changing the output platform, the line breaks just vanish again in the dark.
4. Using Make to auto-run GPT outputs fails quietly if field types mismatch
I had a client who wanted each new deal in their CRM to generate a custom onboarding checklist inside their ClickUp project. We used make.com to grab the CRM record, format it into a plaintext brief, send it to GPT for checklist generation, then push that to ClickUp subtasks. Lots of small wins, except every fifth run just… didn’t create tasks.
No error. No failed run. Just an empty ClickUp card.
Half an hour into diagnostics, I realized GPT had returned a bullet with an emoji at the front. ClickUp’s API choked on it, because their Name
field rejects certain UTF-8 sequences if not encoded properly by the middle layer (which Make isn’t doing). So technically it wasn’t a GPT bug — it was a Unicode passthrough issue made worse by the fact that the same prompt sometimes returned emojis, and sometimes didn’t.
I added a post-processing step that runs each line of the checklist through a filter that drops non-basic ASCII if the string is going to ClickUp. Still have no idea what their server does when it sees a rogue clipboard emoji. I just know it makes the task vanish with no trace.
5. Airtable automations with GPT need aggressive fallback handling or stall forever
I thought I was being clever using Airtable scripts to prefill GPT prompts from custom fields, then feeding that into a Run Script action using OpenAI’s API. The flow was: someone adds a new project name → checks a box → script compiles the checklist prompt → API call → saves markdown output back to a text field.
The glitch: if any field was empty, the prompt skipped a clause. That was fine until the first time someone left the “target audience” field blank. GPT got confused and added a note saying, “The following checklist assumes the audience is internal engineers,” which would’ve been fine, except that detail stuck for every record after it.
The caching wasn’t on my side — it was GPT’s sampling behavior coupled with Airtable’s async script executor not resetting the function state between records. I only saw the issue when I checked results back-to-back, and the same phrases appeared even when the prompt changed. Once I added a default value fallback in plain JS before GPT runs, it stabilized.
Also, Airtable’s markdown parser eats bullet spacing inconsistently. Sometimes it’s because the GPT output includes mixed indent levels. Sometimes it’s Airtable switching between rich text and plain text rendering depending on whether the user viewed the cell right after update. Truly annoying.
6. Embedding GPT into Slack workflows works until reactions trigger cycles
I wired up a Slack workflow using their button block actions to let people request a checklist for internal processes: travel booking, access provisioning, etc. When someone clicked a button, it called a webhook, sent a GPT query, and posted the result back to a thread.
What I didn’t test: people reacting with a thumbs-up reacting triggered another workflow I forgot to unlink. So we had infinite cycles where emojis were treated as new checklist requests because of how Slack identified “message action” events as matching triggers.
It took three occurrences before I traced the loop. The logs showed the webhook firing… from a bot message… that the bot itself had sent. GPT just happily kept producing “Checklist for acknowledging completion,” followed by “Checklist for reviewing checklist,” until someone messaged, “This thread is becoming sentient.”
The fix was to scope the event listener to only respond to messages where the user ID was NOT the bot’s itself. Which Slack lets you do, but you have to dig into their Flow Builder JSON config to make it stick. Not in the UI.
7. Fine tuning outputs with prompt chains breaks if whitespace is implicit
One experiment I ran involved chaining prompts — letting GPT make a draft checklist, then running a follow-up prompt that organized the list into high/medium/low priority tiers. Looked fine when I tested it raw in the playground. But when I ran the same chain via API, half the lists merged items together with no line breaks.
The problem wasn’t the logic chain. It was the invisible \n
tokens not being preserved across calls — partly because I truncated trailing whitespace in the first response before passing it as context. That one-line optimization lost its ability to preserve numbered lists.
At one point, this was my context payload:
User: Please categorize the following checklist Checklist: 1. Create user account 2. Add to Slack 3. Schedule orientation Assistant: Categorized list:
But since the “. Schedule orientation” item had been merged onto the same line as the previous one during JSON minification, GPT thought it was still a single item. Solution? Add a non-removable divider token between bullets, like ||
, and train second-prompt to split on that instead of line breaks. Works fine now — as long as you never send a single literal pipe character in the items.