OpenQR

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. 1

    Open community nodes

    Go to Settings → Community Nodes in your n8n instance.

  2. 2

    Install

    Click Install, enter n8n-nodes-openqr, accept the risk prompt and confirm.

  3. 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. 1

    New credential

    In n8n, add a new OpenQR API credential and paste your oqr_… key.

  2. 2

    Leave the base URL

    Keep Base URL as https://openqr.uk unless you're pointing at a self-hosted or staging instance.

  3. 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:

ResourceOperationCallsUse it for
QR CodeGeneratePOST /v1/qrRender a static SVG/PNG to a binary field
Dynamic CodeCreatePOST /v1/dynamicMint one re-pointable oqr.to code
Dynamic CodeCreate ManyPOST /v1/dynamic/bulkUp to 200 codes in one step
Dynamic CodeGet ManyGET /v1/dynamicList your codes (limit 1–500)
Dynamic CodeUpdatePATCH /v1/dynamic/{id}Re-point, rename, re-slug, tag, file or restyle
Dynamic CodeDeleteDELETE /v1/dynamic/{id}Remove a code
Dynamic CodeGet ScansGET /v1/dynamic/{id}/scansTotals + country/device/referrer breakdowns
FolderCreate / Get Many / Rename / Delete/v1/foldersOrganise codes
ThemeCreate / Get Many / Delete/v1/themesSaved 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. 1

    Create the dynamic code

    Add OpenQR → Dynamic Code → Create. Set Destination to a public http(s) URL — say a holding page, https://example.com/launch-soon — and add an optional Label like "Summer poster" under Additional Fields. The node returns { id, slug, short_url, destination }.

  2. 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) and short_url (the link you print). The printed QR encodes the short_url, so it never changes.

  3. 3

    Render the QR for printing

    Add OpenQR → QR Code → Generate with Data mapped from the previous step's short_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.

Get a free API keySign in with a magic link, mint a key, install n8n-nodes-openqr, and your first workflow is minutes away. The API and dynamic codes are free.
In your n8n instance go to Settings → Community Nodes → Install, enter n8n-nodes-openqr and confirm. On self-hosted n8n you can also run npm install n8n-nodes-openqr in the data directory and restart. Then add an OpenQR API credential with a free oqr_ key from openqr.uk/api.

Related reading