How can I set up and schedule Bulk top-ups on my server using Github
Developers · Bulk Top-up
Deploy your own bulk top-up server in one command
A practical walkthrough of Reloadly's open-source bulk airtime processing app on GitHub — what it is, what you need, and how to get it running.
Setup time
~10–15 minutes
Level
Technical
You'll need
Docker + Make
Reloadly maintains an open-source bulk airtime processing application on GitHub, designed to be deployed on your own infrastructure with minimal setup. It wraps Reloadly's Airtime API in a ready-made web app, so you can upload a CSV file and send a batch of top-ups without writing any integration code yourself.
In this article
What this app actually does
The project lives at github.com/Reloadly/sample-bulk. It's a self-hosted web application — built on PHP Laravel with a Vue.js front end — that wraps Reloadly's Airtime API so you can process bulk top-ups by uploading a CSV file, instead of calling the API endpoint for every single transaction.
It's maintained directly by Reloadly and designed to be deployed with little to no programming knowledge — the whole setup is wrapped in a single install command.
Prerequisites
Everything runs inside Docker, so the entire environment is reproducible and isolated from whatever else is on your machine. Before you start, make sure your server or machine has:
🐳 Docker
Creates the clean, containerized environment the app runs in.
🛠️ Make
Runs the install script that wires everything together automatically.
Clone and install
Once Docker and Make are installed, this single command clones the repository and kicks off the full installation process:
git clone https://github.com/Reloadly/sample-bulk.git && cd sample-bulk && make install
That one line clones the whole project into a sample-bulk folder and runs the installer automatically. Once it finishes, the app runs on your localhost (port 80 by default) or on whatever IP your server holds.
Important: if you're deploying this on a server that's reachable from the public internet, change the default credentials below before going live — see "Under the hood" for how.
Log in with the default credentials
Open the project's URL (localhost or your server's IP/domain) in a browser and log in with the system admin account that ships with the project:
System Admin User
Email: admin@system.com
Password: admin
Important: this password is public, since it ships in the open-source repo. Change it immediately after your first login if the app is exposed to the internet.
Day-to-day commands
All of these run from inside the sample-bulk folder:
| Command | What it does |
|---|---|
| make install | Installs the project from scratch |
| make start | Starts the project |
| make stop | Stops the project |
| make restart | Restarts the project |
⚙️ Under the hood, for advanced users
The installer creates and runs two Docker containers:
- Database container — runs MariaDB. No port is exposed by default for security, though it does provide an internal port (3306) you can open by editing
docker-compose.ymlif you need outside access. - Web server container — Apache on PHP 7.3, with the full build configuration in
DockerFiles/Dockerfile. By default it opens port 80 on the host machine; change this indocker-compose.ymlif you need a different port.
If you change the default database or admin credentials in docker-compose.yml and .env, you'll need to delete the volumes directory (if it was already created) and run make install again so the system reinstalls using the new credentials.
❓ Frequently asked questions
Do I need to know PHP or Vue.js to run this?
No. The app is designed so anyone can deploy it with the install command, even with little to no programming knowledge. Knowing the stack only helps if you want to customize the source code itself.
Can I run this on a cloud VM instead of my local machine?
Yes. As long as the server has Docker and Make installed, the same install command works — the app will be reachable on that server's IP or domain instead of localhost.
Is it safe to leave the default credentials in place?
Not if the app is accessible from the public internet — the admin login and database passwords are published in the open-source repo, so anyone could find them. Change them before exposing the app externally.
What does the app actually use to send top-ups?
Reloadly's standard Airtime API under the hood — the app is just a self-hosted interface that lets you trigger many top-ups at once from a CSV upload, instead of calling the API per transaction yourself.
Stuck somewhere in the deployment?
Our support team can help you troubleshoot the setup.