## Build a button-triggered pipeline for saved highlights
The first time I tried using Notion buttons for my research process, I thought, “Oh cool, one-click automation for writing!” But let me tell you, what I thought would be a simple workflow spiraled into debugging layered rollups, buttons that kept turning red for no reason, and a filter condition that straight-up vanished after I duplicated the template. Classic Tuesday 🙂
Anyway, here’s what this whole thing is supposed to solve. When doing research for writing (say, a newsletter or blog), you might save highlights from articles, transcripts from YouTube videos, saved Twitter threads, or AI summaries. The problem: those notes pile up, rarely reviewed — or they get buried in databases where you forget what you marked as “gold.”
So we’re going to set up a master notes board that becomes the launchpad for your first draft. The good stuff (like saved highlights you marked as worth quoting) will be filtered into a writing-ready database through a gentle button nudge.
Here’s a basic idea of what the flow looks like:
1. Incoming highlights and notes live in a master Notion database (maybe autopopulated from Readwise, Snipt, Notion Web Clipper, or even AI summaries).
2. Each entry has a “Send to Draft” button.
3. That button duplicates your note into a “Draft Ingredients” database and links back to the original for reference.
This might sound like a dumb thing Zapier or Make could do easily. And it is. But sometimes you want that tactile, in-app control. You want to *feel* the transfer — with context. Zapier won’t give you that 🫠
Now here comes the catch I found after two hours: buttons in Notion won’t let you dynamically choose fields inside a Duplicate action, which means you can’t 1:1 duplicate content the way you’d expect… unless you set default properties *in the target database itself*. So manually recreating entries into the target database becomes a workaround if you want full styling, tags, and quote retention to stick. Bit of a gotcha.
You’ll also need to think carefully about what metadata needs to move and what can stay behind. The most common traps:
– PDFs or file attachments don’t copy over (they stay behind)
– Checkbox and multi-select values get weirdly jumbled or not preserved
– The original URL might vanish unless you explicitly map it via relations or a formula
I also accidentally ended up scattering my tags because source and destination databases had different capitalizations of the same tag 😖 A lowercase “ai” and an uppercase “AI” are NOT the same in the world of Notion filters.
## Break up and tag ideas instantly with a second button
So once I had usable highlights pushed into my “Draft Ingredients” section, I realized something else was missing — the breakdown process. That’s where a second Notion button came in clutch.
I added a new button inside each “Draft Ingredient” page called “Disassemble.” What it does: it toggles a checkbox called “Ready for Splitting” — which triggers a filtered gallery view below it to show up. Inside that view is a template button called “Add Paragraph Idea,” which creates a new linked draft point.
I know, I’m describing buttons within buttons. Yes, they stack. No, it’s not elegant. But when it works, it hits that weirdly satisfying tactile feeling — like pulling physical index cards from a box.
The thing to watch out for: Notion sometimes forgets which database a template button belongs to after you duplicate a page. Like, completely forgets — your clone opens with a broken “no database found” setup. The fix? Go into the duplicated button config and re-select the target database manually.
Also, copying templates between workspaces breaks this setup completely because the database IDs change. Learned *that* the hard way after trying to share my “Disassemble” layout with a friend. She clicked, and the whole page just… blanked out. No error, no message. Just nothing.¯\_(ツ)_/¯
If you want to avoid this pain:
– Never duplicate a buttoned template into another workspace without re-connecting its backend database.
– Always use the full database name, not a linked view, when configuring target templates.
– When cloning buttons across views, open the config and re-save it, even if nothing changed — this forces Notion to refresh its internal references.
## Move grouped notes into structured outline sections
Now that you have these tiny nuggets of insight in a “paragraph ideas” format, the next piece is: how does all this get turned into a draft? Here’s where I hacked together what I call the “Outline Stitcher” (not a pretty name, I know).
Basically:
1. You create a new Notion page for a blog post, newsletter, or essay.
2. Inside that new page, you insert 3–6 toggle blocks by hand, one for each section you want.
3. Each one embeds a filtered linked database that pulls in only “paragraph ideas” from the last stage, filtered by tag or theme.
Now here comes the fun low-code-but-still-janky part. Each “paragraph idea” has a select property called “Outline Section” (set manually or through another button), and your linked views filter on that. So as you assign ideas to sections, they visually drop themselves into the correct toggle.
The whole page literally rearranges itself as you label ideas. It feels pretty satisfying — like Tetris but with sentences.
But here’s the annoying edge case I hit: if you use a page database inside a template (instead of inline), filter logic sometimes doesn’t carry over when you duplicate that draft layout. Especially if you’re filtering by a parent relation. I had three toggles showing *everything* no matter the filter, and spent 20 minutes thinking Notion just forgot how filtering worked.
Hard refresh fixed that. Not even kidding. A literal page reload made the filters suddenly work again. If it weren’t for a Reddit thread from 2022 saying the same thing, I would’ve thought I was losing it 😅
Things to absolutely DO if you’re building this part:
– Always create a “section” property on your paragraph ideas *before* building your outline view
– Use consistent casing in tag names (e.g. don’t mix “Summary” and “summary”) — Notion doesn’t normalize case
– Avoid using rollup filters until after everything is working — they introduce cascading errors if upstream is broken
## Automatically wrap text into AI drafting prompts
This one took me an extra weekend to get working the way I wanted. I wanted to wrap each finalized idea (after I tagged it into a section) into a drafting prompt — something like:
“Write a 3-sentence paragraph elaborating on this idea for a friendly and technical blog post: [idea text]”
So I added a formula in my “paragraph ideas” database called “Prompt Version” that merges a fixed prefix with the actual idea text.
Then I created a button called “Send to AI Writer” that copies that text into a new page inside a separate database called “AI Draft Blocks.” This is where things started breaking 🙂
Notion’s button actions can’t *append* to an existing database property dynamically. So if you try to send this prompt without hard-setting a target, it just lands blank. Here’s my workaround:
1. Instead of using “Copy Property” I used “Create New Page” inside the target database.
2. In that action, I hard-mapped the “Prompt Version” field into the new page’s “Prompt Input” field.
3. That kicks off a Make.com webhook that hits OpenAI, returns a 3-4 sentence draft paragraph, and autopopulates another field called “Drafted Text.”
BUT 😐 — and this is a wild bug — if more than one button fires in a 60 second window, Make’s webhook receives ALL the inputs as a bulk array *even if Notion sends only one.*
You end up with OpenAI generating four paragraphs in response to one prompt, and pasting them all into the same entry. Horrific.
Wildly specific tips you probably need:
– Add a timestamp property called “Last Sent” and update it on each button click — use that in your webhook filter to catch only new ones
– Never reuse database field names across linked databases with the same structure — they *cross-wire* in automation platforms
– Always test your first 3 runs manually, even if it seems predictable — memory caching trips on low-volume flows
Eventually I got a clean two-way cycle: you tag an idea, button it to AI, and your block comes back pre-written — like a mini drafting factory.
## Tie these parts together without losing your place
At this point, we’ve got saved highlights buttoning into a thought bank, breaking into draft-starter ideas, getting slotted into outline sections, and optionally spun into full AI paragraphs. Full cycle, right?
Here’s where most people give up: they forget where they *were* in the process. Like, was this section still missing ingredients? Did we already generate AI text for this paragraph? Is this idea still raw or half-used?
I added one last set of properties:
– A select called “Status” that moves from “Raw” → “Split” → “Outlined” → “Drafted”
– A relation field called “Used In” that links paragraph ideas back to the final draft block where they were consumed
– A formula called “Is Used” that checks if “Used In” is empty or not
This let me filter out anything already processed from my idea banks. And inside the draft, I added a linked filtered view called “Unused Ideas Related to This Draft” — basically like a mini idea backlog for each draft.
And yes, this **only started working** after I set the relation to bidirectional. Without that, the related records didn’t sync correctly, and my “Is Used” property stayed empty. For days. DAYS. I thought my filters were broken, or my formulas were wrong. Turns out: no sync. Just vibes. 😛