Invicta Motus · concept for review

Scan to Charge

A power bank rental flow with no app to download. Scan the QR on the cabinet, authorise, and the slot opens while you are still standing there. The meter only runs while it is funded.

This document holds two different kinds of number. Our price is real and sits in part sixteen. Every operating figure — the hourly rate, the daily cap, the buyout price — is an example chosen to show how a mechanism behaves, and what each is actually set to is your commercial decision. Part eight collects those in one place.

Client app
Mobile web
Account
Phone number
Payment
Card or credits
Deposit
None, no hold
The case

Why there is no app

The brief asks for iOS and Android. We think that is the wrong first build, for two reasons. First, an app is an unnecessary and underused cost: you pay for two separate builds, two store listings and their ongoing maintenance, for something a customer opens a handful of times a year. Second, and deeper: the customer's phone is nearly dead. (For the phone that is fully dead, see the optional card reader in part fifteen.) That is the defining condition of this product and it appears in no other. Ride hailing, food delivery and banking can all afford to ask for an install, because the customer's phone is fine. Ours is at four percent, in a café, on unfamiliar wifi, and the person holding it is anxious.

Asking that person to visit a store, download forty megabytes, open the app, create an account and grant permissions — before they can begin renting — is the highest-friction moment any product could choose. And at launch there is no installed base, so every rental in the first months is a first-time user hitting that wall.

WITH AN APP — EIGHT STEPS See the cabinet Open the App Store Download 40 MB Open the app Create an account Grant permissions Find scan, scan the QR Authorise, then rent five steps that exist only because an app exists — on a phone at 4% SCAN TO CHARGE — FOUR STEPS See the cabinet Native camera opens the page Phone number, authorise The slot opens Nothing installed. Half the steps, and none of them in a store.
The app does not add a feature here; it adds a queue. Every step it introduces sits between someone seeing a cabinet and someone holding a charged phone — which is the only stretch of this product where customers are lost.

And the obvious objection — will Mongolians actually do this? — is already answered, every day, in car parks across Ulaanbaatar. You scan the QR on the barrier, type your plate number, pay in whichever banking app you already have, and the barrier lifts. Nobody downloaded anything to park.

CAR PARKS IN ULAANBAATAR — ALREADY ORDINARY Scan the QR on the barrier Enter the plate number Pay in your own banking app The barrier lifts SCAN TO CHARGE — THE SAME FOUR STEPS Scan the QR on the cabinet Enter your phone number Pay in your own banking app The slot opens Same phones, same banking apps, same learned behaviour
The behaviour is already trained, and we did not train it. Car parks had every reason to build an app — regular customers, repeat visits, season tickets, loyalty — and the flow people actually use is still scan, type, pay, open. A power bank customer needs this once in a while, not daily, so the case for asking them to install something is weaker still.

The other way to test it is to ask what apps are actually for, and check each reason against this particular product.

What an app is forDoes it apply here?
Camera and hardwareNo. The native camera opens the URL — that is the entry point. And the phone never communicates with the cabinet at all: it talks to our server, our server talks to the cabinet over 4G. There is no pairing, no Bluetooth, no NFC, nothing that needs native code.
LocationNo. Browser geolocation is more than enough for “stations near me”.
Working offlineNo. With no connectivity there is no rental at all, because our server is what commands the eject. An offline app would be an app that cannot rent anything.
Push notificationsPartly — the one real advantage. But it matters for a single message, and SMS already carries that message on a channel we need whether or not an app exists.
A habit loopNo. This is an emergency purchase, not a routine. Nobody opens a power bank app; they notice a cabinet when their battery dies.
Store discoveryNo. Nobody has ever found a power bank service by browsing an app store. Discovery is physical.
PerformanceNo. Three screens and a running timer.

The car park proves the behaviour — that people here will scan a code and pay in their bank app to make a machine do something. China proves the business model, in this exact product category rather than a neighbouring one.

ShareCharge and Monster Charge — the two operators named in your own brief — do not run on installed apps. The overwhelming majority of their rentals happen inside WeChat and Alipay mini-programs: you scan the cabinet, the mini-program opens, you pay with the wallet already in that app, and the power bank ejects. No store, no download, no account creation. That is the arrangement the largest shared power bank market on earth converged on, in a market that had every resource to build apps instead — and it is the same shape as the car park barrier, and the same shape as what we are proposing here.
Where the Chinese model does not transfer. Their mini-programs sit inside a wallet that already knows who you are and already holds your money, so there is nothing to bind and nothing to verify. Mongolia has no equivalent super-app, which is why our version needs a phone number and a funding rail of its own — and why part six exists. The install-free entry transfers. The identity and payment layer underneath it has to be built.

Not instead of an app — before one

The page can be added to the home screen, and an installed progressive web app receives push on current iOS and Android. So the minority who do become frequent users can opt into an app-like experience without anyone being pushed through a store on a dying battery. A native build stays on the table for phase two, once there is volume and a repeat audience worth building it for. What we are proposing is a sequence, not a refusal — and the honest costs of taking it are set out in part twelve.

Part one

What talks to what

Five parts, three channels. The cabinet's 4G module is a dumb pipe: the MCU speaks 0xA8 hex frames over a serial line and the module tunnels them out unchanged. Every decision — which bank to eject, when an order opens, what it costs — happens in our backend.

USER OUR PLATFORM CABINET scans, binds a card Card / PSP vault · charge · capture Web + API orders · metering · SMS MQTT broker ours, or Alibaba IoT 4G module UART 0xA8 MCU + slots 4 of 6 slots filled scan · bind · status HTTPS paid / declined publish / subscribe MQTT / 4G /user/get · /update HTTP straight to us: return · telemetry · config · firmware
Two directions, two protocols. Commands go out to the cabinet over MQTT (red). The cabinet calls our HTTP endpoints directly for returns, 20-minute telemetry, boot config and firmware — it never goes through the broker for those.
Part two

Renting, step by step

The parking-gate pattern: scan, authorise, the thing opens. The user never installs anything and never has to come back to our page for the slot to release.

01

Scan the sticker

The phone's built-in camera opens /r/10005442. The id maps to the cabinet's IMEI in our database. No app, no store, no install prompt.

02

Phone number, then a card

The number is the account — how a returning customer finds their rental on any device, and how we reach them by SMS. The card is vaulted by the PSP; we never store it ourselves.

03

The first block is paid before anything moves

A real charge, not a reservation — it funds the first hour and proves the card works before a power bank leaves the cabinet. We considered pre-authorisation holds and dropped them: freezing the full buyout value to rent ₮2,000 of service would screen out most of the market, and in a debit-dominant one it would screen out the customers hardest. The first block is the screening step we can actually afford.

04

The webhook does the work

The PSP confirms the first payment and our server takes over. The user does not need to return to our page. Our backend publishes {"cmd":"check"}, reads the 0x10 frame listing every slot with its charge level, and picks the healthiest bank itself.

05

The slot opens

popup_sn goes down, the solenoid releases, the cabinet acknowledges with 0x31 and the meter starts. Target from payment to physical eject: under six seconds, with live status on the page so the wait never reads as a failure.

Phone browser Card / PSP Our backend Cabinet GET /r/10005442 rental page · nothing to install POST /rent · phone + card vault card · charge first block paid · card saved open the order {"cmd":"check"} 0x10 · every slot + charge % choose the healthiest bank popup_sn · "20010060" 0x31 · ejected page flips to “rental active” HTTP / HTTPS MQTT to the cabinet
Payment clears before the hardware moves. A dead card never gets a power bank, and the customer finds out while standing at the cabinet rather than an hour later. It is a weaker screen than a hold would be — it proves only that the first block was payable — but it costs the customer nothing they were not already spending.
Part three

Three screens, that is all

The whole customer-facing surface, shown in Mongolian as the customer would see it. Your own email calls the product «Повер банк», so the product name is yours to set.

1 · SCAN СТАНЦ 10005442 Цэнэглэгч түрээслэх Сул үүр: 6 / 8 Цагт ₮1,000 Үргэлжлүүлэх Апп татах шаардлагагүй. 2 · AUTHORISE Утасны дугаар 9911 2233 Картын мэдээлэл •••• •••• •••• 4242 Эхний цагийн ₮1,000-ыг одоо төлнө. Түрээслэх Цаг тутам ₮1,000 хураана. 3 · GO ИДЭВХТЭЙ Түрээс идэвхтэй 01:23:45 Өнгөрсөн хугацаа Хураасан дүн ₮2,000 Өдрийн дээд хязгаар ₮8,000 Дурын станцын сул үүрэнд хийж буцаана уу.
The figures on these screens are illustrative. ₮1,000 an hour, an ₮8,000 daily cap and a ₮25,000 buyout are placeholders for the shape of the model — real numbers come from the client's unit economics.
Part four

Returning takes no screen at all

The customer pushes the bank into any free slot in any station and walks away. The cabinet recognises the bank by its own serial number and tells us — we already know whose order that serial belongs to. Nothing to scan, nothing to type, nothing to open.

The engineering catch: there are three independent ways an order can reach “closed”, and they can arrive late, out of order, or twice. Everything funnels through one idempotency gate keyed on the bank's serial and the open order. Get this wrong and you either bill people who returned on time or lose revenue on people who didn't.
power bank No scan. No app. push into any free slot ANY STATION reads SN 20010060 normal · instant HTTP /order/return return failed MQTT 0x40 · status ≠ 01 MQTT 0x28 · self-test every 15 min · catches silent inserts Idempotency gate dedupe on (SN, open order) late + twice = safe Order closed meter stops final amount settled returned ok return failed self-test sweep
The third path is the one nobody plans for. A bank can be physically sitting in a slot without the cabinet having registered it. The 15-minute self-test catches those and closes the order retroactively — which is exactly why the gate has to tolerate a close arriving long after the fact.
Part five

Money, and why the meter must stay funded

Two instruments are ruled out rather than chosen. A refundable deposit, because taking a returnable balance means holding customer funds — Mongolbank licensing territory, plus refund operations forever. And a pre-authorisation hold, because freezing the value of a power bank to rent an hour of one would screen out most of the market. What remains is prepayment: pay the first block, then keep paying as you go.

The chart below shows how the mechanism behaves, not what it should cost. Every figure on it is a dial — part eight lists them.

₮25,000 ₮8,000 ₮0 first block paid before the slot opens — nothing is reserved or frozen ₮1,000 captured each hour small charges clear against thin balances daily cap reached — the meter idles 24 ч · buyout ₮25,000 the bank is theirs, the order closes itself 0 ч 4 ч 8 ч 12 ч
Illustrative figures. Two things make this work: captures are small and frequent rather than one settlement at the end, so each one clears against a thin balance; and both the day and the rental have a ceiling. Money only ever moves one way — nothing is reserved, nothing is refunded, and there is no float to hold.
Part six

Why we sell credits

QPay is what Mongolians actually reach for, and it is a one-time invoice rail: it raises a charge the customer approves now, and it cannot charge them again later — no recurring, no one-click. SocialPay is the same shape.

So a metered rental on that rail would mean raising a fresh invoice every single hour and asking the customer to approve each one in their banking app. Nobody would tolerate that, and it would multiply our transaction fees by the length of the rental. Credits invert the order. The customer authorises once, buys a balance, and the meter draws it down. One approval, many hours.

CARD PATH · TOPS ITSELF UP Bind a card vaulted by the PSP Pay ₮1,000 first block, up front Capture ₮1,000 each hour QPAY PATH · PREPAID Buy 5 credits one QPay approval Balance: 5 spent down hourly Spend 1 credit each hour The meter runs one credit or ₮1,000 per hour funding fails A decline and an empty balance are the same event the meter stops immediately buyout price fixed, SMS sent return still accepted, silently
Two ways to fund the same meter. Both are prepayment; the only real difference is that a saved card renews itself without asking, while credits need a deliberate top-up. Everything downstream, including what happens when the money runs out, is one code path.
Why credits and not a wallet balance. Under Үндэсний төлбөрийн системийн тухай хууль 5.1.23, a «төлбөрийн хэрэгсэл» is an instrument designed for moving or receiving money (source). And article 35.2.4 requires that electronic money be freely convertible back into money (source). A credit that only ever buys rental hours from us moves no money and converts to nothing — so it reads as neither. That inference wants a lawyer's confirmation, and both clauses should be re-checked at source, but it is the difference between a product and a licence application.

Non-refundable, non-transferable, single-purpose

All three, or the argument collapses. Allow cash-out and the credits become convertible; allow transfers between users and they become an instrument for moving money. Either one turns a rental product into electronic money and puts a Mongolbank licence on the critical path.

What credits fix

  • The charge-later problem. One approval funds many hours. This was the blocker on the QPay rail, and it is gone.
  • Transaction fees. One QPay invoice instead of one per hour — real money at volume.
  • A better prepay ratio. ₮5,000 collected upfront rather than ₮1,000.
  • Breakage. Unused credits are revenue that was never dispensed against.
  • Familiarity. Buying units needs no explaining here.

What credits do not fix

  • They are not collateral. ₮5,000 against a ₮20,000 power bank is still three-quarters uncovered — better than the ₮1,000 case, not solved.
  • Nothing here is collateral. With holds ruled out, no rental on either rail is secured — the prepay is simply the part of the loss already recovered.
  • The minimum is a barrier. Someone who needs one hour is being asked to buy five.
  • Non-return still costs the full asset, minus whatever they had prepaid.
Minimum

Frame it as value, never as a minimum or a deposit — «₮5,000, таван цаг, хэзээ ч ашиглана» reads completely differently from «доод хязгаар». And price bulk cheaper: ten credits for the price of eight raises the average prepay while landing as a discount rather than a bigger barrier.

Expiry

No expiry leaves the liability on the books forever; a short one invites a consumer-protection complaint and burns goodwill. Twelve months, disclosed plainly, is the defensible middle.

Accounting

Unused credits are deferred revenue, not income — a liability until consumed or expired. The accountant needs this before launch, not at year end.

eBarimt

Is the receipt issued when credits are bought, or when an hour is spent? Selling credits is arguably selling a voucher rather than a service, and the two treatments imply completely different integrations. This one changes what we build, so it goes to the tax side first.

Part seven

When the funding stops

Roughly half of all failed charges are insufficient-funds soft declines — the card is valid, the customer is not disputing, the money just was not there at that moment. This is the ordinary case, not the edge case, and the design has to assume it. An exhausted credit balance is the same event by another name.

Here is the scenario that matters. Someone rents at ₮1,000 an hour. The first hour is funded. An hour later the card declines, or the credits run out. They forget about it and return the bank two days later. What happens next depends entirely on one design decision.

If the meter is a debt ledger what we drew first — the number grows against a card we already know is dead 0 ч ₮1,000 ok 1 ч funding fails meter keeps running balance climbs to ₮40,000 48 ч bank returned ₮40,000 owed ₮0 collectable a number in a database If the meter only runs while funded the first decline stops the clock and converts the rental into a fixed offer 0 ч ₮1,000 ok 1 ч · funding fails meter stops, SMS sent nothing accrues buyout stands at ₮25,000 48 ч returned, no questions real loss ≈ ₮5,000 two days of one unit hardware recovered
The same customer, the same behaviour, two very different balance sheets. The ₮40,000 was never revenue — it was a number growing against a card that had already failed. Stopping the meter at the first decline turns an uncollectable receivable into a small, real, bounded cost.
01

Stop the meter the moment funding fails

Never bill time against a card that has already failed or a balance that is already empty. On the first failed hour the clock stops, the rental converts to a fixed buyout, and an SMS goes out immediately: return within six hours or the price becomes ₮25,000.

02

On the card path, retry on days 3, 5 and 7 — not immediately

Soft declines recover when a salary lands. Spaced retries recover 15–20% of them silently, with no customer contact at all. Retrying instantly recovers nothing and burns the card's risk score. On the credit path there is nothing to retry — the SMS asks them to top up instead.

03

Gate the phone number, do not chase the debt

An unsettled balance blocks that number from renting again. It costs nothing to build and stops the pattern repeating. Pursuing an individual for ₮25,000 costs more than it recovers — that money is gone, and the model has to survive it.

Never let the debt gate discourage a return

If someone who has defaulted thinks that coming back to a station means a confrontation, they keep the bank — and a ₮5,000 problem becomes a ₮25,000 one. Accept every return silently, always, then deal with the balance. The system is optimised to recover hardware, not to maximise billed hours.

Part eight

The dials, and whose they are

Everything above is mechanism: how money is authorised, when the meter runs, what happens when it stops, how an order closes. None of it fixes an operating price. The table below is every commercial parameter the system exposes, what it controls, and what it trades against — we build all of them configurable, and none of them is ours to choose.

DialWhat it setsWhat it trades
First block sizeWhat is paid before a power bank is dispensed — the only screening step there isLoss already recovered against conversion at the cabinet
Hourly rateRevenue per hour of rentalVolume against margin, and against the loss rate it has to absorb
Daily capThe most a rental can accrue in 24 hoursRevenue on long rentals against how alarming the running total gets
Buyout priceWhat an unreturned bank earns instead of coming homeToo low and it is cheap to keep; too high and it reads as a penalty
Buyout windowWhen a rental stops being a rental and becomes a saleHardware recovered sooner against customers who are merely slow
Credit minimumSmallest QPay top-upPrepay ratio against first-rental conversion
Bulk discountWhether ten credits cost less than ten times oneAverage prepay up, revenue per credit down
Credit expiryHow long an unused balance survivesBreakage revenue against goodwill and complaint risk
Rails offeredCard, QPay credits, or bothReach against recovery — a saved card keeps paying, credits stop dead
Rate differentialHow much cheaper the card path is than the QPay oneThe only lever that moves customers onto the rail that renews itself
Trust tiersWhether return history earns better termsRetention and loss reduction against build cost — a later feature
Venue shareWhat the café or venue receives per rentalSite acquisition against unit margin, usually the largest line
What is not a dial. Four things in this document are constraints rather than preferences, and they do not move with the business model: the meter must not run against failed funding; every path into “order closed” goes through one idempotency gate; a return is always accepted silently, whatever the customer owes; and credits stay non-refundable and non-transferable or they become electronic money. Those are engineering and legal boundaries. Everything in the table above sits inside them.
Part nine

How the rest of the world prices the worst case

Reference for the dials above, not a recommendation. Every operator converts an unreturned bank into a sale rather than chasing it — only the window and the number differ, and the spread between them is wide enough to show there is no single right answer.

OperatorWindowConverts to
Full Charge1 day$20, keep it
Brick5 daysfull rental + purchase fee, capped at €50
Nakion lossmaximum rental + €20 non-return fee
Chargebaron loss$75
Just Attend24 hoursforfeits the £25 deposit
Recharge.city31 days$99 replacement value
China is the exception we cannot copy. Most Chinese operators dropped deposits entirely, using a Zhima Credit score above 600 as the collateral instead. Mongolia has no consumer credit score usable at the point of rental — and with holds ruled out on conversion grounds, no collateral of any kind is available to us. That is a deliberate trade: the buyout price and the loss rate carry the whole risk, and both belong in the client's model rather than ours.
Part ten

The vendor stack

Three contracts carry the parts we do not build ourselves. Bonum resolves what had been the critical-path unknown: recurring card payments are available in Mongolia, which means the card path is buildable rather than hypothetical.

ProviderWhat it carriesCostStatus
Bonum Recurring card payments alongside QPay — the whole card path depends on it 1% of every transaction available
Skytel Web2SMS Outbound only, and only for messages that protect money ₮25 Skytel
₮55 other networks
available
Verify.MN Inbound OTP — the customer texts us, so the customer's carrier bills them, not us ₮0 outbound not integrated yet
eBarimt One receipt at close on the card path; one at top-up on the credit path in-house we build it
M2M SIM One data SIM per cabinet, 24/7 — telemetry every 20 min plus MQTT keepalive per station, monthly not budgeted
cloud.mn Backend, database, MQTT broker, firmware storage for OTA — priced in part eleven from ₮164,065 pending Alibaba answer
Map tiles The station map free on OSM avoid Google
Two questions for the Bonum contract before it is signed. First, is there a fixed component per transaction, or only the 1%? A pure percentage is indifferent to how often we capture; a fixed fee of even ₮50 turns hourly captures into a 5% cost on a ₮1,000 charge and forces us to capture in blocks instead. Second, confirm that a saved card can be charged again without the customer present and without a fresh approval each time. That is the one capability the card path actually depends on — we are not using authorisation holds, so recurring charging is doing all the work.

Card fields must be Bonum's, never ours

If the customer types their card number into a form we host, the client inherits full PCI DSS scope — audits, scanning, and a compliance burden entirely out of proportion to this project. A hosted field or redirect from Bonum keeps it at the minimum tier. This is a contract requirement, not an implementation preference, and it needs confirming before we quote the payment work.

Receipts follow the money, not the hours

On the card path, the amount is not known until the bank comes back — so one receipt at close, for the total. Eight hours at ₮1,000 becomes a single ₮8,000 receipt when the order closes, however many times the card was captured along the way. On the credit path, money changes hands at top-up and nowhere else, so the receipt is issued there and consuming an hour is not a taxable event. One receipt per transaction on both rails, and never one per hour.

SMS is for messages that protect money — nothing else. No confirmations, no marketing, no coupons: those live on the web page the customer already has open. That leaves the funding-failure notice, which pays for itself, and at most one buyout reminder. Two further economies matter. Move the registration OTP to Verify.MN, where the customer sends the message and their own carrier bills them — inbound also proves they hold the SIM, which is stronger evidence than a code they merely received. And write short Mongolian: Cyrillic forces UCS-2 encoding, so a single SMS segment is 70 characters rather than 160. A chatty ₮55 message that runs to three segments costs ₮165. Confirm with Skytel whether they bill per segment or per message before writing a single template.
OTP gate

The debt gate only works if the phone number is real, so verification is load-bearing rather than optional. Verify once at account creation, never per rental. It stays a soft gate regardless: a new SIM defeats it. It raises the cost of evasion from nothing to the price of a SIM, which handles the casual case and nothing more.

Chargebacks

The card path introduces disputes, which QPay never had. Ask Bonum for the chargeback fee and the evidence process — our defence is the cabinet's own telemetry, which is unusually strong: we can show the exact second a specific serial was dispensed and returned.

Venue share

Power bank rental normally pays the café or venue a cut of revenue. The client's brief asks for revenue reports but never mentions a venue split, and it is usually the largest single line in the model. If they intend to pay one, the admin has to calculate, report and reconcile it per station — that is real scope nobody has priced.

On-call

Cabinets fail at night. Monitoring, alerting and someone who answers is recurring operational cost, not a build item — and it is the honest answer to their question about post-launch support.

Part eleven

Servers, and the two URLs that can never change

The workload is genuinely small. A hundred cabinets produce one telemetry post every twenty minutes each and a handful of MQTT messages per rental — thousands of requests a day, not millions. Nothing here needs scale.

Availability is the constraint, not capacity. If the backend is down nobody can rent anything, anywhere, and cabinets that cannot reach us reboot themselves on the nine-minute heartbeat. That argues for a managed database with real backups and more than one application instance — not for a bigger box.

Latency is a product feature here. We promised under six seconds from payment to eject, and that budget is spent on round trips: webhook in, check out, 0x10 back, popup_sn out, 0x31 back. The cabinet's own 4G leg adds 100–300 ms per hop and we cannot control it. Hosting in Mongolia costs single-digit milliseconds per hop; Singapore costs eighty. Local hosting buys headroom for the part we cannot fix — which is why this decision waits on the factory's answer about whether we may run our own MQTT broker.
FROZEN AT PRINTING QR sticker on every cabinet tsen.mn/r/10005442 what the customer's camera opens Rental web page our front end FROZEN AT THE FACTORY Firmware flashed at production api.tsen.mn/api/iot/client/con what the cabinet dials home to Our HTTP endpoints auth · return · config · OTA Changing either one means physically touching every cabinet in the fleet
Both URLs are hardware, not configuration. One is printed on stickers, the other is burned into firmware at the factory — and a cabinet that cannot reach its base URL cannot be reconfigured remotely to point somewhere else, because reconfiguring it is exactly what that URL is for.
LineSpecificationPer month
cloud.mn Cloud 32 vCPU · 4 GB · 100 GB SSD · 1 IP — the launch box₮164,065
cloud.mn Cloud 44 vCPU · 8 GB · 100 GB SSD · 1 IP — the scale-up, when the fleet grows₮239,305
cloud.mn Cloud 21 vCPU · 2 GB · 50 GB SSD · 1 IP — staging and standby₮84,645
Domain · .mn₮165,000 per year, VAT included₮13,750
Domain · .com$10.44 per year at cost via Cloudflare≈ ₮3,000
Snapshots + backupcloud.mn bills these separately — mandatory, not optionalnot yet priced
M2M SIMone per cabinet, scales with the fleetnot yet priced
Start on Cloud 3, resize later. cloud.mn lets you change resources on a running instance, so there is no reason to buy Cloud 4 on day one — ₮164,065 covers the app, PostgreSQL, the MQTT broker and Redis comfortably for the first year of a modest fleet. Prices read off the cloud.mn calculator on 2026-09-08, VAT included, at ₮836 per GB of SSD and ₮5,225 for the first IP. The .mn premium is not the decision it looks like: ₮165,000 a year is ₮13,750 a month against ₮164,065 of hosting, so choose the domain on trust and brevity rather than price. One note of timing — Verisign raises the wholesale .com fee on 1 November 2026, taking Cloudflare's at-cost price from $10.44 to about $11.15; registering before then holds the lower rate for one more year.
Ownership

The domain must be registered to the client, not to us. It is printed on their hardware and burned into their firmware — if they ever change developers, the stickers have to keep working. Register for ten years and set it never to lapse; an expired domain here does not degrade the service, it stops the entire fleet.

Length

Short is not vanity. A longer URL makes a denser QR code, and a denser code scans worse on a small sticker, at an angle, in dim café lighting — which is the only condition it will ever be scanned in. Scanning is the entire funnel, so the domain length is a conversion decision.

Separation

Keep the customer host and the device host apart from day one, even on the same domain. They have different uptime profiles, different traffic shapes, and one of them can never be touched again.

Where

Alibaba only if the factory says the firmware pins it. Otherwise Mongolian hosting for the latency, with the database backed up somewhere that is not the same machine — the single-copy backup problem we have hit before.

Part twelve

What this buys, and what it costs

What this buys us

  • No download. The single biggest drop-off in power bank rental disappears. This is the model that actually won China — mini-programs, not apps.
  • No App Store review standing between a fix and the customer. We ship on our own schedule.
  • No float, no deposit balance, so no Mongolbank licensing question and no refund operations.
  • Both payment habits served. Card for the customers who will bind one, QPay credits for everyone else — same meter underneath.
  • Bounded downside. Funded metering means the worst case is one power bank, not an unbounded receivable.
  • It plays to what we already do. Web, payments and eBarimt are our home ground.

What it honestly costs

  • Nothing is collateralised, on either rail. Holds were the only instrument that would have secured a rental, and they were dropped because the conversion cost is worse than the loss they prevent.
  • So the loss rate is the business risk, priced into the hourly rate and watched from day one. Nobody knows what it is in Mongolia until there is a fleet running.
  • No push notifications. Chasing an overdue bank means SMS, with a real per-message cost and a gateway to wire up.
  • Discovery is weak. Nobody browses to a website to find a power bank; you find one by seeing a station.
  • No store listing, which some clients want as a credibility asset for landlords and investors regardless of use.
  • It is not what they asked for. Their brief says iOS and Android, so this is pitched as a better option, not slipped in.
Part thirteen

The operations console

The brief asks for four things: station status, reports, configuration and coupons. That describes a dashboard. Running a fleet needs an operations tool — a dashboard tells you something is wrong, operations lets you fix it, and the distance between the two is most of this build.

The largest gap in the brief is that it tracks stations and not power banks. The banks are the asset, the inventory and the entire loss exposure. Each one has to be a first-class object with a serial, a location, a cycle count, a health reading and a state — and the single most important screen in the whole system is the list of banks that are out, sorted by how long they have been gone.

In a slot fully visible Out completely dark Overdue clock only Bought out written off popup_sn time passes buyout returned to any station — the serial identifies itself on insert returned weeks late — the 15-minute self-test still recognises it and puts it back in service Every transition is an event or a clock. None of them is a location.
There is no GPS, and it would change nothing if there were. Nobody drives across the city to repossess a power bank, so location was never going to drive a decision — elapsed time is. The fleet is also self-healing on inventory: a bank inserted anywhere announces its own serial, and the self-test sweeps every cabinet, so the only banks the system ever loses are the ones that never come back at all.

Fleet

  • Every bank as an object — serial, current slot or open order, cycle count, health, state.
  • Banks out, sorted by age. The most-used screen in the system.
  • Slot-level faults — jammed, charging abnormal, comms failure, Type-C short, return failed. A dead slot is silent lost revenue.
  • Bank health and retirement, from the charge, voltage and temperature the cabinets already report.
  • Station full. Every slot occupied means nobody can return there — a customer-facing failure that looks healthy on a status board.
  • Firmware and OTA rollout, with the ten failure codes the protocol documents.
  • Provisioning — IMEI to QR sticker to venue to config profile.

Operations

  • Alerting that pushes, not a board someone has to be watching at 2am.
  • Rebalancing. Banks pile up at some stations and drain at others — moving them is the daily job of running this business.
  • Manual override — force-eject, force-close an order, mark a bank lost, issue a refund.
  • Customer lookup and rental history. Support's most-used screen from week one.
  • Stuck orders, visible and fixable rather than silently wrong.
  • Audit log of every override, refund and price change, attributable to a person.

Money

  • Daily reconciliation of our orders against Bonum's settlement. The control that catches leaks, and the thing most likely to break.
  • eBarimt receipt status with a retry queue, because receipts fail.
  • Chargeback evidence packs — serial, second, cabinet, telemetry. Our defence is unusually strong; the console has to produce it.
  • Venue statements and revenue-share calculation, per station, per month.
  • Per-station P&L and utilisation — how they decide where to expand and what to close.
  • Non-return rate and write-offs. The single number the whole model rests on.
  • The dials from part eight, editable globally and per station. Coupons and promotions sit here too.

Access

  • Roles — owner, operations, support, finance.
  • Venue partners get a read-only view of their own site and nothing else.
  • Every destructive action attributable to a named person, permanently.
One state transition worth designing deliberately: a bank returned after it has already been written off. The self-test will find it and report it like any other insert, so the console has to accept it, return it to service, and decide what the customer is owed — a policy question rather than a technical one, and therefore another dial. It will happen more often than anyone expects.
Part fourteen

The part that is not software

This is worth saying plainly before anyone signs anything: a power bank network is a logistics business with a software layer, not a software product with some hardware attached. Every station is a physical object in somebody else's building. The console we build makes the work visible and efficient; it does not remove any of it.

The division is clean and it belongs in the contract. We build and run the software. Everything below is the operator's, and most of it needs a person in a vehicle.

CONTINUOUS software telemetry alerting metering receipts closing orders DAILY people rebalancing run customer support check the reconciliation WEEKLY people clear jammed slots swap tired banks out check the QR stickers MONTHLY people pay the venues review each site review the dials order stock
Only the top band is automatic. Everything below it needs a person, and the daily band needs one every day — which is why the console should output a rebalancing route rather than a list, and why alerting has to reach somebody rather than wait on a screen.

Physical work

  • Rebalancing runs. Banks pile up where people end their day and drain where they start it. Somebody drives a route, empties the full stations, fills the empty ones. This is the job, and in a dense area it is more than once a day.
  • Clearing jams and faults. A slot reporting jammed or a failed return is dead revenue until a person opens the cabinet.
  • Swapping tired banks. The console flags a bank that no longer holds charge; removing it and putting a fresh one in is manual.
  • QR stickers. A peeled or scuffed sticker earns nothing, and nobody reports it — the station simply goes quiet. Checking them is a real task.
  • Commissioning and decommissioning stations: install, power, bind, fill, and retrieve when a venue closes.

Commercial and support

  • Venue acquisition. Signing cafés, malls, hospitals and terminals, negotiating placement, power and the revenue share.
  • Venue relationships. The manager who unplugged the cabinet because it was in the way needs someone to call.
  • Customer support in Mongolian, covering evenings and weekends — which is exactly when people rent and exactly when developers are not working.
  • Refunds and goodwill, which are judgement calls, not rules.
  • Chargeback responses. The console assembles the evidence; a person still submits it before the deadline.
  • Procurement and imports — banks, cabinets, spare movements, M2M SIMs, and the customs that come with them.
Winter is an operational input, not a detail. Lithium cells lose a large part of their usable capacity in the cold, and charging them below freezing damages them permanently. That argues for indoor placement only, and for expecting a seasonal rise in “this bank was already flat” complaints that is chemistry rather than a fault. Rebalancing runs are also simply harder at minus thirty. Any plan for outdoor or semi-heated sites should be tested with a few units through one winter before it is committed to.

Someone has to answer at nine on a Saturday evening

Rentals peak when offices are shut. A station that jams on Friday night stays jammed until Monday unless somebody owns weekends, and a customer whose bank did not eject will not wait two days to be told why. This is a staffing decision that has to be made before launch rather than discovered after it — and it is the honest answer to the question in the brief about post-launch support.

Part fifteen · optional

The card reader, for the phone that is already dead

Everything above assumes the phone still works well enough to open a camera and load a page. At zero percent it does not — and that person wants a power bank more than anyone else in the building. Every competitor running an app or a QR code alone loses them completely.

A payment terminal on the cabinet closes it. Make a selection, tap a card, take a power bank. No phone involved at any point.

AT THE CABINET · NO PHONE Phone at 0% nothing to scan Terminal: choose a block, tap card Anonymous order anchored on the SN The slot opens same popup_sn Receipt prints a claim code hours later — the phone comes back to life RECONCILIATION · OPTIONAL BUT REWARDED Opens the URL from the receipt Enters the code and a phone number The order gains an identity Unused block becomes credit on the account
The order is never missing, only anonymous. We always know which serial left which cabinet at which second, so a terminal rental is a complete order from the moment it ejects — reconciliation attaches an identity to a record that already exists, rather than creating one late.
The terminal changes nothing behind it. It is a second front end onto the same backend: the terminal takes payment, calls our API, and our server publishes the same popup_sn it publishes for a web rental. The cabinet never learns a terminal exists, so nothing in the supplier's protocol has to support it. Card handling also stays inside the PSP's certified hardware, which keeps PCI scope further away than our own web card fields do.

Do not extend credit to someone you cannot contact

An anonymous customer cannot be messaged, gated or chased. So the terminal should sell a fixed block priced at or above what a power bank costs the operator — then a bank that never comes back is not a loss, it is a sale that already settled. Claiming the receipt converts the unused portion into account credit, which makes the premium read as fair and gives the customer a reason to reconcile. The pricing problem and the identity problem answer each other.

Why it is worth proposing

  • It serves the one customer nobody else can. App-only and QR-only competitors lose a dead phone entirely.
  • It is physical, so it is hard to copy. A software feature is matched in a sprint; terminals across a fleet are capex and integration.
  • It is a leasing argument. “Our stations work even when your customer's phone is dead” lands with airports, terminals and hospitals — the sites worth winning.
  • Highest intent there is. A fully dead phone is maximum willingness to pay.

What to weigh honestly

  • The segment may be thinner than it looks. People are usually with someone, and any phone can rent — a friend scans and the rental attaches to their number.
  • So it may be worth more as a message than as volume, which is a legitimate reason to build it, as long as everyone knows which one they are buying.
  • Terminals are capex plus a SIM plus maintenance, so this is not fleet-wide. It belongs where dead phones concentrate.
  • We do not yet know whether Bonum has a terminal we can drive programmatically. Most are closed; an Android smart-POS running a small app is the usual route here.
Cheaper pilot

Before buying terminals: the venue already has a card machine. Staff sell a rental as a line item and trigger the eject from a simple page. Almost no hardware cost, works today, and it gives the venue a reason to care — at the price of staffed hours only and a more tangled revenue share. It answers whether the demand is real before anyone spends capex.

Pricing

Premium block with credit back on claim, or the ordinary rate with the risk absorbed? The first makes non-return a non-event; the second is friendlier and simpler to explain, but extends credit to precisely the customer who cannot be chased.

Scope

Phase two across selected sites, or one flagship station inside phase one as a demonstrator? Proposing it does not commit anyone to building it.

Part sixteen

How we would build it

Every phase ends in something you can watch happen, not in a status report. Those demonstrations are the payment triggers, which means the risk of a phase sits with us until it visibly works.

And the riskiest work goes first. The usual instinct is to build the app early because it is the visible part; here the genuine unknown is a Chinese cabinet responding to our commands, so that is what we prove in week three rather than month four.

0 · Discovery 1 · Rental loop 2 · Payments 3 · Console 4 · Money 5 · Pilot 6 · Handover a working paid service · ~week 17 week 0 8 16 24 32 Indicative only. These durations firm up at the end of discovery, which is the point of having one.
The console overlaps payments deliberately. Once the order model is settled at the end of phase one, console work can run alongside payment work without either blocking the other — which is where the schedule has its only real compression.
PhaseWhat gets builtThe demonstration that ends it
0 · Discovery
2–3 weeks
Factory answers, Bonum terms, the lawyer's view on credits, one cabinet and a handful of banks in our hands, and a protocol spike against real hardware. A power bank physically ejects from a command our server sent. Everything after this is priced against knowledge instead of a machine-translated PDF.
1 · Rental loop
6–8 weeks
Backend core, the full frame parser, MQTT broker, device auth, config and firmware endpoints, the order state machine and its idempotency gate, one station, the web app, one payment rail. Somebody off the street rents a power bank and returns it, paying real money. The most important milestone in the project.
2 · Payments
4–6 weeks
Both rails, credits, funded metering, decline handling and retries, daily cap, buyout, the debt gate, Skytel SMS, Verify.MN OTP, eBarimt on both paths. A rental whose funding fails behaves correctly — meter stops, SMS goes out, buyout fires, the return is still accepted — and both paths produce a correct receipt. The failure case is the test, not the happy path.
3 · Console
5–7 weeks
Bank and station inventory, slot faults, alerting, the rebalancing view, overrides, customer lookup, audit log, roles, provisioning, firmware rollout. Your team runs a full day without calling us. Find an overdue bank, force-close an order, clear a fault, commission a station — all unaided.
4 · Money
4–5 weeks
Bonum reconciliation, eBarimt status and retries, chargeback packs, venue statements and revenue share, per-station P&L, utilisation, loss reporting, the dials, coupons. A month closes cleanly. Reconciliation balances against Bonum, venue statements generate, and the non-return rate is a number on a screen rather than a guess.
5 · Pilot
4+ weeks
Not a build phase. A limited set of stations live with real customers, watched closely, tuned and fixed. The loss rate is measured rather than assumed, and the dials have been moved at least once because of what the data said. This is where the business model is tested, and its length is calendar time that cannot be compressed.
6 · Handover
2–3 weeks
Fleet-wide rollout support, Mongolian administrator documentation, training sessions, a support runbook, monitoring handed over. Your team operates it and we move to a support contract rather than being the only people who understand it.

Do not accept a fixed price before phase zero

Any studio quoting a firm number for this today is guessing, including us. The document we were sent is a 137-page machine translation from 2022, the factory has not answered whether we may use our own MQTT broker, and no signing secret appears anywhere in it. Discovery is small, paid, and ends with hardware responding to us — after which a fixed price for the rest is honest. That protects both sides, and it is the single strongest reason to start now rather than after the rest of the contract is negotiated.

What you own at the end

  • The source code, in your repository, under your account.
  • Every third-party account in your name — cloud.mn, the domain, Bonum, Skytel. We configure them; you own them.
  • A running deployment on your infrastructure, with backups and monitoring in place.
  • Mongolian documentation for the console, written for operators rather than developers.
  • A support runbook — what to do when a cabinet drops off, a slot jams, a payment fails, a customer disputes.
  • Training for the people who will actually run it.

What moves the dates

  • Factory response time. Several answers only they can give, and they are in another country and another language.
  • Hardware arriving. Phase zero cannot finish without a cabinet in the room.
  • The Bonum contract, which gates the card rail entirely.
  • The pilot's length, which is calendar time. Four weeks of real customers cannot be done in one week of effort.
  • Winter, if the pilot lands in it — worth planning for deliberately rather than discovering.
The number

What it costs

Phase 0 · Discovery
₮4M
₮4,000,000, fixed. Two to three weeks, ending with a power bank ejecting from a command our server sent. Payable on signature.
Phases 1–6 · Build
₮60–67M
Indicative today, firm after discovery. The range exists because nobody can price the device protocol honestly until it has run against real hardware.
Бүх үнэ НӨАТ ороогүй болно. · All prices exclude VAT. VAT is added where applicable, at the rate in force on the date of invoice.

Your brief asked for the cost split by design, frontend, backend and integration. That is the same total sliced a second way — every figure below is included in the range above, not additional to it.

AreaWhat it coversShare of the build
DesignThe customer journey, the three rental screens, and the operations console — which is the larger design problem of the two.₮6M
FrontendThe rental web app, and the console interface: fleet, banks, faults, orders, reporting.₮16M
BackendOrder engine and idempotency, funded metering, credits, the debt ledger, reconciliation, reporting, roles and audit.₮24M
IntegrationThe device protocol and MQTT infrastructure, Bonum, eBarimt on both paths, Skytel and Verify.MN.₮17M
Pilot & handoverLive operation with real customers, documentation in Mongolian, training, runbook.₮4M

And the recurring costs, which your brief also asked about. These are separate from the build and continue after it.

RecurringWhat it isPer month
InfrastructureBilled at cost, in your own cloud.mn account. Cloud 3 to launch; Cloud 4 when the fleet justifies it.₮164,065
+ ₮13,750 domain
Support · standardBusiness hours. Bug fixes, monitoring, updates, and the people who answer when something breaks.≈ ₮1,800,000
Support · on-callEvenings and weekends, which is when rentals actually peak and when a jammed station otherwise waits until Monday.from ₮2,500,000
Third-partyBonum at 1% of transactions, Skytel at ₮25–55 per message, M2M SIMs per cabinet. Paid directly by you.at cost

Not included in the range

  • Cabinets, power banks and their import. Hardware and customs are yours.
  • M2M SIMs and their monthly plans, one per station.
  • The card reader option in part fifteen — priced separately if you want it.
  • A native app, if you decide you want one after launch rather than instead of it.

One item still to place

  • The factory binding tool and the phone line-test tool. The supplier's own document puts both on the software developer, and your production line needs them before the first batch is assembled.
  • They are small, but they are not in any phase yet. Discovery is where we size them and decide whether they join phase one or stay out of the number.
Payment follows the demonstrations, not the calendar. Each phase invoices when the milestone in the table above has actually been shown to work, which means the risk of a phase running long sits with us rather than with you. Discovery is the exception and is payable on signature, because its entire purpose is to spend a small amount finding out what the rest should cost.
Part seventeen

When it pays for itself

One number carries this: net contribution per rental. Divide the investment by it and you have the number of rentals needed. Everything else is only how quickly those rentals arrive.

A station is one cabinet holding many banks. The supplier makes 4, 6, 8, 12, 16 and 20-slot models, so fifty stations at eight slots is around four hundred slots and perhaps four hundred and fifty banks, since some are always out with a customer and some need charging time after they come back. The consequence matters more than the arithmetic: an eight-slot cabinet with three-hour rentals could physically turn over sixty rentals a day. At three, it is running at roughly five percent of capacity. Demand is the constraint, not hardware. Two cabinets in one café earn what one earns, a twenty-slot unit in a quiet street earns what a six-slot unit would, and every extra rental comes from being somewhere busier. Buy the smallest cabinet each site justifies and spend the difference on more sites.

Your assumptions

Cost assumptions

Revenue each month
₮0
0 rentals
Profit each month
₮0
₮0 net per rental
Profit each year
₮0
after every running cost
Everything repaid
software and hardware
Cumulative cash position over thirty-six months, for the software build alone and for the software and hardware together.
Software build only Software and hardware together Above the line means the investment is repaid.
What the calculator assumes so you do not have to enter it: Bonum at 1% of every transaction, ₮15 of SMS per rental, ₮25,000 to replace a bank that never comes back, and monthly running costs of ₮180,000 for infrastructure, ₮1,800,000 for support, ₮10,000 per station for its SIM, and one operations person per seventy-five stations at ₮2,000,000 all in. Change the sliders and every figure moves with them.

Two numbers nobody knows yet

Rentals per station per day, and the share of banks that never come back. Every figure above rests on those two, and neither can be known for Mongolia until real stations run with real customers. That is precisely what the pilot in part sixteen exists to measure, and it is why measuring them before buying a hundred cabinets is worth far more than it costs. If the supplier has utilisation figures from comparable markets, they are worth asking for.

Before we quote

Still open

None of these are dealbreakers, and Bonum has removed the biggest one. What remains are contract terms and configuration — answers that move the number rather than the design.

Lawyer

Confirm the credit argument: that a non-refundable, non-transferable, single-purpose credit is neither a «төлбөрийн хэрэгсэл» under 5.1.23 nor electronic money under 35.2.4. And check separately whether consumer-protection law obliges us to refund unused prepayments on demand — if it does, the whole structure inverts.

Tax

Confirm the receipt split — one at close on the card path, one at top-up on the credit path — and how a buyout is classified, since an unreturned bank is a sale of goods rather than a service. And whether VAT is owed on a supply that was made but never paid for.

Verify.MN

Which carriers does inbound cover, and does the sms: pre-fill work on both iOS and Android? The two platforms disagree on the URI syntax, and if the composer does not open pre-filled the friction is real.

Skytel

Billed per message or per 70-character Cyrillic segment? It decides how the templates get written.

Client

The domain — theirs to own, ours to configure. Short, registered for ten years, and chosen before a single sticker is printed or a single cabinet is flashed.

Bonum

Can a saved card be charged repeatedly without the customer present? Everything on the card path rests on it, since we are not using holds.

Bonum

Fee structure: purely 1%, or is there a fixed component per transaction? The answer sets how often we can afford to capture.

Bonum

Do response codes separate soft declines from hard ones? Without that, retry logic is guesswork — hammering dead cards and abandoning recoverable ones.

Bonum

Hosted card fields or a redirect, so the client never inherits PCI scope. And the chargeback fee and evidence process.

Factory

Will the 4G module accept an MQTT broker that is not Alibaba's? The host comes from our auth response, so in principle yes — but only they know whether the firmware pins Alibaba's certificate or validates the domain.

Factory

What is the signing secret? Every documented signature is a plain MD5 of sorted, pipe-joined parameters with no salt visible anywhere in 137 pages. As written, anyone with a cabinet IMEI could forge a return and close orders for free.

Factory

What does dReturnLocked do? It appears in every config example and is explained nowhere. It is the only parameter in the document that might bear on locking a bank.

Factory

Exact cabinet models and port counts, screened or screenless — slot addressing, frame layout and the behaviour of check all differ between them. And the protocol.zip parser plus iotdemo source, which we have not been sent.

Client

Every dial in part eight. We will build all of them configurable and we will explain what each one trades, but the settings are commercial decisions and they belong to the operator, not the developer.

Client

How many stations in year one, what a power bank costs them landed, and what a venue is paid — the three inputs that decide whether any setting of those dials makes money.

Client

The factory needs a PC binding tool with a barcode scanner and a phone-based line-test tool. Their brief lists neither, and the supplier's document puts both on us.