The problem space
Three users, three jobs
Volunteers producing physical materials. They need tracking-ready URLs and QR codes fast — without ever learning what a UTM parameter is.
Team leads and WEF stakeholders who don't want raw data — they want clarity on which design and which location actually drove engagement.
People on the street who scan a sticker and never know this system exists. Their data has to be treated with complete ethical seriousness.
Privacy as a design constraint — and a brand statement
IP addresses are SHA-256 hashed before storage — the decision was made before the first line of logging code was written, not retrofitted.
Zero cookies set in the scan flow. No user-agent analysis for identification. A 302 redirect passes attribution to GA4 without logging individual journeys.
The whole data model was checked against data minimisation, purpose limitation and storage limitation — at every stage, as a recurring design gate.
System architecture as a UX decision
PHP · MySQL · Chart.js · Apache on shared hosting — every decision achievable within DSGVO and a no-Node, no-Docker, no-root environment.
The generator · designing for non-technical coordinators
utm_source and utm_content — they think "what material am I making, where is it going, and when?" The form had to speak human.
codes.seeqr.de — the real tool: a semantic material toggle, live QR preview, generated tracking link and an at-a-glance parameter reference. Click to enlarge.
utm_medium is fixed as qr-scan and never shown — it doesn't need a decision.
Material type (Sticker, Flyer, Poster, Roll-Up) maps to utm_content via a semantic dropdown, with a "Custom" escape hatch that keeps data clean.
"Auflage" became "Druckserie" because that's how the team actually spoke about campaigns — correct language lost to real language.
The bait, by design
The tracker · the invisible UX layer
A person scans a sticker on the street via qr.seeqr.de.
Hashed IP, timestamp and all UTM parameters are written — synchronously, in milliseconds.
A 302 passes the attribution forward to seeqr.de and GA4, intact.
The user reaches the awareness content with no perceptible delay. Malformed URLs still redirect — gracefully.
The dashboard · translating data into direction
Mission Control — KPIs, scan trends, and ranked campaign breakdowns. Every metric is one the team can act on. Click to enlarge.
Location intelligence — scan volume by neighbourhood, surfacing where stickers actually resonate. Built on hashed, non-personal data.
How it was built
Shared Apache/PHP/MySQL hosting was audited up front — no Node, no Docker, no root. That audit prevented false starts and chose the stack.
Tables for campaigns, links, scans and stickers were designed to cross-query from the start — separating date into its own field unlocked reporting that would've been costly to add later.
The narrow "Aufkleber" toggle became a full material dropdown; a duplicate-slug bug surfaced a missing SELECT-before-INSERT guard, fixed before any data was lost.
DSGVO wasn't a final audit — it was a recurring checkpoint during schema design, logging and redirect architecture.
Outcome
Good UX for a safety-awareness campaign means the tool gets out of the way and lets the people doing the work focus on the work.