← CodeQR - Link and QR AnalyticsCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to CodeQR - Link and QR Analytics
Snapshot Sep 30, 2026 · 22:55 UTC · version 2.0.0
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "bulk-qr-codes",
"description": "Create a dynamic QR code or trackable short link for every row of a list, spreadsheet, or CSV in CodeQR, using predictable keys so any of them can be re-pointed later without reprinting. Triggers on bulk phrasing such as for each, every, one per, or a pasted list of destinations. Not for a single one-off code, not for reading or decoding an existing QR image, and not for offline or static QR generation.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 609
}
],
"skill_md_contents": "---\nname: bulk-qr-codes\ndescription: Create a dynamic QR code or trackable short link for every row of a list, spreadsheet, or CSV in CodeQR, using predictable keys so any of them can be re-pointed later without reprinting. Triggers on bulk phrasing such as for each, every, one per, or a pasted list of destinations. Not for a single one-off code, not for reading or decoding an existing QR image, and not for offline or static QR generation.\n---\n\n# Bulk QR codes and short links\n\nCreate one CodeQR destination per row of a list, so the whole set can be measured\nand re-pointed later without reprinting anything.\n\nDo all of this through the CodeQR MCP tools. Never generate a QR image locally and\nnever call the CodeQR REST API directly: the connector already holds the user's\nauthorization, and a locally generated image cannot be re-pointed or measured,\nwhich is the entire reason to use this workflow.\n\n## Choose one resource type\n\n- **Dynamic QR code** — `create_qrcode`. Use when the destination will be printed:\n signage, packaging, menus, labels, property boards.\n- **Short link** — `create_link`. Use when the destination will be sent, posted,\n or clicked.\n\nIf the user has not said which, ask once. Do not create both for the same row.\n\n## Before creating anything\n\n1. Read the source list. Extract per row: the destination URL, and a label that\n identifies the row (property name, job title, product SKU).\n\n2. Derive a `key` for each row from its label — lowercase, ASCII, words joined by\n hyphens, no spaces — prefixed with a short batch name shared by the whole set,\n for example `spring-menu-01`, `spring-menu-02`.\n\n The key is how the user finds and re-points one specific code months later.\n Omitting it gets a random 7-character slug and defeats the workflow, so always\n set it.\n\n3. Show the row count and the **first two rows fully resolved** — label,\n destination, key — and get the user's confirmation before creating the rest.\n\n Confirmation is not optional here. Each call publishes a live endpoint on the\n public internet and consumes the workspace's plan quota, and a wrong prefix\n across 200 rows is 200 codes to clean up by hand.\n\n## Creating\n\nThere is no bulk endpoint. Call the tool once per row, in list order.\n\n- `create_qrcode` — pass `url`, `key`, and `type: \"url\"`.\n- `create_link` — pass `url`, `key`, and `tagIds` when the user wants the batch\n tagged. Create the tag first with `create_tag` and reuse its ID for every row.\n\nA batch does not have to be links. `create_qrcode` also encodes Wi-Fi networks,\ncontact cards, WhatsApp chats, email, SMS, phone numbers, plain text and crypto\nrequests — one per room, per branch, per sales rep. Pass `type` and the payload\nnamed after it on every row, exactly as for a single code. The field names have\ntraps in them, so follow the `wifi-and-contact-qr-codes` skill for the payload\nand this one for the batch mechanics.\n\n`create_qrcode` exposes no tag parameter through this connector, so a batch of QR\ncodes cannot be tagged as it is created. Say that the connector cannot tag them\nhere — do not say CodeQR cannot tag QR codes, because the dashboard can — and\noffer the shared key prefix as the way to group the batch instead.\n\nIf a row fails, record the failure and continue with the remaining rows. Report\nevery failure at the end. Do not stop the batch silently, and do not retry a row\nthat failed on a plan or quota limit — the retry fails the same way.\n\n## Report back\n\nReturn one table, one row per input row:\n\n| label | key | short link | destination | status |\n\nThe user pastes this back into their source sheet, so the key and short link\ncolumns matter more than prose. Do not collapse the table into a summary.\n\n## Re-pointing later\n\nWhen the user returns to change destinations:\n\n1. Find the codes. `list_links` accepts `search`, so filter by the batch prefix\n there. `list_qrcodes` takes only `page` — there is no server-side search, so\n page through the results and match the key prefix yourself.\n2. Call `update_qrcode` or `update_link` per code with the new `url`.\n\nTwo rules for this step:\n\n- **Never change `key` on a re-point.** `update_link` accepts a new key, and\n using it rewrites the short link itself and breaks every copy already printed\n or shared — the opposite of what this workflow exists for. Change `url` only.\n (`update_qrcode` cannot change the key at all, which is the safer default.)\n\n- **`update_qrcode` reaches printed copies only for dynamic QR codes.** A static\n QR code encodes the destination directly in its printed pattern: the stored\n record changes, and anything already printed keeps leading to the old\n destination forever. Check before promising the change reached the paper.\n\n## Measuring the batch\n\n`get_analytics` with `event: \"scans\"` for QR codes and `event: \"clicks\"` for\nshort links. Pass `qrcodeId` or `linkId` for one code, or omit both for the whole\nworkspace. `groupBy` accepts time, country, city, device and browser.\n"
}SHA-256: d37da3bee8fb835a59410f36c363ab2ef04bf3b52ddceec56e8cbc80abc20de7