MintOffice¶
MintOffice is the Brand Partner portal for mintbot.ai. It lets you resell mintbot under your own brand: your domain, your bot, your client list — with mintbot handling deployment, billing rails, and the per-agent infrastructure under the hood.
The live partner portal lives at mint.mintbot.ai.
This guide walks you from "I just heard about MintOffice" to "my first white-label agent is live on my own domain". The technical parts (DNS records, GitHub repo, bot token) are best handled by a mintbot agent on your behalf — see Let an agent set you up before you start.
Building the integration yourself?
For the developer-facing side — which repositories you fork, how the deploy flow runs end-to-end, and how the agent template + storefront fit together — see MintOffice — Technical.
What you get¶
- Resell every mintbot package (Trial, Starter, Pro, Max) under your own
domain — your customers see
agent1.yourbrand.com, not*.mintbot.ai. - Use your own Telegram bot (
@yourbrand_bot) for chat traffic, or borrow mintbot's bot while you're still testing. - Choose your customer-facing prices and pocket the difference between what you charge them and what mintbot charges you (the MintOffice wholesale floor).
- A Brand Partner API for programmatic order creation, lifecycle status, and webhooks back into your own systems.
- A dashboard showing active customer orders, bot-link health, pricing, payouts, and webhook delivery.
Pricing — Brand Partner setup fee¶
Signing up for a free trial portal account is, well, free — but the
Brand Partner signup fee is the one payment that turns it into
a real brand-partner account. You pay once at
reception.mintbot.ai/mintoffice
(or reception.mintbot.dev/mintoffice for the dev/test environment) and
the same payment unlocks both portals:
| Tier | Price | What's included |
|---|---|---|
| Free trial (default for every new partner) | $0 | 10 disposable DEV deploys for testing your portal + template |
| Brand Partner — launch promo | $49 one-off | 42 disposable DEV deploys, Brand Partner status on both mint.mintbot.ai + mint.mintbot.dev, thorough setup guide (an agent can drive the whole wizard for you) |
| Brand Partner — standard | $99 one-off | Same as launch — without the promo |
What happens after you pay:
- Stripe processes the payment on
reception.mintbot.ai/mintoffice(or.devif you're on the test environment) — same card / Apple Pay / Google Pay flow as ordinary mintbot tier orders. - Reception immediately sends a signed grant to both
mint.mintbot.aiandmint.mintbot.dev, flipping your account to Brand Partner status on both portals. - You receive a welcome email from
pigeon@mintbot.ai(orpigeon@mintbot.devif you bought on the test env) containing both signin links and a pointer to this guide. - Sign in on whichever portal you want to start with. If the cross-env push happened to miss either portal for some reason, the first signin on that portal asks reception "did this email pay?" and applies the grant on the spot.
The fee is a one-time payment, not a subscription. The launch
promo is on by default while we're rolling MintOffice out; it's
controlled by the MINTOFFICE_SETUP_PROMO server flag, so the price
you see at checkout is the price you'll pay.
Refunds
14-day refund window, no questions asked — if the tier isn't worth
it for your use case, email support@mintbot.ai and we'll send the
fee back.
Wholesale per-agent pricing (the rate mintbot charges you for each customer order you mint) is independent of the setup fee and lives in Step 5 — Pricing below.
Let an agent set you up¶
Most of the technical work — buying a domain, configuring DNS, creating a Telegram bot, forking the template repo — is mechanical. You can do it by hand, but the smoothest path is to delegate it to a mintbot agent.
Recommended path
Spin up a mintbot agent and ask it:
"Set me up as a MintOffice brand partner under domain yourbrand.com
— walk me through the onboarding wizard and fill in everything you
can on my behalf."
The agent has access to a terminal, a browser, a DNS API, GitHub auth, and knowledge of this guide. It will tell you exactly which step needs your intervention (e.g. clicking BotFather's confirmation in Telegram) and handle the rest.
Your own Hermes, an OpenCode / OpenClaw install, Cursor agent mode, or any other coding agent works equally well — feed it this page as context and tell it the goal.
If you'd rather drive the wizard yourself, the steps below are exactly what the agent would do.
Step 0 — Create your account¶
- Open mint.mintbot.ai.
- Type the email address you want to use as your operator login.
- Click Send me a sign-in link.
- Open the email from
pigeon@mintbot.aiand click the magic link (valid for 24 h, single-use).
There is no password — every subsequent login is another magic link. This is intentional: passwords leak, magic links don't, and they're easy for an agent to automate later if you set up email access.
Step 1 — Domain¶
The wizard's first question is where your agents will live. You have two choices:
Agents live on subdomains of a domain you own — e.g.
agent1.yourbrand.com, agent2.yourbrand.com, … This is the
branded experience your customers see.
You'll need:
- Apex domain — a registered, bare domain (no
https://, no subdomain):yourbrand.com. - DNS provider — currently only Zone.ee has a working backend. Cloudflare and manual modes are on the roadmap.
- Zone.ee API key + username — issued from my.zone.eu → Account settings → API keys → Create new key. The agent uses this to create A-records automatically when you provision an agent.
Subdomain numbering style
- Text prefix + number (default) —
agent1.yourbrand.com,agent2.yourbrand.com, … Most human-readable. - Numeric only —
1.yourbrand.com,2.yourbrand.com, … Short. - Numeric, zero-padded —
001.yourbrand.com, … Stable width.
The choice is purely cosmetic — the deploy worker is fine with all three.
Agents live on *.mintbot.ai — no setup, no DNS, but the URL doesn't
carry your brand. Useful for kicking the tires; switch to your own
domain before customer-facing launch.
Step 2 — Bot¶
Every agent gets a chat surface. The defaults assume Telegram — Discord and Slack are scaffolded but not yet wired.
Your customers chat with @yourbrand_bot, which keeps the brand
intact.
- Open @BotFather in Telegram.
- Send
/newbot. Give the bot a display name and a username (must end inbot). - BotFather returns a token shaped
123456789:AA…(at least 40 characters). - Paste that token into the wizard.
See Telegram's bot tutorial if you want the longer version.
Customers chat with @mintbot_dev_bot. Fast for a demo, but unbranded.
Flip to your own bot before launch.
Skip Telegram entirely. Customers access agents through the web panel only. You can add a bot later from Settings.
Step 3 — Template¶
Each agent is built from a template repository containing CSS, copy, default persona, and the agent's plugin set. You decide the look.
Default template — mintbot-ai/agent-template
This is the default template that gets forked for each new client agent. It controls the SOUL.md (agent persona), config.yaml (Hermes settings), and panel theme (CSS variables and copy). Fork it, make your changes, and point the wizard at your fork's URL. Every deploy pulls a fresh copy, so your clients always get the latest revision.
Branch mintbot-ai/agent-template, edit CSS / strings / persona to match your brand, and paste your fork's URL.
Safety net
Every deploy pulls a fresh copy of your fork and runs the contract tests. If they fail, the deploy aborts — your customer never sees a broken build.
Plain mintbot styling. You can switch to your own fork later from Settings.
Step 4 — API¶
The Brand Partner API lets you orchestrate agent creation from your own backend instead of using the dashboard. The wizard skips API setup by default — leave it for later unless you're ready to integrate now.
When you are ready:
- From the dashboard, open Settings → API access.
- Click Generate key. The plaintext is shown once — store it in your secret manager.
- (Optional) Configure a webhook URL to receive lifecycle events.
- (Optional) Generate a webhook signing secret once your receiver is ready to verify signatures.
See the Brand Partner API reference for the full endpoint list and the webhook payload shapes.
Webhook URL and signing secret are optional
Neither is required to start selling — the dashboard and API work
fine without them. The webhook URL field stays empty until you have
a receiver pointed at https://<your-host>/...; the signing secret
is only useful once you've set that URL and want to verify the
X-Mintbot-Signature header. Both can be added (or rotated) any
time from Settings → API access.
Let an integration agent discover the setup
Once you have an API key, an agent can call
GET /api/v1/settings to read your
full non-secret configuration in one shot — domain, DNS provider, bot,
template, subdomain pattern, pricing, readiness. No secret is ever
returned (tokens and keys surface only as *_set booleans), so the key
is safe to share with the agent that's installing your white-label
setup on a fresh server.
Skip the boilerplate — fork the reference portal
A complete, runnable example storefront lives at mintbot-ai/partner-portal-example. See Reference portal below for the full walkthrough.
Step 5 — Pricing¶
The last wizard step is what your customers pay per package. MintOffice splits pricing into two modes — you can switch later under Settings → Pricing:
Customers see mintbot's recommended price per tier (Trial, Starter, Pro, Max). You make the partner margin between that recommended price and the wholesale floor — zero setup. Pick this if you just want to start selling.
You set the price each customer pays for every tier. You pocket every cent above the wholesale floor. Pick this when you have a deliberate markup strategy.
The wholesale floor is what mintbot charges you per order — it's
the absolute minimum you can charge. Your partner cut is
customer_price − wholesale_floor per order. The wizard previews the
calculated margins per tier before you submit.
Custom pricing can be partial
Even in custom mode you don't have to override every tier — leave a tier on the default and it inherits mintbot's recommended price. Edit only the ones you care about.
Going live¶
After the wizard, the dashboard shows a banner listing any still-missing required info. The four required fields are:
- Telegram bot token (or another bot provider)
- DNS API key (e.g. Zone.ee key + username)
- Template repo URL
- Apex domain
Once all four are filled and the DNS provider check passes, the Go
Live button activates. Clicking it flips your partner status from
onboarding → live, and the Brand Partner API starts accepting
order-creation requests.
Activation is a one-way handshake
Your account stays in onboarding until you click Go Live. While
onboarding, the API rejects writes with a 403 (reads stay open so you
can inspect state). Don't activate until your domain DNS is verified
in Zone.ee and your template repo's tests are green.
After Go Live: domain + Telegram bot settings lock
Once your partner status is live, the Domain and Telegram
bot sections of Settings become read-only. Existing customer agents
already point at your apex domain and chat through your bot — a
silent change would orphan them mid-life. The other sections stay
editable:
| Section | Editable while live? |
|---|---|
| Domain / DNS / subdomain pattern | No — contact support if you need to migrate |
| Telegram bot | No — contact support if you need to migrate |
| Agent template | Yes — new orders use the new template; existing agents keep their seeded template |
| API key / webhook | Yes — rotate any time |
| Pricing | Yes — applies to future orders |
The lock is enforced both in the UI (fieldset disabled, banner
explaining why) and on the server (POSTs to /settings with
section=domain or section=bot return 403).
Webhooks + payouts¶
- Webhook deliveries — every lifecycle event (order created, activated, expired) posts to the webhook URL you set in Settings. The dashboard's per-partner Webhook health chip shows delivery success rate over the last 24 h.
- Revenue ledger — every paid order writes a row with your gross, your cut, and mintbot's cut. The dashboard surfaces lifetime totals and the unpaid balance.
- Payouts — accumulate. The mintbot team pays them out manually per partner agreement; the dashboard tracks paid vs unpaid status.
Reference portal¶
If you don't want to build a storefront from scratch, fork the official example: mintbot-ai/partner-portal-example. It's MIT-licensed FastAPI + SQLite + Docker, ships with a fictional "AcmeAI" branding you can swap out, and covers the full loop end-to-end:
- landing page with plan cards,
/buyform →POST /api/v1/orders→ Stripe checkout redirect,- thank-you / cancel return pages,
POST /webhooks/mintofficewith the HMAC signature verifier,- HTTP-Basic-auth
/adminevent browser, /healthzliveness probe.
Setup walkthrough¶
-
Fork the repo so you can keep your branding changes in git:
git clone https://github.com/mintbot-ai/partner-portal-example.git cd partner-portal-example cp .env.example .env -
Fill in
.envwith values from your MintOffice dashboard:Variable What goes here PARTNER_BRANDCustomer-visible brand name (also used as the Stripe line-item label). MINTOFFICE_API_URLhttps://mint.mintbot.aifor live,https://mint.mintbot.devfor testing.MINTOFFICE_API_KEYAPI key from Settings → API access (format mo_live_…).MINTOFFICE_WEBHOOK_SECRETWebhook signing secret shown once at creation in the same dashboard. PUBLIC_BASE_URLThe HTTPS URL your portal will live on (used to build Stripe success_url/cancel_url).ADMIN_USERNAME/ADMIN_PASSWORDBasic-auth gate on /admin. Use a long random password. -
Run it — Docker is the easiest path; bare-metal works too:
docker compose up --buildpip install -e . uvicorn app.main:app --reload -
Expose it on HTTPS — MintOffice rejects
http://for both Stripe redirect URLs and the webhook URL (private IPs andlocalhostare blocked by the SSRF guard). For local development, use Cloudflare Tunnel, Tailscale Funnel, or ngrok. For production, deploy to your own host. -
Point your partner row at the portal — back in the dashboard:
- Set Webhook URL to
https://<your-host>/webhooks/mintoffice. - That's it. Place a test order from
/buy, and watch the events arrive in/admin.
- Set Webhook URL to
Rebranding¶
The default templates pretend to be AcmeAI. Three touch-points:
PARTNER_BRANDin.env— flows into Stripe, headers, footers.app/templates/base.html— CSS variables for colours / accent.app/templates/*.html— copy and per-page layout. Translations (Estonian, Spanish, …) live as forks of these files.
Quick deploy on the same VPS as your agents
The example portal is small enough to run alongside your MintOffice
deploy agent. If you already have a mintbot agent VPS, ask it:
"Deploy partner-portal-example as a webhook receiver under
https://portal.<my-domain>/, fill in MINTOFFICE_API_KEY and
MINTOFFICE_WEBHOOK_SECRET from GET /api/v1/settings, and set the
webhook URL on my partner row." The agent has the docs and the API
key path to do this end-to-end.
Brand Partner API¶
For programmatic agent creation, status polling, and webhook events, see the Brand Partner API reference. For the broader architecture (how your storefront, the API, the deploy worker, and each customer's agent VPS fit together), see MintOffice — Technical.