Human-in-the-loop for outbound agents
Approval that does not stall the sequence.
The rep approves the send from their lock screen, and the agent carries on without waiting for anyone to open a dashboard.
How can an AI SDR get a human to approve a send without slowing down?
Pushary lets an AI SDR ask for approval on the device the rep is already holding. Wrap the send in decisions.ask() and the agent blocks on that one message while the rest of the sequence keeps running. The rep taps approve, deny, or edits the copy, and the answer returns to the agent in seconds rather than at the end of the day.
Where it stops
The calls that should not be automatic
- sendEmail(prospect, draft)
- The first message to a named human at a named company is the one that decides whether the domain keeps its reputation. Almost every outbound team wants eyes on it and almost none want to wait.
- sendToTier('enterprise', draft)
- A generic line that is fine for a long tail list reads as careless to a named account somebody has been working for months.
- replyToObjection(threadId, draft)
- A reply is the point where a real conversation started and where an agent misreading tone costs a deal rather than a click.
- enrichAndPersonalize(prospect)
- When enrichment returns something the model is unsure about, guessing produces the personalization mistakes prospects screenshot and post.
The integration
Two calls inside the step you already have
Wrap the action, not the whole agent. Everything the agent does that is safe keeps running without asking anyone.
import { createPusharyServer } from "@pushary/server"
const px = createPusharyServer({ apiKey: process.env.PUSHARY_API_KEY! })
// The sequence keeps moving. Only the gated sends await a person.
for (const prospect of batch) {
const draft = await writeOpener(prospect)
if (prospect.tier !== "enterprise") {
await sendEmail(prospect, draft)
continue
}
const decision = await px.decisions.ask({
externalId: prospect.ownerId, // the rep who owns the account
type: "confirm",
question: `Send to ${prospect.name} at ${prospect.company}?\n\n${draft.subject}`,
})
if (decision.approved) await sendEmail(prospect, draft)
else await queueForRewrite(prospect, draft)
}Who answers
The approver is usually not an engineer
The approver is the rep or the founder who owns the account, and their day is calls and meetings rather than time in your product. Every AI SDR now ships some version of an approval mode, and most of them describe the trade-off honestly on their own pricing pages: turning approval on slows the agent down. That is not a flaw in the idea of approval, it is a delivery problem. The request is arriving somewhere the person is not. Pushary reaches them by the id you already have for them, so the same gate that used to cost a day costs the time it takes to read one subject line.
Does an approval step not defeat the point of automating outbound?
It does if you gate everything. The pattern that works is to gate by consequence rather than by volume. A long tail list that was never going to convert on personalization does not need a person. A named account somebody has been working for six months does, and so does any first reply in a live thread. That is usually a small fraction of total sends, which means the human queue stays short enough that people actually read it instead of rubber stamping. The other half of making this work is where the request lands. If approval means opening a tab, it gets batched to the end of the day and the sequence timing you designed is gone. If it lands on a phone as one line to read, it happens between meetings.
Worth reading: The FTC's CAN-SPAM compliance guide for business.
Embed it in your product. Your users never see a Pushary login or bill.
FAQ
Questions, answered
Put a person on the step that needs one.
Connect a user with one tap, ask a human with one call, and act on a fail-closed decision. Every decision is saved to a durable ledger you can audit.