The bot sends the subscriber a question with buttons. On click — its own follow-up text, notification routes and a webhook. Embed confirmations of appointments, deliveries and orders without your own backend for the buttons.
· Now or at a scheduled time · TTL · approved / declined / reschedule
Without us
Inline buttons in a bot mean callbacks, webhooks, state storage and reply texts. Building and maintaining all that just for “Coming? Yes / No” takes weeks.
Staff phone customers just to confirm a booking. SMS surveys cost money and offer no button to tap — only a call back.
Without a quick confirmation the customer forgets the appointment. The slot sits idle, the delivery runs for nothing, the order stalls — and you find out too late.
What’s inside
Set a prompt with {{variables}} and approve / decline / reschedule buttons with your own labels. Only approve is required — the rest are optional.
A dedicated text per outcome. Tap “I’ll come” → “See you at 18:00”, “Can’t make it” → “The slot is freed”. The bot replies on its own, no server of yours.
Launch an approval instantly or at a set time via scheduled_at. A TTL limits the reply window — when it elapses the expired outcome fires.
Just like forms: on approved / declined / reschedule / expired — notify an email, a messenger, a specific subscriber or the whole team.
approval.sent, .approved, .declined, .reschedule, .expired signed with HMAC. Update your CRM, calendar or order in real time.
{{placeholders}} are filled from vars at launch — name, time, order number. The question can include media and a chosen text format.
How it works
POST /v1/approval-templates — the question, buttons, follow-up texts and a default TTL. Add notification routes per outcome.
POST /v1/approvals with a template_id and a subscriber (subscriber_id or external_id). Pass vars and, if needed, scheduled_at.
The bot sends the question, the subscriber taps a button. You receive a webhook and can poll GET /v1/approvals/{id} — status and outcome.
FAQ
No. Zapnoty shows the buttons, catches the tap, sends the follow-up and delivers a webhook with the outcome. You just create a template and launch an approval via the API.
A plain message with inline buttons requires you to handle the callbacks yourself. An approval is a ready flow: approved / declined / reschedule / expired outcomes, follow-up texts, routes and events out of the box.
Yes. Set scheduled_at at launch — the question is sent then (e.g. a day before the appointment). Without it the send is immediate. A TTL (ttl_minutes) limits the reply window.
When the TTL elapses the approval gets the expired outcome: the expired follow-up is sent (if set), the expired routes fire and an approval.expired webhook arrives.
Launch the approval by subscriber_id or by your own external_id. Both are returned in the status and the webhook, along with any metadata — so you can tie the reply to your own appointment or order.
The question to the subscriber costs 1 credit, the follow-up after the reply costs 1 more. An email notification route is 3 credits; a messenger or subscriber route is 1 credit.
No credit card. 100 free credits per month — enough to try every feature.
Solutions & use cases
Common scenarios where Zapnoty replaces a stack of 3-4 separate services.
Up to 14× cheaper than SMS, higher reach than email
OTP, order status, abandoned cart, promos
Forms with instant Telegram notification — no forgotten inboxes
Drip lessons, reminders, Q&A and bot login
Support in Telegram/Max, no heavy chat widget