Skip to content

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:

  1. Stripe processes the payment on reception.mintbot.ai/mintoffice (or .dev if you're on the test environment) — same card / Apple Pay / Google Pay flow as ordinary mintbot tier orders.
  2. Reception immediately sends a signed grant to both mint.mintbot.ai and mint.mintbot.dev, flipping your account to Brand Partner status on both portals.
  3. You receive a welcome email from pigeon@mintbot.ai (or pigeon@mintbot.dev if you bought on the test env) containing both signin links and a pointer to this guide.
  4. 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

  1. Open mint.mintbot.ai.
  2. Type the email address you want to use as your operator login.
  3. Click Send me a sign-in link.
  4. Open the email from pigeon@mintbot.ai and 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.euAccount 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 only1.yourbrand.com, 2.yourbrand.com, … Short.
  • Numeric, zero-padded001.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.

  1. Open @BotFather in Telegram.
  2. Send /newbot. Give the bot a display name and a username (must end in bot).
  3. BotFather returns a token shaped 123456789:AA… (at least 40 characters).
  4. 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:

  1. From the dashboard, open Settings → API access.
  2. Click Generate key. The plaintext is shown once — store it in your secret manager.
  3. (Optional) Configure a webhook URL to receive lifecycle events.
  4. (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:

  1. Telegram bot token (or another bot provider)
  2. DNS API key (e.g. Zone.ee key + username)
  3. Template repo URL
  4. 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 onboardinglive, 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,
  • /buy form → POST /api/v1/orders → Stripe checkout redirect,
  • thank-you / cancel return pages,
  • POST /webhooks/mintoffice with the HMAC signature verifier,
  • HTTP-Basic-auth /admin event browser,
  • /healthz liveness probe.

Setup walkthrough

  1. 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
    
  2. Fill in .env with values from your MintOffice dashboard:

    Variable What goes here
    PARTNER_BRAND Customer-visible brand name (also used as the Stripe line-item label).
    MINTOFFICE_API_URL https://mint.mintbot.ai for live, https://mint.mintbot.dev for testing.
    MINTOFFICE_API_KEY API key from Settings → API access (format mo_live_…).
    MINTOFFICE_WEBHOOK_SECRET Webhook signing secret shown once at creation in the same dashboard.
    PUBLIC_BASE_URL The HTTPS URL your portal will live on (used to build Stripe success_url / cancel_url).
    ADMIN_USERNAME / ADMIN_PASSWORD Basic-auth gate on /admin. Use a long random password.
  3. Run it — Docker is the easiest path; bare-metal works too:

    docker compose up --build
    
    pip install -e .
    uvicorn app.main:app --reload
    
  4. Expose it on HTTPS — MintOffice rejects http:// for both Stripe redirect URLs and the webhook URL (private IPs and localhost are blocked by the SSRF guard). For local development, use Cloudflare Tunnel, Tailscale Funnel, or ngrok. For production, deploy to your own host.

  5. 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.

Rebranding

The default templates pretend to be AcmeAI. Three touch-points:

  • PARTNER_BRAND in .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.