Skip to main content
Every purchase gets exactly one policy decision, resolved server-side by Ringup at the moment the payment step asks. Your agent never hard-codes it, and the merchant changes it with no redeploy.

The three states

{ "status": "required" | "optional" | "not_required", "reason": "..." }
StatusMeaningWhat the caller hears
requiredPayment must complete before the call ends”Let’s knock out payment now so your order’s all set…”
optionalOffer once, never block; unpaid is a valid outcomeOne offer: “Want to take care of payment now?”
not_requiredNo payment step at all for this business or purchaseNothing. The call proceeds as the business’s normal flow

The policy is per purchase, not per merchant

The same merchant can produce different statuses on different orders. A parts shop might make payment optional under $50 and required above it; only the amount changes the rule. That is why the payment step passes amount_cents when it asks, and why the answer cannot be cached across calls.

not_required is the graceful floor

Unknown merchant, unconnected processor, a business that simply does not take phone payments: all of these resolve to not_required, and the payment layer becomes inaudible. This is a design guarantee, not an error path. It means the same agent configuration is safe to run in front of every merchant on your platform, connected or not, from day one.
The reason field is written for the model, not for display: it tells the payment step how to behave in one sentence, so prompt and policy can never disagree.