Pushary

Honest comparison

Novu approvals live in the chat thread.
Pushary approvals live on the decision.

Novu is open-source notification infrastructure that grew a conversational agent platform, with approve/deny cards on tool calls inside those conversations. Pushary is a standalone decision loop: any agent, anywhere, calls decisions.ask() and blocks until a person answers on their phone, fail-closed.

The real question

This comparison is unusually honest territory, because Novu ships a real approval primitive. The question is where your agent lives. If it is a conversational agent inside a Novu-run thread on Slack, Teams, WhatsApp, or Telegram, Novu's cards gate its tools where the conversation already is. If your agent is a LangGraph workflow, a Vercel AI SDK loop, a CrewAI crew, or a coding agent, there is no Novu conversation to post a card into, and what you need is a call that creates a decision, reaches the right person, blocks, and returns the answer. That call is Pushary.

Pushary is for you if:

  • Your agent runs outside a chat thread: workflows, backends, coding agents
  • You need the answer returned to the waiting code, not a later event
  • You need select and free-text answers, beyond approve/deny
  • Silence must resolve to no on a window you control
  • You want decisions queryable by id, with signed webhooks

Novu is for you if:

  • You are building a conversational agent living in Slack, Teams, WhatsApp, or Telegram
  • You want approval cards inside that conversation, with history in one thread
  • You want open-source, self-hostable notification infrastructure
  • You need an embeddable in-app inbox component
  • You want one vendor for product notifications and chat-based agents

Why it matters

A card in a turn vs an answer in a call

Novu's own docs describe the mechanics: requesting tool approval posts the card and ends the turn, and the decision arrives later in a separate handler. That fits a chat runtime. Code that is mid-workflow wants the opposite shape: decisions.ask() blocks where it is called and hands back the answer, so the next line of your function is the decision being acted on, and a restart resumes the wait from the ledger.

What silence does

In Novu's documented model, a pending approval is denied when the user sends a new message, and no expiry or reminder policy is documented for a card that simply goes unanswered. Pushary puts silence on a clock you set: the window closes, the decision resolves as not approved, the agent is told, and the expiry is written down. For refunds and deletes, that determinism is the feature.

Approve/deny vs an actual answer

Cards carry two buttons. Real oversight often needs more: pick which environment to roll back, choose a refund amount, type the sentence the agent should send. Pushary decisions carry confirm, select, and input types, and the person answers from the lock screen of a phone they connected once with a keyless tap, keyed to your own externalId.

Where Novu wins

Novu's notification core is open source with a large community, self-hosting is real, and the in-app Inbox component is the fastest way to ship a notification center. Novu Connect genuinely solves hard plumbing for conversational agents: webhook ingestion, identity resolution, and one thread across channels. If your agent is a chat participant, or open source is a requirement, Novu deserves the evaluation. Pushary's lane is the out-of-band decision, keyed to a person rather than a conversation.

Feature comparison

FeaturePusharyNovu
Blocking call that returns the human's answer to waiting codeCORE
Works for agents running anywhere (not only inside a conversation)
Fail-closed timeout policy, documented and enforced
Confirm, multiple-choice, and free-text decisions
Keyless one-tap end-user phone enrollmentENROLL
Queryable decisions resource in the API
Approve/deny cards on agent tool calls
Two-way agent conversations in Slack, Teams, WhatsApp, Telegram
Embeddable in-app notification inbox
Open-source notification core, self-hostable
Pricing
Partner $99/mo, public and self-serve
Free tiers + usage-based (see their pricing)

Competitor rows reflect Novu's public docs and pricing pages as of July 2026. Their agent platform is new and moving fast, so check their docs for current state.

Frequently asked questions

Doesn't Novu already have human-in-the-loop tool approval?

Yes, and it is real: inside a Novu-run agent conversation, setting needsApproval on a tool (or calling ctx.toolApproval.request in a custom-code agent) posts an approve/deny card into the user's channel and pauses the agent's turn. The decision then arrives in a separate handler invocation. The shape is the difference: it is a turn-based pause inside Novu's conversation runtime, while Pushary's decisions.ask() is a standalone call any agent anywhere can make, which blocks and returns the answer to the waiting code.

What kinds of answers can each collect?

Novu's documented tool approval is binary: approve or deny on the card. Pushary decisions can be a yes-or-no confirm, a multiple-choice select, or free-text input, so the human can pick a rollback target or type an instruction, and the answer flows back into the agent loop.

What happens when nobody responds?

Pushary fails closed on a documented window: no answer resolves to not approved and the expiry is recorded in the ledger. Novu's tool-approval docs do not document a timeout, reminder, or expiry policy for a pending card, and a new user message in the conversation auto-denies pending approvals, which ties the outcome to conversation activity rather than to a clock you set.

Where do the approvals live afterwards?

Novu records the decision in the conversation context (ctx.history), and its dashboard shows conversation history and tool activity; its REST API reference documents no decisions resource to query. Pushary writes every question and answer to a decisions ledger you can read by id through the API, with signed webhooks pushing each resolution to your backend.

When is Novu the right choice?

Two clear cases. If you want open-source notification infrastructure (multi-channel workflows, digest and delay steps, an embeddable inbox) with self-hosting on the table, Novu is a strong pick. And if you are building a conversational agent that lives in Slack, Teams, WhatsApp, or Telegram, Novu Connect genuinely solves channel plumbing, identity resolution, and threading, with approval cards included. Pushary is the right choice when the agent is not a chat participant: a workflow, a coding agent, or a product feature that must stop, reach a specific person on their phone, and act on a fail-closed answer.

Keep exploring

A decision loop for agents that are not in the chat.

enroll(externalId) connects the phone. decisions.ask() blocks on the answer, fail-closed, with every outcome in a durable ledger. Works with the Vercel AI SDK, LangGraph, CrewAI, Mastra, the OpenAI Agents SDK, Eve, Hermes, and MCP.