Back to Homepage

The problem space

QR codes have quietly become one of the most exploited surfaces in social engineering — attackers print malicious stickers over real ones and weaponise the trust people place in a black-and-white square. Seeqr.de educates the public about that threat. But a campaign that lives on physical stickers had no way to measure what was actually working.

Three users, three jobs

01

Campaign coordinators

Volunteers producing physical materials. They need tracking-ready URLs and QR codes fast — without ever learning what a UTM parameter is.

02

Analysts & decision-makers

Team leads and WEF stakeholders who don't want raw data — they want clarity on which design and which location actually drove engagement.

03

The public

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

A platform warning people about digital security threats cannot be seen collecting personal data recklessly. So privacy wasn't a compliance afterthought — it was the design premise. The system collects analytics powerful enough to make real decisions, in a way the platform can honestly stand behind.

Hashed, never stored raw

IP addresses are SHA-256 hashed before storage — the decision was made before the first line of logging code was written, not retrofitted.

No cookies, no fingerprinting

Zero cookies set in the scan flow. No user-agent analysis for identification. A 302 redirect passes attribution to GA4 without logging individual journeys.

Reviewed against DSGVO Art. 5

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

Three interconnected tools on separate subdomains, each scoped to exactly one job. Merging them would have meant interface complexity and cognitive load for users who only ever need one surface. Clean separation enforces clean mental models.
Internal · auth-gated codes.seeqr.de Campaign link & QR generator
Public · invisible qr.seeqr.de Scan tracker + 302 redirect
Internal · auth-gated dashboard.seeqr.de Analytics & decision surface

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

Coordinators don't think in utm_source and utm_content — they think "what material am I making, where is it going, and when?" The form had to speak human.
The codes.seeqr.de generator: campaign-parameter form with a Sticker/Flyer/Poster/Custom material toggle, a live QR-code preview, the generated tracking link, a UTM parameter-reference table and a saved-links list — black UI with neon-yellow accents.

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.

Hidden when it's always true

utm_medium is fixed as qr-scan and never shown — it doesn't need a decision.

Vocabulary they already use

Material type (Sticker, Flyer, Poster, Roll-Up) maps to utm_content via a semantic dropdown, with a "Custom" escape hatch that keeps data clean.

Copy follows real language

"Auflage" became "Druckserie" because that's how the team actually spoke about campaigns — correct language lost to real language.

The bait, by design

Every tracking link ends up on a sticker in the street — and the designs are deliberately tempting. "Free beer", a stranger who "found your ex's photos", a free matcha for a café opening: each plays on exactly the curiosity attackers exploit. Scan one and seeqr.de teaches you what just happened.

The tracker · the invisible UX layer

The most-used part of the system is the one nobody sees — there's deliberately no interface to show. Its single UX requirement is imperceptibility: any pause, loading screen or error would break the chain from physical artefact to digital experience.
01

Scan

A person scans a sticker on the street via qr.seeqr.de.

02

Log

Hashed IP, timestamp and all UTM parameters are written — synchronously, in milliseconds.

03

Redirect

A 302 passes the attribution forward to seeqr.de and GA4, intact.

04

Land

The user reaches the awareness content with no perceptible delay. Malformed URLs still redirect — gracefully.

The dashboard · translating data into direction

Built for a small team making resource decisions, not for data analysts. It prioritises answers over data — every metric shown is one a coordinator or team lead can act on directly. A brutalist neon-lime-on-black identity (Prompt typeface) makes it feel like part of the seeqr.de family and reads at a glance in a meeting.
dashboard.seeqr.de Mission Control: KPI row (total scans, campaigns, tracking codes), a 90-day scan timeline, scans-by-time-of-day chart, ranked campaign and location breakdowns, a materials donut chart and a per-code table — neon-lime on black.

Mission Control — KPIs, scan trends, and ranked campaign breakdowns. Every metric is one the team can act on. Click to enlarge.

dashboard.seeqr.de scan map of Hamburg: neon-lime bubbles sized by scan volume over a dark map, with a ranked list of neighbourhoods (St. Pauli, Sternschanze, Landungsbrücken, Altona, Eppendorf) — no personal data.

Location intelligence — scan volume by neighbourhood, surfacing where stickers actually resonate. Built on hashed, non-personal data.

How it was built

01

Constraint mapping first

Shared Apache/PHP/MySQL hosting was audited up front — no Node, no Docker, no root. That audit prevented false starts and chose the stack.

02

Schema as UX architecture

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.

03

Iterated on real feedback

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.

04

Privacy as a design gate

DSGVO wasn't a final audit — it was a recurring checkpoint during schema design, logging and redirect architecture.

Outcome

3scoped tools across separate subdomains
0raw IPs or cookies stored — hashed by design
Evidencereplaced gut feeling for print-budget decisions

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.

Project reflection · Global Shapers Hamburg · seeqr.de
Don't be shy! Let's connect to make something special