All projects

Case study · Cabify Spain · Jul to Sep 2026

ADP · Add Remove Asset Products

Every vehicle carries a list of commercial products, such as airport trips, kids seats or corporate tiers, and a daily audit sets that list from a rule matrix per city. Any change requested outside the matrix was applied by hand and silently undone the next morning. ADP turns each request into a rule the audit respects, and hands the result to the RPA Uploader so nobody uploads files by hand.

~28 h/month removedApps Script web app
Google Apps ScriptGoogle Apps ScriptGoogle SheetsGoogle SheetsGoogle DriveGoogle DriveSlackSlackGoogle OR-ToolsGoogle OR-Tools
My roleDesigned and built the portal and the rules engine. The rule matrix is co-owned with a performance analyst.
WhenPortal live on 9 Sep 2026 · uploader since 3 Sep
Built withGoogle Apps Script, Sheets, Drive, company sign-in, Slack, and the RPA Uploader on the Mac mini
StatusIn production. Presented with a colleague to the internal AI Champions committee on 21 Sep.
~28 h
of manual work a month removed (method below)
104
automated checks on the rule and expiry logic
33
products and 13 city matrices managed from one place
60
rules in force, each with an author, a reason and an expiry
ADP · new requestsynthetic data
New request form with filters, products and a live vehicle counter
New request. The counter at the bottom updates as you type: vehicles in scope, how many will really change, and why the rest will not.

The problem

About 30 ad-hoc requests a month arrived by Slack, email or direct message. Each one meant cross-referencing the fleet by hand, building a CSV and uploading it to an internal RPA tool, around 45 minutes per request. The next day's audit only knew the matrix, so it undid the change. Nobody could say who had asked for what, or why a car had a product.

One chain, from the request to the RPA

ASKAPPROVEDECIDEHAND-OFFEXECUTEREPORTRequestanyone: slice the fleet,pick products, give areasonApprovalone of three approvers,identity checked bycompany sign-inRuleauthor, reason,validity, priorityDaily reviewapplies every rule tothe whole fleetCSV in a Drivefolderthree columns, neversent directlyRPA UploaderPython + Playwright onthe Mac miniSlacksent, then the realresult
One chain from the request to the RPA. The portal never talks to the RPA tool: it drops a file, and the uploader recognises it and does the rest.

The portal

  • A web app open to any employee. You slice the fleet by city, tariff, segment, company, model, engine, year or accessibility, or paste a list of vehicle IDs, with an "except" option on every filter.
  • A live counter shows the vehicles in scope and how many would really change, with the reasons for the rest: they already have the product, they do not have the one you want to remove, or the product is protected.
  • Changes can apply on approval, on a date or at the next daily run. Temporary changes revert themselves by generating the inverse file when they expire. A reason is mandatory.
  • Any one of three approvers can approve, from the portal or from Slack, and the approver's identity is checked against company sign-in.
  • Every approved change becomes a rule with an author, a reason, a validity and a priority, so the daily review enforces it instead of undoing it.
ADP · inboxsynthetic data
Request inbox in different states
Inbox: pending, approved, scheduled, in force, reverting and rejected.
ADP · request detailsynthetic data
Request detail with approval panel
A request in detail, with its scope, timing and the approval step.
ADP · rulessynthetic data
Rules table
Rules: what each one does, to which part of the fleet, since when, and who changed it last.
ADP · rule detailsynthetic data
Rule detail panel
One rule opened: validity, priority, scope and history.

The daily review

Every morning the review applies the city matrix and then every rule in force, in priority order, to the whole fleet. It writes the CSV for the uploader, a summary by category and a health check of the run. If the daily fleet export does not arrive, it uses the last one and says so on the board.

ADP · daily reviewsynthetic data
Daily review screen
Daily review: what the run did today and what it would do tomorrow.
ADP · dashboardsynthetic data
ADP dashboard
Dashboard of the last review, the same numbers that go out by email each morning.
ADP · healthsynthetic data
System health tab
System health: every input, its age and whether the run trusted it.
ADP · how it workssynthetic data
State diagram of a request
The in-app explanation of a request's life, from creation to expiry.
ADP · by categorysynthetic data
Fleet by product category for one city
Fleet by category: how many vehicles in a city carry each product.
ADP · diagnosissynthetic data
Vehicle diagnosis with the rule behind each product
Diagnose a vehicle: paste an ID and see which rule decided each of its products.
ADP · rules by productsynthetic data
Rules grouped by product
Rules grouped by product: every rule that adds or removes it, and where it applies.

Guards

  • If the daily fleet export does not arrive, the last one is used and the board says so.
  • An unreadable expiry date fails closed. Before, a date like 2026-13-45 simply never expired.
  • A protected list keeps 46 products out of reach of any rule. A file with more than five parts is held for a manual upload.
  • The test environment writes to its own folders, never to production.
  • 104 automated checks cover the expiry logic, because that is where a silent mistake would last longest.

Results

  • About 28 hours a month of manual work removed: 30 requests at 45 minutes, 21 daily reviews at 5 minutes and 63 uploads at 5 minutes, against roughly an hour of approvals now. The conservative estimate is 16 hours.
  • 60 rules and 33 products managed from one place, each change with an author, a reason and a history.
  • An approved change now survives the next morning's audit, because the audit applies it. The upload side is covered in the RPA Uploader case.

Still open

Watching the first temporary rule expire in production, and replacing the once-a-day fleet export with a direct warehouse query so a rule change can be verified the same day.

Screenshots are the real portal rendered with a synthetic fleet of 3,016 vehicles and invented users.