Start billing this week.
Set up a plan in test mode today. Go live once we’ve verified your business.
Your customers subscribe with MoMo in about a minute. Monthly takes care of every renewal, reminder and retry after that.
Your customers pay the way they already do
Most subscriptions in Ghana end the month someone forgets to send the MoMo. Monthly sends the prompt, the reminder and the retry, so the only thing your customer does is approve.
A phone number, a 6-digit code, a MoMo PIN. Your customer is subscribed in about a minute.
A day before every renewal, an SMS and an email: the amount, the date, and the prompt to expect.
Same day every month. The MoMo prompt arrives, they approve it, the money is yours.
Declined? Monthly tries again 1, 3 and 5 days later, and tells them each time.
Still nothing? The subscription pauses. It never cancels. One payment brings it back.
Charge MoMo every month, or let customers pay from a Monthly credits balance they top up themselves. One credit is one cedi, always.
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.
See what came in today, who’s on a trial, and who’s being retried. 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, in Ghana time.
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.
// 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.
Set up a plan in test mode today. Go live once we’ve verified your business.