Case study
Turning "what colour is my car" into an order a paint shop can actually fill
A paint code database, a Shopify sync and a customer-facing finder, joining a car to the exact product that matches it.
- Client
- T8 Paint
- Sector
- Automotive e-commerce
- Engagement
- 2024 to 2025
- Stack
- Laravel, Filament, Shopify API
The constraint
Selling automotive paint online has a matching problem at both ends of the transaction. The customer knows their car, a 2016 model in a colour they would describe as black. They do not know that the manufacturer calls it Brilliant Black-A2A2, and that a different black on the same model year is a different product entirely.
The shop has the opposite problem. It cannot mix paint from "black", or even from "Brilliant Black". It needs the code. An order that arrives without one is not an order, it is the start of an email exchange, and enough of those will kill the economics of a small store.
Shopify on its own does not bridge that gap. Its products are products; it has no concept of which vehicles a given paint belongs to.
The approach
We built the missing layer as a separate Laravel application sitting alongside the store rather than inside it. It holds the vehicle paint data, mirrors the Shopify catalogue, and maintains the mapping between the two.
Customers use it as a finder: pick a year, then a make, then a model, and get the paints that match. Choosing one hands them off into the Shopify product page with the exact colour code already filled in, so the code travels into the order rather than being lost at the handover.
What we built
- 01
A paint code database with a bulk importer
Vehicle paint data arrives as spreadsheets, not as an API. We built a chunked importer that ingests them into a normalised table of year, make, model, colour code, description and product code, running as a queued job so a large file does not tie up a web request.
- 02
A two-way Shopify sync
The store is the source of truth for what is actually for sale, so the app pulls the full product catalogue from the Shopify Admin API and keeps a local mirror of every product, its tag and its status.
- 03
Automated matching between codes and products
A background job walks the entire code database in chunks of a thousand, matches each code to the Shopify product carrying the same tag, and writes the links back with a bulk upsert. Progress is cached as it goes, so an operator can watch a long run rather than guess.
- 04
A year, make and model picker for customers
Nobody knows their paint code. They know their car. The public side narrows year, then make, then model, with each step querying only the distinct values that actually exist for the previous choice, cached so repeat visitors get an instant response.
- 05
Codes carried through to the order
This was the part that mattered commercially. "Brilliant Black" is not a colour a shop can mix, but "Brilliant Black-A2A2" is. The result page deep-links into the right Shopify product with the exact paint description prefilled, so the order arrives fulfillable rather than needing a follow-up email.
- 06
An admin panel over the whole thing
A Filament back office for browsing and editing paint codes and synced products, with dashboard statistics and the import, sync and mapping jobs runnable on demand.
Thank you again for all the help. I hope we can work together in the future with a similar project soon.
How it ended
The software worked. The business behind it did not take off, and in 2025 the client decided to go a different direction and wind the store down. We took the application offline at their request and refunded the hosting they had paid for but would not use.
We are including this one anyway, because the interesting part of a project is rarely whether the client's market worked out. The matching problem was real, the solution was the right shape, and how a project ends says more about a studio than how it starts. The domain has since lapsed, so there is nothing left to link to.
Work with us
Need your store to know something Shopify does not?
Catalogues, lookups, and the awkward matching in between. Tell us what is missing.