Skip to content
UseQR

QR code type

Calendar event QR codes — how they work

A calendar QR code stores a minimal iCalendar VEVENT that phones offer to add to the calendar. Always store times in UTC with a trailing Z, or attendees in other timezones get the wrong hour. Nothing is added without the user confirming.

The payload

BEGIN:VEVENT
SUMMARY:Product launch
DTSTART:20260915T180000Z
DTEND:20260915T200000Z
LOCATION:Grand Hall, 12 King Street
DESCRIPTION:Doors at 17:30
END:VEVENT

Most phone cameras accept a bare VEVENT. Some stricter scanner apps want the full BEGIN:VCALENDAR / VERSION:2.0 wrapper, which costs about 40 extra bytes. If the code will be scanned by desktop tools, include the wrapper.

The timezone trap

Three ways to write a time, with very different outcomes:

Form Meaning Use it?
20260915T180000Z 18:00 UTC Yes — unambiguous everywhere
20260915T180000 18:00 local to the reader Only for genuinely local events
TZID=Europe/London:20260915T180000 18:00 London Correct but poorly supported in QR contexts

Floating local time is the default trap: a conference at "18:00" scanned by an attendee whose phone is still on another timezone lands at the wrong hour. Store UTC with the Z suffix and let each device render its own local time.

All-day events

Use a date-only value with the VALUE=DATE parameter, and make DTEND the day after the last day — the end is exclusive:

DTSTART;VALUE=DATE:20260915
DTEND;VALUE=DATE:20260916

Writing the same date for both produces a zero-length event that some calendars discard.

Recurring events

RRULE is part of iCalendar and technically encodable, but phone camera handlers frequently drop it, creating a single occurrence. For a weekly class, point a URL QR code at a hosted .ics file instead — the file can be updated when the schedule changes, which a printed code never can.

Where these work well

  • Conference and session signage, where attendees decide on the spot.
  • Printed invitations and save-the-dates.
  • Class and clinic schedules on a noticeboard.
  • Exhibition labels for time-limited installations.

FAQ

Why does my event show at the wrong time for some people?

The time was stored as floating local time. Use UTC with a trailing Z — for example 20260915T180000Z — and every device converts to its own local time correctly.

Does the event get added automatically?

No. The phone shows a preview and the user confirms. Nothing is written to a calendar without their action.

Can I encode a recurring event?

The RRULE property exists, but phone camera handlers often drop it and create a single occurrence. Link to a hosted .ics file instead for anything recurring.

How do I make an all-day event?

Use DTSTART;VALUE=DATE with a date only, and set DTEND to the day after the last day — the end date is exclusive.

Try it — free, no signup