Hardware + software · Part of Synero · Prototype
A vending machine that, out of the box, only works if it can reach a server on the other side of the world. We wrote the software that drives it directly — and makes it manageable from one place.
01 · The problem
You buy a machine, put it in your shop — and discover it does nothing without permission from a server you've never heard of.
Modern vending machines are computers with a motor behind them. The manufacturer ships software that looks nice but doesn't do one thing: work without its own cloud. No connection to the manufacturer's servers, no product drops. And what travels over that connection — sales, prices, timestamps — you never see.
For an operator that means dependence: on a server abroad, on an app you can't change, on prices you can only edit through their system. And if that service ever stops, you're left with an expensive cabinet that does nothing.
We wanted the opposite: a machine that listens to your platform, with your data on your infrastructure.
02 · The solution
We replaced the manufacturer's software with our own Android app that talks directly to the motor board, through the manufacturer's official SDK. No detour via the cloud.
On start-up the machine connects to the Synero platform and waits in a pool until an operator claims it. If the connection drops, it reconnects by itself.
The operator links the machine to their business and fills in product, price and stock per coil — from the dashboard, without walking to the machine.
A dispense travels from dashboard to machine in a fraction of a second. The motor spins, the product drops, stock goes down by one and the sale is in the log.
“The machine only knows coils. What's in them, what it costs and who may sell it — only the platform knows. That's why a price changes without a single machine ever needing an update.”
The design principle
03 · What's inside
The same pattern as the ordering platform: one system, every operator their own environment.
The app addresses the motor board directly over the serial port. The board acknowledges configuration and dispense commands as it should.
Read live what the board sees, coil by coil. Indispensable for knowing whether a problem is in the software or in the cabinet.
Operator → machines → coils. Several businesses on one platform, strictly separated, exactly like the Synero ordering platform.
Product, price, capacity and stock live on the server. Changing them is a click; the machine doesn't need to know.
Wi-Fi gone for a moment? The machine calmly retries, each time a little later, until it's back online. No manual restart.
Every dispense deducts stock and writes a transaction, per machine and per operator. Filterable, exportable.
A simulated motor board lets us test the whole chain on a laptop. Thirteen automated tests make sure everything keeps working.
Bancontact, Payconiq or a payment terminal before the dispense — the hook is already in the flow. Planned
Management currently runs through the API; the visual admin follows in Synero's style. Planned
04 · Under the hood
Operator
Picks machine and product, or a payment gives the go-ahead.
Synero cloud
Checks stock and permissions, numbers the command and waits for the result.
Live connection
Over a permanent connection, in milliseconds.
In the cabinet
Translates the command into the motor board's language.
Motor board
Product drops. Confirmation travels the same way back; stock and log are updated.
Two programs, strictly separated. In the cabinet runs a deliberately simple app: it can spin a coil and phone home, nothing more. In the cloud runs the brain: operators, machines, prices, stock, transactions. Every dispense passes through one central point that keeps track of what was asked and what was answered.
The part that talks to the hardware lives in one isolated module. If something there isn't right, the system would rather send nothing than something wrong — and says clearly why.
05 · Why this is different
The machine no longer needs to reach any foreign server to work. Data stays with the operator, on infrastructure they know.
Control runs through the manufacturer's own SDK. Robust, supported, and clean.
Everything that is certain is built and tested. The one piece still waiting on the supplier is isolated in a single function — the rest of the stack doesn't stand still because of it.
A simulated motor board lets us run the whole chain on a laptop. Faster building, less risk on the real machine.
Same multi-tenant pattern, same way of thinking. An operator with a cafeteria and a vending machine will soon manage both in one place.
06 · What we learned along the way
The manufacturer's software sends nothing to the motor board as long as it can't reach its cloud. So there was nothing to observe or compare.
Get to know the board directly through the official SDK, step by step: which port, which speed, which address. Believe every assumption only once the board confirmed it.
The first commands were completely ignored.
The board turned out to speak a different message format than the documentation of a sister board. With the right "language" it immediately answered both configuration and dispense commands.
The board accepts everything, but the motors stay silent.
Systematically ruled out until one explanation remained: the software does what it should, the motors are electrically unreachable. That's the cabinet, not the code — and it's now with the supplier.
Only one program may talk to the board at a time.
The manufacturer's app is disabled and our app gets the port exclusively. Simple, but it saves hours of chasing ghost errors.
07 · What's next
App, platform, diagnostic tool and tests are in place. The board acknowledges every command.
Resolve the hardware/configuration issue with the supplier. Then the first real dispense.
Bancontact, Payconiq or a terminal before the dispense — the hook in the flow is already there.
Visual management in Synero's style, with the vending machine next to the cafeteria.
Database and hosting like Synero, remote updates, and a second and third machine.
A machine you want to manage yourself?