QR tracking and analytics platform

AgencyLaravelLivewire

Making direct mail measurable

A global technology manufacturer was running direct mail campaigns through the agency, and direct mail has an old problem: once the piece leaves the printer, nobody knows what happens to it. The client wanted to know whether the QR codes on their mailers were being scanned, by whom, where, and when, and they wanted that data reliable enough to report on. The first version needed to ship to a live campaign deadline, so the brief was deliberately narrow: track scans accurately, don't slow the redirect down, and don't lose data.

Version one: a single tracking API

I designed and built the first version as a focused Laravel API, owning it end to end from architecture to reporting. A scan hits an endpoint, gets redirected to the campaign destination, and the tracking work happens afterwards: logging runs through Laravel's queue system so the person scanning never waits on a database write. Each scan is enriched with IP-based geolocation, giving the client a geographic picture of campaign response. Access to the data is protected with Bearer token authentication, and the whole thing is covered by a Pest test suite, because a tracking system that silently miscounts is worse than no tracking system at all. Campaign results went out as Excel reports.

Proving its worth, then going international

The API did its job well enough that it stopped being a one-off. When the client took the same approach to the German market, I shipped a localised version on Laravel 12, which forced the codebase to treat language and market as real concerns rather than afterthoughts. At this point there was a pattern: every new campaign needed a developer to set it up, and the reporting was still spreadsheets. That gap became the case for a product.

From API to self-service platform

I built the current version as a full platform on Laravel 12 and Livewire 4. Campaign owners generate QR codes inside the application rather than asking a developer, authentication is handled with Laravel Fortify, and the interface is built with Flux UI. The Excel reports have been replaced by analytics dashboards, with scan location detection built in. The test discipline carried over from version one: the platform has its own Pest suite.

Where it landed

This is the project I point to when someone asks how I think about software. It started as the smallest thing that could answer the client's question, earned its keep on real campaigns, survived a market localisation, and grew into a self-service product because the manual workflow had become the bottleneck. Each stage was justified by the one before it, which is the opposite of building a platform on day one and hoping a use case turns up.