Skip to content

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.
  1. AssistantCalls import_leads, order_sending_setup, launch_campaign…
  2. VibeSellChecks the command can run, writes its impact itself, and opens a card that expires.
  3. YouRead the card and click Approve or Reject — on the card in Claude, or in VibeSell.
  4. VibeSellChecks everything again with the state of the moment, then runs it once.
  1. 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.
  2. 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.
  3. The card is persisted and carries an expiry (expiresAt). It survives a restart; an expired card runs nothing.
  4. 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 the appUrl the result gives.
  5. 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.
  6. 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.
order_sending_setup · structuredContent
{
"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.”

list_pending_approvals lists every card still waiting, with its action, category, impact and expiry.