Skip to content
ABUNA

Subscriptions for developers and small businesses

Get paid every period, from a link.

Abuna runs your checkout, renewals, and reminders. Each period, customers get a pay link by email and Telegram. When they pay, your server gets a signed webhook. You don't build billing.

Start in Test mode. Nothing charges a real customer.

Kribi Fitness

Telegram · just now

Hi Amina, your Monthly plan renews on 1 October.

Amount due FCFA 15,000

Pay nowManage plan
POST /webhooks/abuna200

invoice.paid · signature verified

A customer receives their renewal pay link on Telegram. After they pay, your server receives a signed invoice.paid webhook.

How it works

From sign-up to first renewal

  1. 01

    Create an app

    Sign up and create an app. You get a publishable key, a secret key, and a webhook signing secret.

  2. 02

    Add products and prices

    Set an amount and how often it renews: every few days, weeks, months, or years.

  3. 03

    Share the checkout link

    Each price has a hosted checkout link. Send customers there from your site, a chat, or a QR code.

  4. 04

    Let Abuna handle renewals

    Each period, your customer gets a pay link. When they pay, your server gets a signed webhook.

Features

Everything a subscription needs after checkout

Abuna keeps track of every subscription, so you don't have to chase payments or build billing screens.

  • Hosted checkout

    A checkout page for every price. No payment forms to build or host.

  • Pay links by email and Telegram

    Every renewal pay link goes out by email. Customers who connect Telegram get it there too. It takes one tap.

  • Customer portal

    Each customer gets a private link to see their plan and invoices, pay what's due, or cancel. No account needed.

  • Signed webhooks

    Every event is signed with your secret, retried on failure, and logged. Resend any delivery from the dashboard.

  • Test and Live modes

    Try the whole flow in Test mode, with its own data and keys. Switch to Live when you're ready.

  • Teams

    Invite teammates by link so they can manage your apps with you.

Your money

Abuna only collects payments

Customers pay straight into your own provider account. Abuna never sends money from it. We ask for collection-only credentials and store them encrypted. If your provider can't restrict a key, check with them before connecting.

Choose the right provider credentials

Developers

Your server hears about every payment

Abuna sends a POST to your webhook URL for each event. Check the signature, then update your product.

Headers on every delivery

X-Abuna-Event
The event type
X-Abuna-Delivery
The delivery ID
X-Abuna-Signature
sha256=HMAC of the raw body, keyed by your signing secret
X-Abuna-Signature-Previous
For 24 hours after a rotation, the same HMAC keyed by your old secret

Events

  • subscription.created
  • subscription.paid
  • invoice.paid
  • subscription.renewed
  • subscription.updated
  • subscription.canceled

Failed deliveries are retried. You can resend any event from the dashboard; it keeps the same event ID, so you can skip duplicates.

server.js
import crypto from "node:crypto";

// Use the raw request body: the signature covers its exact bytes.
export function verify(rawBody, header, secret) {
  const expected = "sha256=" +
    crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(header), b = Buffer.from(expected);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

app.post("/webhooks/abuna", (req, res) => {
  // For a day after you rotate the secret, the old one signs Signature-Previous.
  const secret = process.env.ABUNA_WEBHOOK_SECRET;
  const ok = ["X-Abuna-Signature", "X-Abuna-Signature-Previous"]
    .some((h) => verify(req.rawBody, req.get(h) ?? "", secret));
  if (!ok) return res.sendStatus(400);

  const event = JSON.parse(req.rawBody);
  if (event.type === "invoice.paid") {
    // Give the customer access for the new period.
  }
  res.sendStatus(200);
});

FAQ

Common questions

Do my customers need an account?

No. Customers subscribe through your checkout link. Their renewal messages include a pay link and a link to their portal, where they can see their plan, pay, or cancel.

How do customers get Telegram messages?

Connect your Telegram bot in your app's settings. Each customer then connects Telegram once, with one tap. Email still goes to everyone.

What happens when a customer doesn't pay?

Each renewal has a short grace period to pay. If it is still unpaid after that, Abuna cancels the subscription and sends your server a subscription.canceled webhook.

Can I try it before charging anyone?

Yes. Test mode has its own keys and data, and nothing there charges a real customer. Walk through checkout, renewals, and webhooks, then switch to Live.

Who is Abuna for?

Developers and small businesses selling memberships, courses, software, or services. It's built for places like Cameroon, where people pay for each period from a link instead of saving a card.

Start with Test mode today.

Create an app, share a checkout link, and watch the first webhook arrive.