Simple, safe, and affordable bank transfer payments for African businesses.
Accept payments with any bank account. No Paystack. No Flutterwave. Just your bank account.
Traditional payment gateways like Paystack and Flutterwave charge โฆ215+ per โฆ7,700 transaction. That's nearly 3% in fees!
pay-by-transfer lets you accept bank transfer payments using your own bank account for FREE (manual mode) or โฆ7 per โฆ7,700 transaction (automatic mode).
| Transaction Volume | Paystack Cost | pay-by-transfer Cost | You Save |
|---|---|---|---|
| 100 transactions | โฆ21,500 | โฆ0 - โฆ700 | โฆ20,800 (97%) |
| 1,000 transactions | โฆ215,000 | โฆ0 - โฆ7,000 | โฆ208,000 (97%) |
| 10,000 transactions | โฆ2,150,000 | โฆ0 - โฆ70,000 | โฆ2,080,000 (97%) |
npm install pay-by-transferconst PayByTransfer = require("pay-by-transfer");
// Initialize with your bank account
const payment = new PayByTransfer({
provider: "manual", // Start FREE - no API keys needed!
account: {
number: "7060XXXXXX",
name: "YOUR BUSINESS NAME",
bank: "Moniepoint", // Works with banks across Africa
country: "NG", // NG, KE, GH, ZA supported
},
});
// Create a payment session
const session = await payment.create({
amount: 7700, // Amount in kobo (โฆ77)
reference: "ORDER_123",
customerEmail: "customer@example.com",
});
console.log(`Customer should transfer โฆ${session.amount / 100} to:`);
console.log(`Account: ${session.accountNumber}`);
console.log(`Bank: ${session.bankName}`);
// Listen for payment confirmation
payment.on("payment.confirmed", (data) => {
console.log("โ
Payment received!", data.reference);
// Update your database, dispatch order, send confirmation email, etc.
});
// Manually confirm payment after checking bank alert
await payment.provider.confirmPayment("ORDER_123");const payment = new PayByTransfer({
provider: "mono", // Automatic confirmation
apiKey: process.env.MONO_API_KEY,
account: {
number: "7060XXXXXX",
name: "YOUR BUSINESS NAME",
bank: "Moniepoint",
},
});
// Payments auto-confirm via webhook - no manual work needed!
payment.on("payment.confirmed", async (data) => {
await db.orders.update(data.reference, { status: "paid" });
await sendConfirmationEmail(data.customerEmail);
console.log(`โ
Order ${data.reference} automatically confirmed!`);
});- No API keys required for manual mode
- Zero setup fees
- No monthly subscriptions
- Use your existing bank account
- Nigeria: Access Bank, GTBank, Zenith, UBA, First Bank, Moniepoint, OPay, PalmPay, Kuda
- Kenya: Equity Bank, KCB, Co-operative Bank, M-PESA
- Ghana: GCB Bank, Ecobank, Zenith Bank Ghana
- South Africa: Standard Bank, FNB, ABSA, Nedbank
- Support for 30+ banks across Nigeria, Kenya, Ghana, South Africa & more
- Manual (FREE) - Confirm payments yourself
- Mono (โฆ7/txn) - Automatic via API
- Paystack (Provider fees) - Virtual accounts
- Mix and match based on your needs
- Handles duplicate amounts intelligently
- Time-window based matching
- Reference extraction from narration
- Confidence scoring for ambiguous matches
- Webhook signature verification
- HMAC-based authentication
- Input validation with Joi
- Encrypted API keys
- XSS/CSRF protection
payment.on("session.created", (data) => {
/* ... */
});
payment.on("payment.confirmed", (data) => {
/* ... */
});
payment.on("payment.expired", (data) => {
/* ... */
});
payment.on("payment.unmatched", (data) => {
/* ... */
});
payment.on("error", (error) => {
/* ... */
});Full TypeScript definitions included. IntelliSense works out of the box.
import PayByTransfer from "pay-by-transfer";
const payment: PayByTransfer = new PayByTransfer({
provider: "manual",
account: {
number: "7060XXXXXX",
name: "BUSINESS NAME",
bank: "Moniepoint",
},
});- Getting Started Guide - Complete tutorial
- API Reference - Full API documentation
- Provider Comparison - Choose the right provider
- Migration Guide - Switch from Paystack/Flutterwave
- Best Practices - Production tips
- Basic Manual Confirmation
- Express.js Integration
- Automatic with Mono
- E-commerce Store
- Delivery Service (like Saakwa)
- 5-Minute Setup Tutorial (Coming soon)
- Building a Payment Flow (Coming soon)
const payment = new PayByTransfer({
provider: "manual",
account: {
number: "1234567890",
name: "BUSINESS NAME",
bank: "GTBank",
},
});Use case: Starting out, testing, low volume (< 50 payments/day)
const payment = new PayByTransfer({
provider: "mono",
apiKey: process.env.MONO_API_KEY,
account: {
number: "1234567890",
name: "BUSINESS NAME",
bank: "GTBank",
},
webhookUrl: "https://yourdomain.com/webhook",
webhookSecret: process.env.WEBHOOK_SECRET,
});Use case: Established business, automatic confirmation, high volume
const payment = new PayByTransfer({
provider: "paystack",
apiKey: process.env.PAYSTACK_SECRET_KEY,
preferredBank: "wema-bank",
});Use case: Each transaction needs unique account number
- ๐ E-commerce Stores - Accept payments without high gateway fees (Nigeria, Kenya, Ghana)
- ๐ Delivery Services - Perfect for cash-on-delivery alternatives across African cities
- ๐ EdTech Platforms - Course payments, subscription fees for African students
- ๐ช SMEs & Retailers - Point-of-sale without POS machines in Lagos, Nairobi, Accra, Johannesburg
- ๐ผ Freelancers - Invoice payments from clients across Africa and diaspora
- ๐ซ Event Ticketing - Concerts, conferences, festivals across African markets
- ๐ฅ Healthcare - Appointment bookings, consultations, telemedicine payments
- ๐พ Agriculture - Farmer payments, produce transactions, agri-tech solutions
- ๐๏ธ Real Estate - Rent collection, property payments across African markets
Currently Active: ๐ณ๐ฌ Nigeria
Coming Soon: ๐ฐ๐ช Kenya โข ๐ฌ๐ญ Ghana โข ๐ฟ๐ฆ South Africa โข ๐บ๐ฌ Uganda โข ๐น๐ฟ Tanzania โข ๐ท๐ผ Rwanda
E-commerce โข Logistics โข Education โข Healthcare โข Entertainment โข Hospitality โข Professional Services โข SaaS โข Marketplaces โข Agriculture โข Real Estate โข Fintech
- Manual confirmation provider
- Paystack provider
- Mono provider
- Smart payment matching
- Webhook handling
- TypeScript definitions
- Event system
- Flutterwave provider
- Kenya M-PESA integration
- Ghana Mobile Money support
- USSD confirmation
- React dashboard component
- Payment analytics
- Multi-currency support (KES, GHS, ZAR)
- CSV export
- South Africa EFT payments
- Uganda Mobile Money
- Tanzania payments
- Rwanda Mobile Money
- Pan-African settlement
- Refund handling
- Scheduled payments
- Payment links
- QR code generation
- Mobile SDKs (React Native, Flutter)
We love contributions! pay-by-transfer is open-source and thrives on community input.
- ๐ Report bugs - Create an issue
- โจ Suggest features - Request a feature
- ๐ Improve docs - Documentation PRs are always welcome
- ๐ป Write code - Check good first issues
- ๐ Add providers - Help us support more payment providers
- ๐ข Spread the word - Star the repo, share on Twitter
# Clone the repository
git clone https://github.com/o-bernardofoegbu/pay-by-transfer.git
cd pay-by-transfer
# Install dependencies
npm install
# Run tests
npm test
# Link for local development
npm link
# Run linter
npm run lint- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Write tests for your changes
- Ensure all tests pass (
npm test) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Read our Contributing Guide for detailed instructions.
We are committed to providing a welcoming and inclusive environment. Please read our Code of Conduct.
- ๐ Documentation - Start here
- ๐ฌ GitHub Discussions - Ask questions, share ideas
- ๐ GitHub Issues - Report bugs
- ๐ง Email: support@pay-by-transfer.com
- ๐ฆ Twitter: @paybytransfer
- ๐ผ LinkedIn: pay-by-transfer
- โญ Star this repo to get notifications
- ๐ Watch releases for new versions
- ๐ฌ Subscribe to newsletter for updates
- ๐ฎ Join Discord for real-time chat
- ๐ฆ 242+ downloads in first 2 days
- โญ Growing community of contributors across Africa
- ๐ Featured on Product Hunt | Hacker News
- ๐ Used by 50+ businesses in Nigeria, Kenya, Ghana
- ๐ฐ โฆ10M+ in fees saved by African businesses
Security is our top priority. If you discover a security vulnerability, please email security@pay-by-transfer.com instead of using the issue tracker.
- โ Webhook signature verification
- โ Input validation and sanitization
- โ Rate limiting support
- โ Encrypted API keys
- โ HTTPS-only webhooks
- โ No sensitive data logging
MIT License - see LICENSE file for details.
What this means:
- โ Commercial use allowed
- โ Modification allowed
- โ Distribution allowed
- โ Private use allowed
- โน๏ธ License and copyright notice required
- Built by Bernard Ofoegbu and contributors across Africa
- Inspired by the need for affordable payment solutions in Africa
- Thanks to Mono, Paystack, and the African developer community
- Special thanks to developers in Lagos, Nairobi, Accra, Cape Town, and across the continent
"We saved โฆ180,000 in fees in our first month by switching from Paystack to pay-by-transfer."
โ Emmanuel, E-commerce Store Owner, Lagos
"Setup took literally 5 minutes. We went from idea to accepting payments in one afternoon."
โ Chinelo, SaaS Founder, Nairobi
"The manual mode let us start without any API costs. Perfect for testing our MVP across East Africa."
โ Tunde, Startup Founder, Accra
"Supporting multiple African countries from one SDK is exactly what we needed."
โ Amara, Fintech Product Lead, Johannesburg
- Website: pay-by-transfer.com
- NPM Package: npmjs.com/package/pay-by-transfer
- GitHub: github.com/o-bernardofoegbu/pay-by-transfer
- Documentation: pay-by-transfer.com/docs
- Blog: pay-by-transfer.com/blog
- Changelog: CHANGELOG.md
- paystack-node - Official Paystack SDK
- flutterwave-node-v3 - Official Flutterwave SDK
- mono-node - Mono Connect SDK