request namespace describes the incoming scan itself rather than the Item behind it: what
language the browser asked for, where the visitor came from, and roughly where in the world they
are. The location values are not measured by QRtub — they are read from headers the content
delivery network adds in front of the app, which is why they are approximate and why several of
them are frequently empty.
Available fields
Two behaviors surprise people:
request.referreris usually empty. A phone camera opening a QR code sends no referrer, so a rule built on it will not fire for the scans you actually care about.request.pathis always/when a Page renders. It carries the real requested path during Destination routing, but the Page renderer does not pass the path through.
Location values are not available in preview
request.country, request.city and request.ip come from headers the CDN adds to a real
inbound request. When you preview a Page or test a Destination inside the editor, the context is
built in your own browser instead, and those three are always empty. There is no way to fake them
in preview, so a location-based rule can only be verified with a real scan.
Combined with the missing-value rule, that has teeth: a Destination URL containing
{{request.city}} resolves to nothing whenever the header is absent, and QRtub skips that
Destination rather than opening a half-built URL. If you route on location, always pair the rule
with an unconditional fallback so a visitor the CDN could not place still lands somewhere. And
because bindings are inserted with no URL encoding, a city name containing a space will break the
URL it is inserted into.
What binding this data discloses
State this to yourself plainly before you use it: the moment you put{{request.ip}},
{{request.country}} or {{request.city}} into a Destination URL, you are sending that data to
whoever runs the system on the other end. It arrives in their query string, and from there it
lands in their server logs, their analytics and any third-party script on the page they open —
permanently, and outside your control.
The person scanning gets no notice and no choice. They pointed a camera at a sticker; they did not
agree to have their approximate location forwarded to a vendor. An IP address is personal data
under the GDPR and comparable regimes, and city-level location is widely treated the same way, so
if you operate anywhere those rules apply, forwarding it is a decision to make deliberately rather
than a convenient parameter to add.
Two practical guardrails:
- Prefer
request.countryoverrequest.cityorrequest.ip. A country code is usually all a routing decision needs, and it discloses the least. - Use these values in conditions rather than in URLs where you can. Routing an Australian scanner to your Australian support page keeps the data inside QRtub; putting the city in the URL hands it to someone else.
request.* to decide who may see something.
Related
- Field Bindings & URL Templates — the
{{ }}syntax, encoding and missing-value rules - What Is a Destination? — resolution order, and the conditional routing rules that read these fields
- Device Detection & Routing — the other scan-time namespace, and the same “not for security” caveat
- Time Fields Reference — the other values computed fresh at every scan