Approval cards
Nothing that spends, imports, sends or cannot be undone runs on the model’s word. Six tools never act by themselves: they open a real VibeSell approval card — the same one VibeSell’s own agent opens — and stop there. The action runs when you click Approve.
| Tool | Category | What your click does |
|---|---|---|
import_leads |
Cost increasing · irreversible | Imports the leads and spends one lead credit per lead asked for. |
order_sending_setup |
Cost increasing · irreversible | Registers the domains and sets up the mailboxes. |
upgrade_plan |
Cost increasing · irreversible | Moves you to the bigger plan, charged today. |
launch_campaign |
Irreversible | Emails start going out in your name. |
stop_campaign |
Irreversible | The campaign stops for good. |
resume_campaign |
Irreversible | A paused campaign sends again. |
How it works
Section titled “How it works”- AssistantCalls import_leads, order_sending_setup, launch_campaign…
- VibeSellChecks the command can run, writes its impact itself, and opens a card that expires.
- YouRead the card and click Approve or Reject — on the card in Claude, or in VibeSell.
- VibeSellChecks everything again with the state of the moment, then runs it once.
- Screening. A command that couldn’t run — no active plan, a domain already taken — doesn’t open a card at all: you are never asked to approve something that will fail.
- The impact is VibeSell’s, not the assistant’s. The card’s impact paragraph is written by
the server from the command itself. The assistant only supplies a one-sentence
summary. - The card is persisted and carries an expiry (
expiresAt). It survives a restart; an expired card runs nothing. - Two places to decide. The card appears in the VibeSell app by itself. In the Claude app,
the VibeSell card also shows Approve and Reject buttons, which call
decide_approval— a tool Claude hides from the model. Codex, Claude Code and other clients don’t get it: you decide in VibeSell, at theappUrlthe result gives. - One decision wins. Two clicks at once (the card and the app) are settled by the database: one wins, the other is told it was already decided.
- Checked again, run once. On Approve, VibeSell re-checks your subscription and the command against the state of the moment, then runs it with the card’s id as its idempotency key.
What the assistant receives
Section titled “What the assistant receives”{"kind": "approval","status": "pending","approval": { "id": "0ea4e28d-df68-4ab6-bf2f-ad51e6f7e51d", "action": "Set up sending domains and mailboxes", "summary": "Register 3 domains and set up 12 mailboxes", "impact": "Registers dentalcrmhq.com, getdentalcrm.com and trydentalcrm.com in your name. …", "irreversible": true, "expiresAt": "2026-10-23T08:59:04.935Z"},"outcome": null,"decideHere": true,"appUrl": "https://vibesell.it/app"}status |
Meaning |
|---|---|
pending |
Waits for your click. |
done |
Approved and carried out — outcome says what happened. |
not_done |
Approved, but refused when run (the state changed in between) — outcome says why. |
rejected |
You said no. Nothing ran. |
decideHere is true when the card itself shows Approve and Reject (the Claude app); otherwise you
decide in VibeSell.
The text the model reads ends with a reminder: “Never approve it for them, and never say it is done before a result says done.”
After you click
Section titled “After you click”list_pending_approvals lists every card still waiting, with its action, category, impact and
expiry.