Here is a request that used to be an afternoon:
"Create 50 QR codes from this CSV, put them in a folder called Morocco Campaign, and report the scans from last week."
Fifty posters for a campaign across Casablanca, Rabat, Marrakech and Fes, each with its own code so you can tell which street corner is working. The spreadsheet already exists — somebody made it to brief the printer. What does not exist yet is the codes, somewhere tidy to keep them, and a way to see how they are doing.
If your account is connected to an AI assistant, that sentence and the attached file are now the whole job. This post is about what happens between the two, because the difference between an assistant that helps and one that makes a mess is almost entirely in the details.
What the assistant actually does
It is three steps, and the assistant takes them in order:
- Makes the codes — all fifty in one call, not fifty calls.
- Files them in Morocco Campaign, making the folder if you do not have one.
- Reports the scans for last week, for that folder, code by code.
Each of those has one way of going quietly wrong, and each is designed out rather than left to the assistant to be careful about.
1. Fifty codes, or none
The CSV goes over as it is. The header row names the columns, and the names are the ones the create form uses — name and url for a plain link, plus anything else you want: type, a custom short link, an expiry date, a utm_campaign tag, or the fields a WiFi, vCard or WhatsApp code takes. A semicolon-separated file works as well as a comma-separated one, and so does the invisible byte-order mark Excel puts at the start of a “CSV UTF-8” export — which matters, because a spreadsheet saved in Morocco or France is not shaped like one saved in the US.
The important part is when the checking happens. Every row is checked before the first code is created. If row 38 has htps:// in it, nothing is made, and the assistant hears back “row 38: that is not a valid URL” — alongside every other problem in the file, each with its row number. Fix the file, send it again.
The alternative sounds friendlier and is much worse. Create the 49 that worked and skip the one that did not, and you now have a folder and a spreadsheet that disagree, no easy way to tell which line is missing, and no way to simply run the file again without making 49 duplicates. So it is all or nothing, on purpose. The same rule applies to your plan: if fifty codes would take you past it, none are made, rather than the first forty.
A misspelled column is refused too. A header of utm_campain would otherwise be skipped on all fifty rows, silently, and you would find out when the campaign report came back without the tag. And if you would rather look before anything is made, ask for a dry run: the same checks, nothing created, and the list of what would be.
2. The folder you named, not a second one
“Put them in a folder called Morocco Campaign” is a request for that folder, so if it does not exist it is made. If it does, it is used — and “morocco campaign” in lower case finds “Morocco Campaign” rather than creating a near-duplicate beside it, which is the tidy-up nobody notices until they are looking for something.
Folders are private. Filing a code changes nothing a scanner sees; it is how the fifty campaign codes stay findable among everything else on the account — and how you later download them all at once for the printer, or re-point every one of them in a single sentence when the landing page moves.
3. Last week, meaning last week
“Last week” sounds unambiguous and is not. A dashboard’s “last 7 days” on a Wednesday is last Wednesday to today; what a person means is Monday to Sunday of the week before this one. And it has to be your Monday: a scan at half past midnight on Monday in Casablanca is still Sunday evening in UTC, and a report that cuts the week at the server’s midnight rather than yours puts it in the wrong week.
So the report is a calendar week in your account’s timezone. It comes back with the total against the week before, unique visitors, a day-by-day line, the top countries and devices, and every code in the folder with its own count — the ones nobody scanned included, because on a fifty-poster campaign that list is the useful one. A code with no scans is on a wall nobody walks past, or printed too small, and both are worth knowing about this week rather than next month.
Scans are people only. Link previews, crawlers and uptime monitors are detected and left out, and reported as a separate figure so a quiet week has an explanation. The numbers are the same ones the scheduled report emails carry, because they come from the same place.
The honest answer on day one
If you ask all three things in one breath, the report part has an awkward truth in it: codes created a minute ago were not scanned last week, because last week they did not exist. A report that simply said “0 scans” would read as a failed campaign.
So it says what actually happened — every code in this folder was created after last week ended, so none of them could have been scanned yet — and the assistant passes that on. Ask again next Monday and the same sentence gets you the real numbers. Better still, ask for a scheduled report on the folder and it arrives by itself every Monday morning.
Writing the CSV
The smallest useful file is two columns:
name,url
Casablanca – Maarif 01,https://example.com/ma?p=casa-maarif-01
Rabat – Agdal 01,https://example.com/ma?p=rabat-agdal-01
Marrakech – Gueliz 01,https://example.com/ma?p=marrakech-gueliz-01
A few habits make the results easier to read later:
- Name codes after where they will be, not what they point at. Fifty codes all pointing at the campaign page are only distinguishable by their names in a report.
- Add a
utm_campaigncolumn — or ask for one tag on every row — so the visits show up grouped in your web analytics too. - Keep one row per printed piece. Two posters sharing a code share their scans; if you want to know which one worked, they need one each.
- Use a
slugcolumn if you want memorable short links; two rows asking for the same one are caught before anything is made.
Where this fits
Bulk creation has been in the dashboard for a while, as an upload. What changes with an assistant is that the upload stops being a separate errand: the codes, the folder and the report are one request, made in the same conversation where you were already planning the campaign — and the same connection can later re-point all fifty codes, restyle them, or tell you which city is winning.
It works with Claude, ChatGPT, Cursor and any other assistant that speaks MCP, on the Pro and Team plans. The setup guide takes about two minutes per assistant; the feature page covers everything else it can do — and the one thing it cannot, which is delete anything.