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.
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.
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 for | Does it apply here? |
|---|---|
| Camera and hardware | No. 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. |
| Location | No. Browser geolocation is more than enough for “stations near me”. |
| Working offline | No. 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 notifications | Partly — 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 loop | No. This is an emergency purchase, not a routine. Nobody opens a power bank app; they notice a cabinet when their battery dies. |
| Store discovery | No. Nobody has ever found a power bank service by browsing an app store. Discovery is physical. |
| Performance | No. 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Unused credits are deferred revenue, not income — a liability until consumed or expired. The accountant needs this before launch, not at year end.
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.
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.
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.
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.
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.
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.
| Dial | What it sets | What it trades |
|---|---|---|
| First block size | What is paid before a power bank is dispensed — the only screening step there is | Loss already recovered against conversion at the cabinet |
| Hourly rate | Revenue per hour of rental | Volume against margin, and against the loss rate it has to absorb |
| Daily cap | The most a rental can accrue in 24 hours | Revenue on long rentals against how alarming the running total gets |
| Buyout price | What an unreturned bank earns instead of coming home | Too low and it is cheap to keep; too high and it reads as a penalty |
| Buyout window | When a rental stops being a rental and becomes a sale | Hardware recovered sooner against customers who are merely slow |
| Credit minimum | Smallest QPay top-up | Prepay ratio against first-rental conversion |
| Bulk discount | Whether ten credits cost less than ten times one | Average prepay up, revenue per credit down |
| Credit expiry | How long an unused balance survives | Breakage revenue against goodwill and complaint risk |
| Rails offered | Card, QPay credits, or both | Reach against recovery — a saved card keeps paying, credits stop dead |
| Rate differential | How much cheaper the card path is than the QPay one | The only lever that moves customers onto the rail that renews itself |
| Trust tiers | Whether return history earns better terms | Retention and loss reduction against build cost — a later feature |
| Venue share | What the café or venue receives per rental | Site acquisition against unit margin, usually the largest line |
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.
| Operator | Window | Converts to |
|---|---|---|
| Full Charge | 1 day | $20, keep it |
| Brick | 5 days | full rental + purchase fee, capped at €50 |
| Naki | on loss | maximum rental + €20 non-return fee |
| Chargebar | on loss | $75 |
| Just Attend | 24 hours | forfeits the £25 deposit |
| Recharge.city | 31 days | $99 replacement value |
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.
| Provider | What it carries | Cost | Status |
|---|---|---|---|
| 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 |
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.
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.
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.
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.
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.
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.
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.| Line | Specification | Per month |
|---|---|---|
| cloud.mn Cloud 3 | 2 vCPU · 4 GB · 100 GB SSD · 1 IP — the launch box | ₮164,065 |
| cloud.mn Cloud 4 | 4 vCPU · 8 GB · 100 GB SSD · 1 IP — the scale-up, when the fleet grows | ₮239,305 |
| cloud.mn Cloud 2 | 1 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 + backup | cloud.mn bills these separately — mandatory, not optional | not yet priced |
| M2M SIM | one per cabinet, scales with the fleet | not yet priced |
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Phase two across selected sites, or one flagship station inside phase one as a demonstrator? Proposing it does not commit anyone to building it.
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.
| Phase | What gets built | The 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.
What it costs
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.
| Area | What it covers | Share of the build |
|---|---|---|
| Design | The customer journey, the three rental screens, and the operations console — which is the larger design problem of the two. | ₮6M |
| Frontend | The rental web app, and the console interface: fleet, banks, faults, orders, reporting. | ₮16M |
| Backend | Order engine and idempotency, funded metering, credits, the debt ledger, reconciliation, reporting, roles and audit. | ₮24M |
| Integration | The device protocol and MQTT infrastructure, Bonum, eBarimt on both paths, Skytel and Verify.MN. | ₮17M |
| Pilot & handover | Live 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.
| Recurring | What it is | Per month |
|---|---|---|
| Infrastructure | Billed 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 · standard | Business hours. Bug fixes, monitoring, updates, and the people who answer when something breaks. | ≈ ₮1,800,000 |
| Support · on-call | Evenings and weekends, which is when rentals actually peak and when a jammed station otherwise waits until Monday. | from ₮2,500,000 |
| Third-party | Bonum 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.
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.
Your assumptions
Cost assumptions
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.
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.
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.
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.
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.
Billed per message or per 70-character Cyrillic segment? It decides how the templates get written.
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.
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.
Fee structure: purely 1%, or is there a fixed component per transaction? The answer sets how often we can afford to capture.
Do response codes separate soft declines from hard ones? Without that, retry logic is guesswork — hammering dead cards and abandoning recoverable ones.
Hosted card fields or a redirect, so the client never inherits PCI scope. And the chargeback fee and evidence process.
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.
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.
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.
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.
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.
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.
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.