elmeld
Grid notifications for electricians, filed by a robot.
elmeld files electricity registrations for an electrical contractor: new EV chargers and broken meter seals, reported to the grid operator. A robot works the grid operator’s portal like a person would, one address at a time, and a dashboard and a daily email show what was filed, what failed and what needs a person.

- Client
- elmeld
- Sector
- Electrical contracting
- Platforms
- Browser robot, web dashboard and daily email
- Our role
- Automation platform
- Period
- Ongoing product partnership
What was the challenge?
Every new charger and every broken meter seal has to be registered with the grid operator, in a web portal with no API. By hand that means logging in, typing the address, waiting for the address check, confirming the address belongs to that grid and filling in a form in several sections, again and again. An address that belongs to another grid operator only shows up halfway through, and a registration that silently failed is only noticed when someone goes looking.
- Product
- RPA for grid notifications
- Users
- Electrical contractors · office staff
- Type
- B2B automation
What did bon.do build for elmeld?
We built an RPA platform in Node 22 and TypeScript. A Playwright robot signs in to the portal’s Azure B2C login once, then keeps the session alive with AES-256-GCM encrypted tokens and silent renewal. Each address runs seven steps: portal, registration type, address lookup against DAWA, grid check, case creation, form and submit, each one timed. The queue is PostgreSQL with SKIP LOCKED claiming and recovery of stuck jobs. Retries depend on the error code: a wrong grid operator is never retried, it is set aside and reported per grid operator, and after five failed attempts a job is handed to a person. An Angular 21 dashboard and a daily report email show the result, and the platform runs on Kubernetes.
A robot with a session that holds
Playwright through Azure B2C, encrypted tokens, silent renewal, a DAWA address lookup and a grid check that waits for the portal to settle.
A queue that knows its errors
PostgreSQL with SKIP LOCKED, a hard timeout, recovery of stuck jobs and retries chosen by error code, so a person only sees what a person must decide.
A dashboard and a daily report
A live queue, timing per step, a year of history on a calendar and a map, and an email every day with what was filed and what needs follow-up.
Technology
- Node 22
- TypeScript
- Hono
- Playwright
- PostgreSQL
- Angular 21
- Kubernetes
- 01.IntakeA registration arrives with address, type and meter details.
- 02.QueueEach registration becomes a job with a state, attempts and a result.
- 03.RobotSeven timed steps in the grid operator’s portal, with the address checked against DAWA.
- 04.ReportFiled, set aside for another grid operator, or handed to a person, with the reason.
How did the project run?
- 01Discover
The portal, step by step
Login, address lookup, grid check and every form field, mapped for both registration types.
- 02Design
A failure for every case
A named error per failure, so the queue knows what to retry, what to set aside and what to hand to a person.
- 03Build
Tested without a browser
A hexagonal backend, 594 tests and a dry run that checks a whole batch without submitting anything.
- 04Run
Operated, not just delivered
Kubernetes, a browser memory guard, Datadog monitors on runs and reports, and a runbook for the failures that actually happen.
Inside the product
The same dashboard on a phone, for a quick look between jobs. Example data. The daily report lands in the inbox, with the cases that need follow-up listed by address. Example data.
What was the result?
Registrations arrive through the API, a Zapier integration or a CSV batch, and the robot files them while the team does other work. Every case shows its seven timed steps and, when it fails, a named error instead of a stack trace. Wrong-grid addresses are separated from real failures, and the daily email lists what needs follow-up. The platform has 594 automated tests across 73 files.
Your productcould be next.
Tell us where you are: an idea, a prototype, or a platform that needs a new team, and we'll show you the fastest safe path forward.



