Developers
Generating and re-pointing QR codes in n8n
By Sam Moreton · updated 28 June 2026
n8n is a fair-code workflow automation tool, and OpenQR ships a community node — n8n-nodes-openqr — that turns the REST API into drag-and-drop steps. Instead of hand-wiring HTTP Request nodes, you get typed operations for generating static codes, creating and editing dynamic (re-pointable) codes, and reading scan analytics. This guide installs the node, sets up the credential, and builds a real workflow that mints a campaign code and later re-points it without a reprint.
9 min read · Updated 28 June 2026
This is the no-code path. If you'd rather call the API directly from your own backend, start with getting started with the OpenQR API and dynamic codes and scan analytics — the node calls exactly those endpoints under the hood. For the bigger picture of where automation fits, see QR codes in LLM apps and workflows.
Install the community node
The node is published to npm as n8n-nodes-openqr. On any n8n instance that allows community nodes, install it from the UI — no code, no restart:
- 1
Open community nodes
Go to Settings → Community Nodes in your n8n instance.
- 2
Install
Click Install, enter
n8n-nodes-openqr, accept the risk prompt and confirm. - 3
Find the node
Add a step in any workflow and search OpenQR — the node appears with QR Code, Dynamic Code, Folder and Theme resources.
Self-hosted installs
On self-hosted n8n you can also install from the shell with `npm install n8n-nodes-openqr` in your n8n data directory, then restart. n8n Cloud and most managed instances support the UI install above. The node targets the current n8n-workflow 2.x runtime and needs Node 20.15+ (the n8n baseline).
Add the OpenQR credential
Every operation authenticates with a single API key. Create a free one at openqr.uk/api — sign in with a magic link, then mint a key (it starts with oqr_).
- 1
New credential
In n8n, add a new OpenQR API credential and paste your
oqr_…key. - 2
Leave the base URL
Keep Base URL as
https://openqr.ukunless you're pointing at a self-hosted or staging instance. - 3
Test it
The credential's connection test calls
GET /v1/dynamic, so a green test confirms the key is valid and authorised.
The key is the whole account
An OpenQR key can create, edit and delete every dynamic code on your account. Store it only in the n8n credential vault, never inline in an expression or a workflow note. Keys are shown once and SHA-256-hashed at rest — to rotate, mint a new one and update the credential.
What the node can do
The node exposes four resources, each with its own operations — the same surface as the REST API, mapped to friendly names:
| Resource | Operation | Calls | Use it for |
|---|---|---|---|
| QR Code | Generate | POST /v1/qr | Render a static SVG/PNG to a binary field |
| Dynamic Code | Create | POST /v1/dynamic | Mint one re-pointable oqr.to code |
| Dynamic Code | Create Many | POST /v1/dynamic/bulk | Up to 200 codes in one step |
| Dynamic Code | Get Many | GET /v1/dynamic | List your codes (limit 1–500) |
| Dynamic Code | Update | PATCH /v1/dynamic/{id} | Re-point, rename, re-slug, tag, file or restyle |
| Dynamic Code | Delete | DELETE /v1/dynamic/{id} | Remove a code |
| Dynamic Code | Get Scans | GET /v1/dynamic/{id}/scans | Totals + country/device/referrer breakdowns |
| Folder | Create / Get Many / Rename / Delete | /v1/folders | Organise codes |
| Theme | Create / Get Many / Delete | /v1/themes | Saved brand styles |
Workflow: mint a campaign code, then re-point it
Here's the canonical dynamic-code loop as an n8n workflow. A trigger fires, OpenQR creates a re-pointable code, and you store its id so a later workflow can swap the destination without reprinting anything.
Build it as three steps:
- 1
Create the dynamic code
Add OpenQR → Dynamic Code → Create. Set
Destinationto a public http(s) URL — say a holding page,https://example.com/launch-soon— and add an optionalLabellike "Summer poster" under Additional Fields. The node returns{ id, slug, short_url, destination }. - 2
Persist the id and short_url
Pipe the output into a storage step — a Google Sheets row, an Airtable record, a database insert. Store
id(your handle for editing and analytics later) andshort_url(the link you print). The printed QR encodes the short_url, so it never changes. - 3
Render the QR for printing
Add OpenQR → QR Code → Generate with
Datamapped from the previous step'sshort_url, format PNG, size 1024. The image lands in a binary field you can email, upload, or push to a label printer.
The Create step's output looks like this — the same JSON the REST endpoint returns, ready to map into downstream nodes:
{
"id": "b1c2…",
"slug": "k7Pm2qR",
"short_url": "https://oqr.to/k7Pm2qR",
"destination": "https://example.com/launch-soon"
}Now the payoff. When the real campaign page goes live, a second workflow re-points the same code. Add OpenQR → Dynamic Code → Update, set Code ID to the stored id, and set Destination to the new URL. Every future scan goes there — the printed poster is untouched.
Re-pointing on a schedule
Drive the Update step from a Schedule Trigger to flip destinations automatically — point a venue code at today's agenda each morning, or swap a packing-slip code from order-tracking to a review request a few days after dispatch. Same physical code, different link over time.
Reading scan analytics in a workflow
Add OpenQR → Dynamic Code → Get Scans with the Code ID and an optional days window (1–365, default 30). It returns a scans summary and a fuller analytics object with a zero-filled daily series and top country/device/referrer entries — the same shape documented in the dynamic codes guide. A common pattern: a weekly Schedule Trigger → Get Scans → format → Slack/email a digest.
{
"scans": { "total": 1840, "last7": 263, "topCountry": "GB", "topDevice": "mobile" },
"analytics": {
"days_window": 7,
"window_total": 263,
"daily": [ { "day": "2026-06-22", "n": 31 }, … ],
"by_country": [ { "value": "GB", "n": 188 }, … ],
"by_referrer": [ { "value": "Direct", "n": 201 }, … ]
}
}No PII in the numbers
Each scan records a timestamp plus coarse country, device class and referrer host, derived from Cloudflare request headers at redirect time. No IPs, no fingerprints, no per-person identifiers. It tells you where and on what, not who.
Batch-creating codes for a list
Single-create is capped at 20 codes per hour per account; over that the API returns 429. When you need many at once — one code per product, table or ticket — use Dynamic Code → Create Many, which maps to POST /v1/dynamic/bulk and accepts up to 200 codes in a single request. Feed it an array of { destination, label } rows (e.g. from a Spreadsheet or Split In Batches upstream) and apply an optional shared Theme across the batch.
For the full bulk patterns — chunking a large list into 200-row requests and folder organisation — see bulk QR code generation.
When to skip the node
The community node is the easiest path, but the API is plain HTTP with a Bearer header, so n8n's built-in HTTP Request node speaks it too — useful on locked-down instances that disallow community nodes. Method POST, URL https://openqr.uk/v1/dynamic, an Authorization: Bearer oqr_… header and a JSON body with destination. The node just saves you that wiring and gives you typed fields and error handling. For the endpoint reference an HTTP node would target, the OpenAPI spec is at https://openqr.uk/openapi.json.