Zentra
Open source · MIT

A whole shop, already written.

A Telegram bot and admin dashboard that resell this catalogue through the Reseller API. Clone it, put your own key in .env, and you are selling — your markup, your customers, your payment methods.

View the repository API reference
Clone to running bot
git clone https://github.com/zentradigitalshop/zentraapibot-example
cd zentraapibot-example/bot

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

# BOT_TOKEN, ZENTRA_API_KEY, DATABASE_URL — the only three required
cp ../.env.example ../.env
psql "$DATABASE_URL" -f ../supabase/migrations/0001_initial_schema.sql

cd .. && python -m bot.bot
What you get

Not a stub with TODO where the money goes

Every part below runs. The pieces that move money are the pieces that are tested hardest.

The bot

Catalogue, wallet, buying, the Zentra API client, the database and the settings system. Written with aiogram against PostgreSQL.

Admin dashboard

A separate Next.js app over the same database: overview, settings, orders, customers, deposits, and crediting a balance by hand.

Four payment rails

USDT on BEP-20 and Binance Pay confirm themselves. Telebirr and Bank of Abyssinia verify receipts through Zentra.

Tests that can fail

Twenty Python suites plus the dashboard's own. Every money-handling guard was verified by deliberately breaking it and watching the test catch it.

It works with no payment rail configured at all. Customers browse the real catalogue at your markup, and you credit a balance by hand from the dashboard. That is not a placeholder standing in for the real thing — it is the fallback every rail keeps permanently, because a payment that matches nothing automatic should never mean a customer simply loses their money.
Taking money

Four rails, added one at a time

Each is self-contained. Turn on the ones you can support today and leave the rest switched off — nothing else breaks.

USDT (BEP-20)A receiving address and one RPC endpoint

Watched on-chain. The amount itself is the fingerprint that matches a payment to the customer who owes it.

Binance PayYour Binance UID and a read-only API key

Not a merchant integration — it reads your own account's Pay history, which needs no business approval.

TelebirrYour account number and account name

Telebirr only answers Ethiopian IP addresses, so Zentra runs the receipt lookup for you with the key you already have. Nothing to host.

Bank of AbyssiniaYour account number and account name

No geographic restriction on this one — the receipt check runs from wherever your bot does.

Scope

Why a starter kit and not a copy of the shop

The shop this is modelled on runs a VPS, a chain listener, a Binance merchant account, a separate payment-verification service and around fifteen thousand lines refined against real customers over months. Handing you all of that as day-one requirements would mean most people who want to resell never finish setup. This gives you a running bot today, and each rail as something you adopt when you are ready for what it needs — never before.

Stuck on setup?

The repository's docs/GUIDE.md explains each rail in full. For anything it does not cover, open a ticket in @ZentraShopBot and a person answers in that chat.

Open on GitHub
Full API reference