In this guide we take the story flow from Save a list into a table, ask the AI for a one-line note on each story, and let you approve or edit each note before it's saved. The same pattern works whenever AI writes something a person should see first: a reply, a post, a product description.
What you build: … Loop over items ─Item→ Prompt → Approval ─Approve→ Data table → back into the loop
Step 1: Add an AI key
- In the sidebar, open Dataset › AI.
- Press Add key.
- Provider: OpenAI or DeepSeek.
- Paste your API key from the provider's website.
- Press Load models and pick a Model (a small, cheap one is plenty for short notes).
- Optional: fill Price (USD per 1M tokens) from the provider's pricing page. Every run then shows what its AI calls cost.
- Press Verify & add. Mooflair checks the key with the provider before saving it.
Press Test on the key: you should see Replied "OK" in …s.
Step 2: Make room in the table
- Dataset › Tables › Stories › edit the columns.
- Add
note(Text).
Step 3: Open the flow and keep it small
- Studio › Flows › open Save stories.
- Open Loop over items and set Maximum items to
5. Five approvals are enough while you try it.
Step 4: Ask the AI
- Select the line from Loop's Item dot to Data table, then press Insert node on it. (Or delete that line and add the node from the Item dot.)
- Pick Prompt ("Asks the AI").
- AI key: the key from Step 1.
- System prompt:
You write one short, plain sentence (under 25 words) on why a tech story might matter to a reader. No hype, no emoji.
- Prompt:
Title: {{ nodes.loop.output.item.title }}
Link: {{ nodes.loop.output.item.url }}
The AI's answer comes out as {{ nodes.prompt.output.text }}. Prompt also has an Error dot for when the provider fails. Set Fallback AI key to try a second key first.
Step 5: Approve before saving
- + on Prompt's Next › Approval.
- Message:
Save this note for "{{ nodes.loop.output.item.title }}"? - Data:
{{ nodes.prompt.output.text }} - If no answer: Keep waiting for now. Later you can pick approve with after (ms)
60000, so it saves by itself after a minute.
Approval has two dots: Approve and Reject.
- Connect Approve to Data table.
- Connect Reject straight back into Loop over items. That skips this story and takes the next one.
Step 6: Save the approved note
Open Data table and add the note to Data (column: value):
{
"key": "{{ nodes.loop.output.item.id }}",
"title": "{{ nodes.loop.output.item.title }}",
"url": "{{ nodes.loop.output.item.url }}",
"note": "{{ nodes.approval.output.data }}"
}
nodes.approval.output.data is the text after your edits, so a note you fix in the approval is the one that gets saved.
Data table's Next dot still goes back into the loop.
Step 7: Test it
- Press Test run.
- The run stops at Needs you. The approval shows above the canvas with the AI's note, ready to edit.
- Fix the text if you like, then press Approve, or press Reject to skip the story.
- After five stories, the summary card shows the AI's usage, like
AI: 5 calls · 1,240 tokens · $0.0004.
When the flow runs from a campaign, approvals appear on the campaign's dashboard under Waiting for you.
Other AI nodes worth knowing
| Node | Use it to |
|---|---|
| Write | Write a post, reply or description from a brief |
| Summarize | Shorten a long page or text |
| Classify | Sort an item into categories you name (spam / lead / support) |
| Choose | Pick the best items from a list |
| Extract JSON | Turn messy text into fields you can map |
| Guardrail | Check text against your rules before it goes out |
| AI browse | Let the AI work a page by itself from an instruction |
See for every field.
Next: .
FAQ
How much does the AI cost per run?
It depends on the model and the text. With prices set on your key, each AI step logs its cost and the run's summary card adds them up. Short notes on a small model cost a fraction of a cent per run.
Can I skip the approval once I trust the notes?
Yes. Set If no answer to approve with a short after (ms), or remove the Approval node and connect Prompt straight to Data table.
Can the AI read the page itself, not just the title?
Yes. Before Prompt, open the story's link with Open URL and read it with Extract (Element body or article). Then put {{ nodes.extract.output.value | truncate:4000 }} in the prompt. Keep it short, because long text costs more.