What it does
Seven jobs, one registry.
Tag Docket is the system of record for every tagged URL and QR code an agency produces for its clients. Building a link is how a record gets made; everything else keeps that record honest. Here is each part in detail.
Build
One screen, from paste to minted.
No modal, no wizard, no save dialog and no confirmation step. The preview updates as you type, warnings sit beside the field that caused them, and there is a keyboard path from paste to minted. Composition happens on the server, so the preview cannot disagree with what gets stored.
- Picking a channel fills the fields it knows, and adds that platform’s placement advice
- After a mint the destination clears and the taxonomy stays, because the next link is usually the same campaign pointed somewhere else
- Paste a list of destinations: each row stands alone, so one bad URL does not reject the other thirty-nine
- Duplicates are caught within the pasted batch and against everything already in history
- The page check loads the destination and warns about a page that does not load, a redirect that drops the query string, a missing analytics tag, or UTM parameters already on the URL. It warns; it never blocks
- Length checks: 2,048 characters is a real platform limit and is treated as one. 512 is a judgement about email wrapping and QR density, and is described as one
- Campaigns nest exactly two levels, and are optional at mint time. Filing a link later is cheap
Govern
Approved values only, and a mint that never changes.
The agency edits the dimensions and values; buyers pick from them. Everything is lowercased, unconditionally, with no setting to turn it off, because GA4 treats Facebook and facebook as different sources — a real audit found 13,494 sessions split across social and Social alone.
- Pairing rules say which values go together: “email comes from Mailchimp or HubSpot”. The builder filters out the rest, and a narrowed field says which selection narrowed it
- Links arriving by the API, a bulk paste or an import are warned about a broken rule, never refused
- A value may never contain the agency’s separator, enforced when it is saved, so every composed string can be parsed back later
- Changing a value reports, inline, how many links carried the old one before the change lands. Values are archived, never deleted
- A mint is frozen: the parameters as composed are stored and never recomputed. Renaming a campaign changes what the app displays, never a string already published
- Seven platform packs as data. Macros like {campaignid}, {{campaign.name}} and __CAMPAIGN_NAME__ pass through byte for byte, and unresolved tokens are checked against the pack
- Every mint records its pack version, so a platform change becomes a query rather than an audit
Which values go together
When Channel is Email, Platform is one of MailchimpHubSpot
Not offered with Email: Facebook, Google, TikTok, Nextdoor.
Whether the yard sign scans is decided before the print run.
The QR picture is the easy half. The numbers are the point: the grid size, the minimum printed width for a scan distance, and the module size in millimetres, with a warning when they fall below what print holds. Printed pieces get a short code, and a short code can be pointed somewhere new after ten thousand of them are in letterboxes.
- Measured at 30 cm wide for a 3 m scan: the full tagged URL needs a 61×61 grid of 4.92 mm modules, a short link 33×33 at 9.09 mm
- Error correction set by surface, so nobody has to know what Q means: H for a yard sign, L for a screen
- The quiet zone is preserved. A designer who crops to the black edge ships a code that fails in the field
- Every QR is drawn from the frozen mint, and a link with an unresolved ad macro is refused one
- Short codes on app.tagdocket.com/r/, from an alphabet with no 0/O, 1/I/L or U, resolving to the fully tagged URL
- Retargeting moves the destination and leaves the tagging alone. Redirects are 302, never 301, so people who already scanned follow the change
- A code is disabled, never deleted. A retired code shows a friendly page that says the phone is fine
- No branded or custom short domains. That is not built, so it is not for sale
- Grid
- 33×33 modules
- Recovery
- H (~30%)
- Scan from
- 300 cm
- Printed at
- 30 cm wide
- Module
- 9.09 mm
app.tagdocket.com/r/k7m2qx
Full tagged URL
61×61 · 4.92 mm modules
Short link
33×33 · 9.09 mm modules
Both printed 30 cm wide, for a 3 m scan.
- Code
- app.tagdocket.com/r/k7m2qx
- Was
- https://cedarroofing.example/spring-inspection
- Now
- https://cedarroofing.example/gutters
- Tagging
- utm_source=directmail &utm_medium=print &utm_campaign=spring26_freeinspect_gutters &utm_content=cedarrapids Unchanged since minted
The tagging never changes, so GA4 keeps seeing one campaign. Anything already printed follows.
- retargeted priya@fieldworkmedia.example · today
- minted priya@fieldworkmedia.example · 3 days ago
History
What a colleague shipped last Tuesday, in one search.
One filter row, always visible: search across the campaign string and the destination, then narrow by person, campaign and every dimension. It is the question asked on almost every visit, so the controls that answer it are never behind a disclosure.
- Filter state lives in the URL. Sharing a view is pasting the address bar
- Row actions: retarget, add a short code, retire a code, and read a link’s audit trail
- People who have left the agency still appear against the links they made
- Export is always available and always free, with values written out in full rather than as ids
- Morespring26_freeinspect_gutters Spring storm /r/k7m2qx
https://cedarroofing.example/gutters?utm_source=directmail&utm_medium=print&utm_campaign=spring26_freeinspect_gutters&utm_content=cedarrapidspriya@fieldworkmedia.example · today - Morespring26_freeinspect_gutters Spring storm
https://cedarroofing.example/gutters?utm_source=facebook&utm_medium=paidsocial&utm_campaign=spring26_freeinspect_gutters&utm_content=cedarrapidspriya@fieldworkmedia.example · today - MoreSpring_Gutters_FINAL
https://cedarroofing.example/gutters?utm_source=Facebook&utm_medium=Social&utm_campaign=Spring_Gutters_FINALjordan@fieldworkmedia.example · imported Imported as it ran · does not match the taxonomy - Morewinter26_seasonaldiscount_gutters Winter /r/p4hvw9 · retired
https://cedarroofing.example/gutters?utm_source=yardsign&utm_medium=offline&utm_campaign=winter26_seasonaldiscount_gutters&utm_content=cedarrapidssam@fieldworkmedia.example · 12 Jan 2026
Import and cold start
Every customer arrives holding a spreadsheet. Bring it.
An imported link is stored as it ran, not re-composed, because the string in the spreadsheet is what the ad platform served and what GA4 recorded. Nothing is written until you have seen what would be. A row the taxonomy cannot read is still imported, flagged, because it is the mess you bought this to find.
- Columns are guessed from the header, and a file holding only the finished tagged URLs works
- Re-importing your own export does not double the history
- Composed strings parse back into dimension values, so a new client’s GA4 history can be reconstructed into the model
- Backfill proposes and never writes, and proposes nothing when a string is ambiguous
- Connecting a client’s GA4 is four steps, one address to copy and one button that verifies with a real query. Google requires a person to grant the access, so that step stays manual
- Each agency gets its own service account rather than a shared one, and a broken connection surfaces on its own
Import a spreadsheet
links-2025-FINAL-v3.csv — 221 rows.
- Will import 212
- Already here, or repeated in the file 9
- Do not match your taxonomy, so they import without filters 31
Columns read: taggedUrl ← final_url · createdAt ← date · createdByEmail ← owner
Imported links keep the tagging exactly as it ran. Nothing is rewritten.
Own and transfer
The client owns their link history. The agency owns its taxonomy.
Records about a client belong to the client; the taxonomy and templates an agency authored belong to the agency. When a client moves, the receiving agency requests the transfer and the client approves it at their own address. The outgoing agency cannot block it.
- Export is always available and always free
- Frozen mints survive a transfer byte for byte, and control of the short codes moves exclusively to the new agency
- The outgoing agency keeps a read-only archive that stops counting against its plan
- Accepting a transferred client always completes, even over a plan limit. The upgrade prompt comes after
- Retiring a client archives rather than deletes, and their codes keep resolving
Cedar Rapids Roofing Co.
Moving from Fieldwork Media
- 1 Requested by Northbound Digital, the receiving agency
- 2 Approved by the client at Cedar Rapids Roofing Co.’s own address. Fieldwork Media cannot block it
- 3 Transferred every minted link byte for byte, and control of its short codes
The client keeps
Every record about them
Fieldwork Media keeps
Its taxonomy, and a read-only archive off the plan
Team and white label
Sign-in links, not passwords. Your colours, not ours.
Members sign in with an emailed link; there are no passwords. Paste the agency’s website in settings and the app takes on its colour and logo, previewed before anything is saved.
- Roles, plus per-client access grants that narrow a member to specific clients
- A role can only be granted at or below your own, and the last owner cannot be removed
- A member list never reveals which other agencies someone belongs to, which matters for freelancers
- Removing someone keeps their links and the attribution on them
- Brand colours are adjusted to meet WCAG AA contrast, and the agency is told when they were
- Status colours are never rebranded, so a warning still looks like a warning
- Seats are uncapped on every plan
Look and feel
Paste your agency's website and the registry takes on your colour and logo. Nothing changes until you save.
The honest part
What we deliberately don’t do
We never change a link after it ships. GA4 has already recorded the old value and the QR code is already on a yard sign. Renaming things changes what the app displays; retargeting moves a destination. Neither touches a published string.
We don’t grant ourselves GA4 access. Google requires a person to do that, and it always will. We make it four steps and one button, and tell you when a connection breaks.
We don’t publish platform changes on our own. Pack sources are monitored for changes, but detection is automated and publication is not: a change opens a review with the diff. Some platforms cannot be watched automatically at all, and the platforms page says which.
We don’t charge per link or per seat. Charging per record makes people avoid recording, which defeats the registry. The meter is clients.
We don’t use passwords. Sign-in is an emailed link, so there is no password to reuse, share or reset.
See it with your own taxonomy.
Tell us about your agency and the clients you tag for. We set up your organisation, and your team signs in with an emailed link.