Skip to main content

Global Payouts

Move revenue from your Bachs balance to your own bank accounts and mobile money wallets across more countries. Global Payouts is available to all Bachs users.Bank payouts support NGN, GHS, KES, TZS, UGX, GBP, USD, CAD and EUR. Mobile money payouts are available in Ghana, Kenya and Tanzania, alongside supported USDT and USDC wallet payouts.The method depends on your destination:
  • Local bank transfers in Nigeria, Ghana, Kenya, Tanzania and Uganda.
  • Faster Payments in the UK, ACH, Wire or RTP in the US, EFT or Interac in Canada, and SEPA in supported Eurozone countries.
  • Mobile money in GHS, KES and TZS, and stablecoin payouts on supported networks.
If you collect revenue in dollars and operate elsewhere, you can choose where that revenue arrives. Save multiple bank accounts or wallets belonging to you, then choose an approved destination for each payout. Connected accounts can also withdraw their own balances to their own approved destinations.International bank and mobile money payouts use your available USD balance. When the destination currency differs, review the conversion quote, payout fee and total debit before confirming. Account verification, destination approval and sufficient available funds are required.Get started with Global Payouts · Supported currencies and payout methods

We warn you when a webhook endpoint keeps failing

If every delivery to one of your webhook endpoints fails for 24 hours, we now email your account owner and admins. The email names the endpoint, says when it started failing, and gives the date we will turn it off.If it is still failing after 72 hours, and at least 48 hours after that email, we turn the endpoint off and email you again. One successful delivery resets the count. Before this, nothing told you an endpoint was failing unless you watched the Events tab.To turn an endpoint back on, open it under Webhooks in the developer portal and click Enable endpoint, or send { "enabled": true } to the API. Events from while it was off are not sent on their own, so resend the ones you need. You can also turn an endpoint off yourself with the new Enabled switch.When an endpoint keeps failing · Retries

Fixes and improvements

  • NGN virtual account deposits now cost 1% of the amount, down from 1.5%. The cap stays at NGN 300. Fees
  • We now require permission to manage webhooks before a team member can add, edit, enable, disable or delete an endpoint, see or rotate its signing secret, or resend events. The Owner, Super Admin and Developer roles have it by default. Before this, any team member could change your webhooks.

Virtual accounts

Collect NGN bank transfers through a fixed account number for your business or a connected account. The number does not expire, and each deposit becomes a payment on the account that owns it.For repeat payments, customers can send money straight from their banking app without starting another checkout. Share the account number and bank name, then track incoming deposits through your integration. If you need a transfer tied to a specific order, continue to use a bank-transfer checkout.Request the virtual_accounts capability and complete the account’s returned requirements, including the representative’s BVN. Once the capability is active, retrieve or create the number through the API. Each account can hold one virtual account per currency; NGN is the only currency available today.Your integration receives collection.succeeded when a deposit succeeds. Sender details, when supplied by the bank, help you reconcile transfers against your own records.Set up a virtual account

Let buyers check out without you knowing who they are first

You no longer have to attach a customer when you create a checkout. Leave customer out and the hosted page asks the buyer for their email and name before they pay.By default they do not join your customer directory, so one-time buyers you will never bill again do not clutter it. You still get their email and name, and their purchases still group together in your dashboard, so you can find them when they write in about a refund.Pass customer_creation: "always" when you do want the record. The buyer is matched by email, so someone you already hold lands on their existing record rather than a second one.
You still get the buyer either way. customer_details carries their email and name on the checkout object and on the checkout.completed webhook, whether or not a record was created. That is new for payment links with a fixed price, which previously gave you no identity at all on completion.A subscription checkout is the exception: it always creates a customer, because recurring billing needs somewhere durable to keep the card on file for renewal.Whether a guest becomes a customer

Choose the currencies behind each payment method

You can now decide not only which payment methods a checkout offers, but which currencies each of those methods is offered in. Accept cards in USD without accepting them in NGN, or offer bank transfer in every currency it supports while keeping cards to one.
Naming a method with no currencies offers it in all of them, and leaving a method out of the list means it is not offered at all.Before this, a payment method was all or nothing. If you wanted to stop taking cards in one currency, your only option was to switch cards off completely and lose the currencies you did want.The same setting works on payment links, where it applies to every checkout the link creates.Restrict methods and currencies

Overlay checkout

Your customers can now pay without leaving your site. Drop bachs.js on your page and any checkout session opens in a modal overlay: the hosted checkout, with every payment method and currency, on top of your own page.
The Bachs overlay checkout open on a merchant page
The SDK emits lifecycle events (checkout.ready, checkout.completed, checkout.failed, and more) so your page can react in real time, and it ships as a plain script tag or the @bachs/js npm package with full TypeScript types. There is no test/live switch to configure: the session URL carries its environment, so going live changes zero client code.Before this, the only way to take a payment was redirecting the customer to the hosted page.Add an overlay checkout

A demo you can click

snapkit.bachs.io is a fictional screenshot API whose pricing page runs entirely on Bachs, in the sandbox. One-time purchases, subscriptions, a 14-day free trial, quantity packs, and pay-what-you-want, each one a real checkout you can complete with a test card. A toggle opens every purchase in the overlay or as the hosted page, and you can check out with your own email to get the receipts.Tour the demo

Subscriptions

You can now sell recurring products and manage the subscriptions they create, end to end.Give any product a billing_cycle and it becomes recurring. When a customer completes a checkout for that product, Bachs saves their card, bills the first cycle, and creates a subscription that renews automatically. Add a trial_period to defer the first charge.Each subscription exposes its full lifecycle: its status (trialing, active, past_due, unpaid, canceled), the current billing period, the next charge date, and the line items being billed. You can:
  • Change the plan by moving a subscription to a different product.
  • Move or end a trial by setting trial_end.
  • Swap the payment method and retry collection immediately if the subscription is past due.
  • Cancel immediately, or at the end of the current period with cancel_at_period_end.
Mid-cycle plan changes settle through proration, and every renewal or change is recorded as an invoice you can retrieve.Subscriptions overview · Subscriptions API

Payments: one record for every sale

Every payment a customer makes is now a single payment object, whether it is a one-time purchase or a subscription renewal. Each payment carries a billing_reason (purchase, subscription_create, subscription_cycle, subscription_update) so you always know why it was charged, plus the customer, line items, fees, refunds, and (for subscriptions) the invoice it collected.Payments API

Control your checkout redirects

Checkout sessions now accept a success_url for where the customer lands after paying, and honor cancel_url when they abandon. You can also set expires_in_minutes (1 to 1440) to control how long a session stays open.Checkout sessions
Webhooks got a real home this week: one clear section in the docs, and an API to manage endpoints without leaving your code.

Manage webhook endpoints from the API

You can now create and manage webhook endpoints with an API key, not just from the dashboard. Register a URL, choose the events it should receive, rotate its signing secret, and inspect deliveries, all programmatically.
The response includes the signing secret once, on creation, so you can wire up signature verification straight away. You can also read delivery metrics per endpoint and resend a past event to debug an integration.Before this, setting up a webhook meant clicking through the dashboard. Now you can script it, provision endpoints per environment, and manage them the same way you manage the rest of your integration. It needs an API key with the webhooks:read / webhooks:write scopes.Webhook endpoint API · Setting up webhooks

Webhooks docs, in one place

The webhooks documentation was spread across three sections. It now lives in a single Webhooks area with three parts: Concepts (setup, signature verification, replay), Events (the payload for every event you can subscribe to), and the Endpoint API.Webhooks