Virtual numbers · Web platform
RentNumber
Virtual phone numbers for SMS verification codes, paid for in naira or crypto. Four SMS providers sit behind one engine, and customers are refunded automatically when a code never arrives.

Built
Serverless on Cloudflare: Workers, D1 with Drizzle, KV, R2 and Cron Triggers, four payment gateways and 790+ tests
Grew
Pitched it on three promises: pay in naira, get the code in seconds, or get your money back automatically
the result
1,900+ users and over ₦5.4M in wallet deposits
- users
- 1,900+
- wallet deposits
- ₦5.4M+
- automated tests
- 790+
- SMS providers + payment gateways
- 4 + 4
The idea
People in Nigeria need phone numbers from other countries to verify accounts on WhatsApp, Telegram, Google and hundreds of other services. RentNumber lets them fund a wallet in naira and get a working number, with its SMS code, in seconds.
What I built
The customer app has sign-up with email verification and a wallet funded through Monnify, PaymentPoint (bank transfer), Korapay and Cryptomus (crypto). Customers can buy one-time OTP numbers, rent long-term numbers or buy email-verification addresses, and watch their codes arrive in real time. There is also a referral program and a support desk.
Behind it is a multi-provider number engine: one adapter layer over 5sim, SMSPool, HeroSMS and TextVerified. Prices refresh automatically from provider costs, the exchange rate and the markup, and checkout picks a provider for each country and service.

Keeping the money safe
Every wallet movement is an integer-kobo ledger entry with an idempotency key, so a deposit or refund can never post twice. When a rental expires or the provider cancels it without a code, the customer is refunded automatically. A settlement job then checks that the provider refunded the platform too, and flags any order where money was lost.
Provider balances are reconciled against the app’s own orders, so spending the app didn’t make shows up straight away. That is how a leaked API key would surface. Per-user rental limits, Turnstile, rate limiting and a honeypot field keep out abuse and spam bots.
Running it
The admin console has a live dashboard whose numbers click through to the orders behind them, a full transaction ledger with filters, sales views for numbers, rentals and email orders, deposit reconciliation by gateway, and refund-leak and provider-settlement reports. It also covers traffic analytics, email templates and settings, and admin sign-in requires 2FA.
A Telegram bot reports deposits, purchases, sign-ups, low provider balances and suspicious spending. Transactional email has a main and a backup provider, each with a one-click test. Six scheduled jobs handle expiries and refunds, price refresh, deposit reconciliation, SMS polling, balance checks and cleanup.
Engineering practice
More than 790 integration tests run against a real Workers runtime, with coverage gates. Staging and production are separate environments with versioned database migrations.
Production issues get fixed as they come up: a slow query rewritten to stay within the database’s CPU limit, provider status codes that were being misread, and fraud alerts that fired when nothing was wrong.
Stack
TypeScript, Cloudflare Workers, Hono with server-rendered JSX, Cloudflare D1 (SQLite) with Drizzle ORM, KV, R2, Cron Triggers, Vitest, Turnstile, Resend, SendGrid and Mailgun, and the Telegram Bot API.
Where it is now
RentNumber is live at rentnumber.net with 1,900+ users and over ₦5.4M in wallet deposits. The whole platform is serverless on one provider, with no servers to maintain, and pages are rendered at the edge close to Nigerian users. Stuck orders are refunded automatically instead of by hand, and the admin team can trace every naira from deposit to refund.