Start billing this week.
Test mode is free and takes minutes. Go live as soon as we’ve verified your business. No setup fee, no monthly fee, no contract.
Customers subscribe with mobile money in about a minute. Every renewal, reminder and retry after that is on us.
Live in Ghana, with the wallets your customers already use
Subscriptions were built for cards. Monthly is built for everyone else. We send the reminder, the prompt and the retry, so the only thing your customer does is approve.
A phone number, a 6-digit code, a MoMo PIN. About a minute, once. That’s the last thing your customer has to remember.
A day before every renewal, an SMS and an email: the amount, the date, and the prompt to expect.
Same day every month. The prompt arrives, they approve it, the money is yours. Nobody had to ask.
Declined? Monthly tries again 1, 3 and 5 days later, and tells them each time. You don’t send a single message.
Still nothing? The subscription pauses. It never cancels. One payment brings your customer back.
Collect mobile money every month, or let customers prepay into a Monthly credits balance they can spend with every business on Monthly. In Ghana, one credit is always one cedi.
The network is read from the number. Approved with the customer’s own PIN.
Give back some or all of a payment in one click. Our fee comes back with it.
Paid at once from the balance. A retry never spends twice.
Know what came in today, who’s on a trial and who’s being retried, without opening a spreadsheet. Monthly’s fee is already taken off, so the number you see is the number you keep.
Monthly, quarterly or yearly prices, with up to a year free. Change a price for new subscribers only.
Everything works in test mode with sandbox MoMo. Live mode opens once we’ve verified your business.
Give back all or part of a payment as Monthly credits, with our fee returned in the same share.
Owners and admins change things and manage keys. Members can look without touching.
Every successful payment, renewal, retry and refund, counted on the day it happened, so you always know where the month stands.
Every event is kept, so your systems can catch up on anything they missed.
Create a checkout session on your server, then send the customer to it or open it over your page. Monthly tells your server what happened, signed. Build it once: as Monthly opens new markets, your integration comes with you.
// Your server: start a checkout for a plan
const res = await fetch('https://api.usemonthly.app/v1/checkout-sessions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONTHLY_KEY}`, // mk_test_…
'Content-Type': 'application/json',
},
body: JSON.stringify({
planId: '7c1f…',
successUrl: 'https://streamgh.com/welcome?session={CHECKOUT_SESSION_ID}',
cancelUrl: 'https://streamgh.com/',
clientReferenceId: user.id,
}),
});
const { url } = await res.json();
// Send the customer to url, or open it in the pop-up<!-- Your page: the same checkout, over your site -->
<script src="https://checkout.usemonthly.app/v1/monthly.js"></script>
<script>
button.addEventListener('click', async () => {
const { url } = await fetch('/checkout-session', { method: 'POST' })
.then((r) => r.json());
Monthly.openCheckout({
url,
onSuccess: (result) => location.assign('/welcome?session=' + result.sessionId),
onCancel: () => {},
});
});
</script>// Your server: check Monthly-Signature before trusting an event
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(rawBody, header, secret) { // secret: whsec_…
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - t) > 300) return false;
const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest();
return timingSafeEqual(expected, Buffer.from(v1, 'hex'));
}
// Then act on event.type, once per event.id:
// subscription.renewed, .payment_failed, .paused, .resumed, .cancelled …subscription.renewedStreamGH · Ama O.200checkout.session.completedKumasi Gym · Yaw B.200subscription.payment_failedLumo Wi-Fi · Efua A.200subscription.renewedLumo Wi-Fi · Efua A.200subscription.trial_startedOsu Fresh Box · Kwame M.200Monthly’s fee, on each payment that succeeds. Failed attempts cost nothing.
On days 1, 3 and 5 after a declined renewal, each with an SMS and an email.
Before every renewal, your customer is told the amount and the date.
For missed payments. Subscriptions pause, and come back with one payment.
Everything you pay for monthly, from every business on Monthly: see what renews when, pause before you travel, switch wallets, or cancel. No calls, no begging, no surprises.
We started where mobile money is part of everyday life, because if recurring payments work here, they’ll work anywhere. Ghana proves it. The rest of Africa is next.
MTN MoMo, Telecel Cash and AirtelTigo Money, billed in cedis or Monthly credits. Everything on this site works here today.
More countries, networks and currencies, on the same checkout, dashboard and API. Build once and your integration comes with you.
Wherever businesses still collect by hand. Mobile money, cards or bank accounts: one place to get paid every month.
Test mode is free and takes minutes. Go live as soon as we’ve verified your business. No setup fee, no monthly fee, no contract.