Quick answer: Make a QR code that adds an event to someone’s calendar — name, date, time, location and description, already filled in. It carries a standard iCalendar event, so no app is needed on either side. This is the one kind of code a scan check cannot verify: it can decode perfectly and still hold the wrong date, so the payload is parsed with two real calendar libraries instead.
An event QR code carries a whole calendar entry — name, date, time, location and description — as text inside the pattern. Scanning it offers to add the event, already filled in. It works on an invitation, a poster, a conference badge, a ticket or an email signature, and it needs no app and no account on either side.
Every other kind of code either works or does not. A link opens; a WiFi code joins or refuses. An event code is different: it can decode flawlessly and still put the wrong thing in someone’s diary, because everything that goes wrong happens after the scanner has finished. The picture is not where the fault is.
So we check these by parsing the payload with two real calendar libraries — ical.js, the parser Thunderbird uses, and node-ical — and looking at the event that comes out the other side. Three of the traps below were in our own first version.
An all-day event ends on the following day
This is the trap in the standard itself, and it catches weddings in particular. For an all-day event the end date is exclusive: it marks the first day the event is not happening. So a wedding on 20 June has to be written as 20 June to 21 June.
Written as
What a calendar shows
20 June → 20 June
An event of zero seconds
20 June → 21 June
One full day, correctly
No end date at all
One full day — the sensible default
Leave both time boxes blank in the tool and it does that arithmetic for you: you enter the real dates and it writes the exclusive end. A timed event with no end has the same problem for the same reason — the standard gives it no length — so a start time with no end is given an hour, which is what every calendar application assumes.
An event with no start date is not an event
Type only a name and you would expect an error. Instead the payload parses quite happily and both libraries read the title back. Ask either one when it ends — the question a calendar must answer before it can draw anything — and it fails outright. There is nothing to place, so nothing appears.
That means a generator can hand you a code that scans perfectly, shows a green tick, and does nothing at all when a guest scans it. This tool refuses to build one, and says which field is missing instead.
9am where? The time zone question
There are two honest answers and they produce different codes, so the tool asks rather than guessing.
The clock time where the event is (the default). The time is written with no zone attached, so every phone that scans it shows 9am. This is what an invitation, a poster or a conference badge wants — the code says the same thing as the print beside it, and it stays right even if you built it on a laptop still set to another country.
One moment worldwide. The time is converted to UTC, which is correct for an online event where attendees really are in different places. The tool tells you which zone it converted from, because that is the assumption you are relying on.
What it will not do is name a zone like Europe/London without embedding the rules that define it. We measured what happens when a generator does: the named zone is silently ignored and the time behaves as though it had no zone at all — an official-looking code that quietly does something other than it says. Embedding the definitions properly costs several hundred bytes, and a QR code pays for bytes in printed module size.
What the envelope costs, and why we pay it
A bare BEGIN:VEVENT block is the smallest thing a scanner recognises, and both parsers accept it. It is not valid iCalendar, though — the standard has no such thing as an event outside a calendar — so a strict reader is entitled to refuse it. The same event, three envelopes, at error correction M:
What is in the code
Modules across
Bare VEVENT — smallest, not valid iCalendar
53 × 53
Wrapped in VCALENDAR — valid
61 × 61
Plus UID and DTSTAMP, which the standard requires
65 × 65
That is a real cost — at a fixed printed size, more modules means each one is narrower. We pay it because the wrapper still contains BEGIN:VEVENT, so scanners that hunt for that block find it exactly as before, while strict parsers get something they can accept. The UID earns its own bytes: it is derived from the event, so scanning the same invitation twice updates one entry rather than creating two.
The practical consequence is about the description field. It is the part that grows without limit, and every character makes the printed code finer. On a wedding invitation, where the code might be 20 mm square, keep it to a line.
Printing it on an invitation
An event code carries more than a link does, so it has more modules, and more modules in the same square means each one is smaller. The usual floor is about 0.4 mm per module.
Printed width
Module size, typical event
Verdict
20 mm
0.49 mm
Tight — keep the description very short
30 mm
0.73 mm
Comfortable for an invitation
50 mm
1.22 mm
Poster or badge
The panel under the preview does this sum for the event you actually build. Print from the PDF or EPS — both are true vectors, so a print shop can place the code at any size without a soft edge, and soft edges are what a scanner struggles with at invitation scale.
Weddings, conferences and registration
The three cases people ask about, and what differs between them.
A wedding. All-day, so leave both times blank. Put the venue in the location field — most phones make it tappable, which saves a guest copying an address. Keep the description to one line so the code stays coarse enough to print small on a card.
A conference. Timed, and usually one code per session on the badge or programme. Use the clock-time option, not UTC: attendees are in the room. If sessions run back to back, give each a real end time rather than letting the hour default stand.
Registration. An event code adds a date to a diary; it cannot take a booking. If you need people to register, make a URL code pointing at your form instead, or print both — one to remember the date, one to sign up.
These do not expire, and nobody is counting
The event is inside the pattern. There is no link, no redirect and no account, so nothing can stop working because a subscription lapsed, and no one collects a list of who scanned your invitation. The trade is that a printed code cannot be changed afterwards — if the date moves, you reprint, exactly as you would have done before QR codes existed.
Making it is private too. Your guests’ event, your venue and your notes are turned into a pattern by code running in your own browser: the page has no fetch, no XMLHttpRequest and no form, so none of it has a route off your machine.
Frequently Asked Questions
Choose the Event type, give it a name and a start date, and add the time, location and description if they apply. The code appears as you type. Scanning it offers to add the event to a calendar, already filled in — it carries an iCalendar event, the same format a .ics file holds, so phones and calendar apps understand it without anything being installed.
Because an all-day event’s end date is exclusive in the iCalendar standard — it marks the first day the event is not happening. A wedding on 20 June has to be written as 20 June to 21 June; writing 20 June at both ends produces an event of exactly zero seconds, which we measured with two calendar libraries. This tool does that arithmetic for you, so you enter the real dates. A timed event with no end has the same problem, so a start time with no end is given an hour.
Whichever you choose, and it matters. The default writes the clock time with no zone attached, so 9am shows as 9am on every phone that scans it — right for an invitation or a poster, and it stays right even if you built the code on a laptop set to another country. The other option converts to UTC for an online event where people really are in different places, and the tool tells you which zone it converted from. What it will not do is name a zone without embedding the rules that define it: we measured that a named but undefined zone is silently treated as no zone at all, which looks correct and is not.
Yes, and all-day is the right setting for it — leave both time boxes blank and the tool writes a proper one-day event. Put the venue in the location field, which most phones make tappable so a guest does not have to copy the address. Keep the description to one line: every character makes the printed code finer, and on a 30 mm square on a card that matters. Print from the PDF or EPS so the printer can place it at any size without a soft edge.
Yes. The payload is standard iCalendar, which is what both platforms’ calendars are built on, and the camera apps on current versions of both recognise it and offer to add the event. What differs is presentation — one may show a preview card where the other opens the calendar directly. Because a QR code cannot be tested from inside a browser, scan yours with an actual phone before you commit it to print.
Not by itself. An event code puts a date in someone’s diary; it cannot take a booking, collect a name or issue a ticket, because a QR code holds text and nothing more. For registration, make a URL code pointing at your booking form. Printing both is a reasonable answer: one code to remember the date, one to sign up.
About 30 mm square is comfortable, and 20 mm is the floor. An event carries more text than a link does, so it has more modules, and more modules in the same square means each is smaller — below roughly 0.4 mm per module both printing and scanning start to struggle. The panel under the preview works out the module size for the event you actually build. If it comes out too fine, shorten the description: that is the field that grows.
No. The event is encoded into the pattern itself, so there is no link, redirect or account behind it and nothing that can be switched off or start charging. The trade is that a printed code cannot be edited: if the date moves, you reprint. Generators offering editable event codes work the other way round — the code points at their server, which is what makes it changeable and what makes it stop working when the subscription does.