Calendar Event QR Codes on Snapkit (Google Calendar Links in the URL Tab)

Snapkit has no Calendar tab. Encode a Google Calendar HTTPS template, share link, or hosted .ics URL in the URL tab: official query keys, what the PNG holds, iPhone vs Android, and Dynamic pitfalls.

Andrei Haiducu
14 min read

Snapkit’s homepage has URL, Text, WiFi, Contact, SMS, Email, and Phone. There is no Calendar tab, no VEVENT builder, and no geo pin. An “add this event to my calendar” QR is a URL QR. You paste a finished https://calendar.google.com/… address (Google’s documented template, or the share / publish link Calendar already copied for you), download the PNG, and the camera opens that HTTPS link. Google Calendar does the rest.

This page is the calendar URL construction and the Snapkit wiring. It is not a rewrite of the events lifecycle guide (registration, check-in, WiFi, sponsors), the URL vs Text field map, or how Snapkit generates codes (that article only notes calendar is not a tab). Those pages never teach action=TEMPLATE or dates=.

Four-step flow: Snapkit URL tab encodes a Google Calendar HTTPS link, camera scans the PNG, the template URL opens, Google Calendar shows an add-event draft

What the QR actually encodes

An add-to-calendar code on this product is a website URL. The printed modules are not a calendar account, a Snapkit event object, or an iCalendar payload Snapkit assembled for you. They are the same kind of URL payload as any other URL-tab code.

On scan, the camera treats it like any other https:// link. If the destination is Google’s event-edit template, Google Calendar opens a prefilled draft. The event is not on anyone’s calendar until that person taps Save (and is signed in). That is the same honesty as Snapkit’s SMS tab: the QR starts a draft.

If you instead encode a hosted .ics URL, the phone downloads or offers to import a file. Snapkit still only encoded the HTTPS address. We do not parse BEGIN:VEVENT.

Test the live URL in a browser before you print. A broken dates= value still makes a scannable PNG.

Exact URL formats (Google Calendar)

Google’s current Calendar API docs publish one add-yourself link shape. Use that when you are building the string by hand.

Documented template (r/eventedit). Required idea: action=TEMPLATE, a dates= start/end pair, and a text= title. Time zones go in stz and etz as IANA names. Description and venue are details and location. Encode spaces and punctuation. Encode the slash between the two instants as %2F.

https://calendar.google.com/calendar/r/eventedit?action=TEMPLATE&dates=20261015T220000Z%2F20261016T000000Z&stz=America/Los_Angeles&etz=America/Los_Angeles&details=Tour%20starts%20at%20the%20lobby&location=123%20Market%20St&text=Open%20House

That example is 3:00–5:00 p.m. on 15 October 2026 in America/Los_Angeles, expressed as UTC instants (…T220000Z / next-day T000000Z) the way Google’s own sample does.

All-day, same official dates= field, date-only, exclusive end (the day after the last day you want on the calendar):

https://calendar.google.com/calendar/r/eventedit?action=TEMPLATE&text=Community%20Cleanup&dates=20261015%2F20261016&details=Bring%20gloves

Share / publish link from the Google Calendar UI. Open the event → more menu → Publish event (wording varies) → copy the URL. The product emits a TEMPLATE link that already carries the event, typically:

https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=…&tmsrc=…

Do not invent tmeid. It is an encoded event-plus-calendar token Calendar generated. If the source calendar is not visible to guests, that link can open a blank untitled draft—the usual “I published an event on a private calendar” failure. Copy, open in an incognito window, confirm the title and times, then paste into Snapkit.

Older render entry. https://calendar.google.com/calendar/render?action=TEMPLATE&text=…&dates=… still lands on the same editor. Prefer the r/eventedit form Google documents today unless a tool you already use emits render.

View link (eid=). Calendar’s htmlLink looks like https://www.google.com/calendar/event?eid=…. That is a view of an existing event for people who already have access. It is not the documented add-yourself template. Do not print it as an “add to calendar” mark unless you have tested that a guest account can open it.

Snapkit’s URL field encodes whatever you typed. There is no silent https:// prefix and no calendar formatter. Paste the finished URL, including the scheme.

You type in the URL tabWhat the PNG holdsWhat you wanted
Full r/eventedit?action=TEMPLATE&dates=…&text=…That exact stringPrefilled Google Calendar draft
Copied calendar/event?action=TEMPLATE&tmeid=…&tmsrc=…That exact stringSame, using Calendar’s own share URL
https://yoursite.example/open-house.icsThat exact stringFile import / subscribe, not a Google draft
calendar.google.com/calendar/r/eventedit?… (no scheme)Bare hostOften shown as text; one brand may guess a site
webcal://yoursite.example/open-house.icsCustom schemeMany cameras ignore it; no web fallback
BEGIN:VEVENT pasted hereA non-URL stringCamera does not open Calendar

Build query values with a real encoder (encodeURIComponent in a console, or any URL encoder). Do not leave raw spaces, &, or # in text, details, or location. Those split or truncate the payload inside the QR.

dates= rules that actually break the draft

Google’s sample uses compact ISO 8601: YYYYMMDDTHHMMSSZ for a UTC instant, two values joined by / (write %2F in the query). Both ends are required for a timed event.

You wroteWhat Google typically doesFix
dates=2026-10-15T15:00:00/2026-10-15T17:00:00Hyphens and colons; draft times vanish or ignore the pairCompact: 20261015T220000Z%2F20261016T000000Z
dates=20261015T150000Z (no end)Incomplete pairAlways start%2Fend
start=20261015T150000Z or date=Keys Google’s template does not documentdates= only
dates=20261015/20261015 for all-dayExclusive end collapses the dayEnd = next calendar day
Local wall time plus a leftover ZHour shifts by the UTC offsetEither real UTC + Z, or omit Z and set stz / etz
ctz=… instead of stz / etzUnofficial; do not rely on itUse the IANA names Google documents

stz and etz are IANA Time Zone Database names (America/Los_Angeles, Europe/Brussels). They are not offsets like UTC-7.

Hosted .ics (when Google is not the audience)

A public https:// URL that serves a .ics file is still a URL QR. iPhone Safari often offers Add to Calendar. Android may download the file or hand it to Google Calendar. You host the bytes; Snapkit only encodes the address.

Use this when the room is mixed Apple Calendar / Outlook / Google, or when you do not want to force a Google sign-in. Keep the file small (one VEVENT, or a short calendar). A 200-event feed densifies nothing in the QR—the QR is still short—but the import is a different product.

Do not encode webcal://. It is the same class of mistake as whatsapp:// on the WhatsApp guide: many camera apps will not open a custom scheme. Publish https://, and let the OS map the file type.

A Google Calendar public iCal URL (…/calendar/ical/…/public/basic.ics) is a subscribe-to-this-calendar feed, not a one-shot add of a single session. That is fine for a season schedule. It is the wrong object for “put this open house on my calendar.”

Apple documents calendar subscription from a web address (Calendar on Mac: File → New Calendar Subscription). Apple does not publish a Google-style eventedit query string. Microsoft’s Outlook.com compose URLs exist in the product, but Microsoft does not ship a stable public parameter spec. If Outlook is the audience, copy an add/share link from Outlook itself after you have opened it in a private window—or host .ics on HTTPS. Do not invent startdt= / rru= keys here.

URL tab vs Text (and why VEVENT does not help)

Three things look like “put the event in the code.” Only one is the Snapkit path.

URL tab with a Google Calendar template or hosted ICS opens add-event; Text only shows words

JobSnapkit tabEncoded payloadOpensDynamic toggle?
Add to Google CalendarURLhttps://calendar.google.com/calendar/r/eventedit?action=TEMPLATE&… or a copied TEMPLATE share linkGoogle Calendar draftYes — URL only
Import a file / mixed calendar appsURLhttps://…/event.icsBrowser + OS import sheetYes — URL only
Show the date as wordsTextExact charactersOn-screen textNo

Putting BEGIN:VEVENT in Text does not create a Calendar tab Snapkit does not have. Some third-party scanner apps notice iCalendar text and offer an import. iPhone Camera and stock Android Camera usually show a block of text. URL vs Text is the tab choice; this page is the destination string.

Putting the registration form in the URL tab is a valid event ops code. It is not an add-to-calendar code. That job lives on QR codes for events.

Static vs Dynamic for calendar destinations

The homepage checkbox Make this QR Code Dynamic (Editable) exists only on URL. Static generation stays in the browser. Dynamic encodes https://snapkit.store/r/…, then a 302. Details: static vs dynamic and how Snapkit generates codes.

Static PNGDynamic /r/
What the modules holdThe calendar HTTPS URL itselfSnapkit short link
Long eventedit queryPattern densifies; print largerShort /r/ stays loose
Change the time after printReprintRetarget the destination
Works if Snapkit is unreachableYesNo — scan never leaves /r/
Free trial expiredn/aLands on /expired
First URL the camera openscalendar.google.com or your .ics hostsnapkit.store
Scan countsNo (this product does not invent pixel analytics on static files)Yes, on a paid dynamic plan

A hand-built template URL is long. That is the one honest reason Dynamic is tempting: fewer modules. The cost is the extra hop. App handoff into Google Calendar is more reliable when the first URL is already calendar.google.com. For a poster you will not reprint, static + a copied (shorter) publish link, or static + a short https://yoursite/event.ics, is the boring default.

Do not share one Dynamic short link across “add to calendar” and “buy tickets.” Retargeting the dashboard to a menu or a registration form is how a lobby sign stops adding the event.

After the scan: iPhone vs Android

The PNG holds a URL. The OS decides what happens next. Camera apps are not identical.

SituationTypical resultDo not assume
Google TEMPLATE URL, iPhone CameraPreview of the https://calendar.google.com/… link, then Safari (sign-in) or the Google Calendar app if it claims the hostThat Apple Calendar opens and saves with one tap
Google TEMPLATE URL, Android Camera / LensPreview, then Chrome or the Google Calendar app compose sheetEvery OEM uses the same chrome
Guest is not signed into GoogleSign-in wall, then the draftThat a calendar event appears with no account
Hosted https://… .ics, iPhoneSafari download / Add to CalendarThat Google Calendar is involved
Hosted .ics, AndroidDownload or Google Calendar importA silent save with no prompt
webcal:// in the QRMany cameras show nothing usefulA Magical Apple-only fallback
Dynamic URL, destination is CalendarBrowser to Snapkit, 302, then the same as aboveHandoff as clean as a first-party Calendar URL
Airplane / dead dataCamera may lock; opening Calendar still needs a networkOffline import the way a Text QR would

Universal Links / App Links fire on an https://calendar.google.com/… navigation when the Google Calendar app is installed. They do not fire on a webcal:// string, and they do not fire on raw BEGIN:VEVENT text.

Test the downloaded PNG on one iPhone and one Android. Confirm the draft title, start, and end (timezone included). Confirm Save is still required. Confirm the no-account path is a sign-in you can live with, not a dead custom scheme.

Mistakes that break “add event”

Wrong dates= keys, VEVENT in Text, and Dynamic /r/ redirects that never reach Calendar

What you didWhat the scan doesFix
dates= with hyphens/colons, or a missing endDraft opens untitled or at the wrong hourCompact ISO pair, %2F between instants
Guessed keys (start=, date=, title=)Google ignores themtext, dates, stz, etz, details, location
All-day end equal to startZero-length dayExclusive end = next date
Local clock + leftover ZEvent lands in the wrong zoneUTC + Z, or no Z plus stz/etz
Calendar URL without https://Locks, then text or a one-brand openType the full scheme in the URL tab
webcal:// or BEGIN:VEVENT in TextWords, or a camera that does nothingURL tab, https:// calendar or .ics
https://calendar… pasted into TextWords on screen; maybe a chipURL tab
Printed an eid= view linkGuest sees “no access” or a sign-in loopTEMPLATE URL, or a public publish link you tested logged out
Private-calendar publish tmeidBlank untitled eventPublish from a calendar guests can read, or build eventedit by hand
Encoded the registration pageForm opens; nothing is saved to CalendarDifferent job — see events
Dynamic URL, destination is CalendarPNG encodes /r/…, then a 302Works only while the redirect is live and still points at Calendar
Dynamic, free trial expiredScan hits /expiredPaid plan, or a static calendar PNG
Dynamic, you later retarget to a menuLobby poster opens lunchDo not share that short link across jobs
Screenshot of the 256 px previewSoft modules after printDownload PNG (~1024 px)

Dynamic on a calendar destination is the subtle one. The print encodes https://snapkit.store/r/…, not calendar.google.com. The phone must reach Snapkit, get a 302, then land on the template. That extra hop is why you can retarget a slipped start time without reprinting. It is also why an expired trial, a typo in the dashboard, or Snapkit being unreachable means no add-event. For a sticker you will not reprint, static https://calendar.google.com/… (or a short hosted .ics) is the correct default.

Build list (this product)

  1. Open snapkit.store. Choose URL. Not Text. Not Contact. There is no Calendar tab.
  2. Build or copy the address. Prefer Google’s r/eventedit?action=TEMPLATE with dates= + text= (optional stz, etz, details, location), or paste the Publish / share TEMPLATE link Calendar already made. Or host one .ics on https:// and copy that.
  3. Open that URL in a browser. Confirm the draft title and times. Then paste the finished URL into Website URL. Include https://.
  4. Leave Dynamic unchecked unless you have a reason to retarget or to shorten a long query, and you have tested the /r/ hop on both phone brands.
  5. Download PNG. Do not screenshot the 256 px box.
  6. Scan the file on an iPhone and an Android. Confirm Save / Add is still yours to tap. Confirm a signed-out guest sees a path you accept.
  7. Print the mark with a quiet zone and the human-readable date beside it. A dead camera lock is size, contrast, or crop — start at QR code won’t scan, not at dates=.

The generator’s job is the PNG. Google Calendar’s job (or the phone’s ICS importer) is the draft. The URL tab is the only Snapkit control that connects the two.

Ready to create your QR code?

Try Snapkit's free QR code generator - no signup required.

Generate QR Code