A Google Calendar link opens the "new event" screen in Google Calendar with the title, time, location and description already filled in. Your visitor checks the details and clicks Save. You can put the link in an invitation email, a webinar confirmation page or an "Add to calendar" button, and it needs no API key or sign-in on your side.
Google Calendar Event Link Generator
The link opens a prefilled event in Google Calendar that the visitor saves with one click. Without an end, a timed event lasts one hour.
Enter a title and a start time to build the linkKey Takeaways
- 1The link starts with calendar.google.com/calendar/render?action=TEMPLATE
- 2text is the event title; dates holds START/END separated by a slash
- 3Timed events use YYYYMMDDTHHMMSS; add a trailing Z for UTC
- 4All-day events use YYYYMMDD, and the end date is the day after the last day
- 5URL-encode every value; Google documents only part of this format
What Google Documents, and What It Doesn't
This link format is used widely, but Google describes it in only one short place. Before you rely on a parameter, check where its behaviour comes from. The sections below label each parameter as documented (on a current Google page), retired doc (on a Google page that is no longer online) or community-observed (seen working by developers, not promised by Google).
The current source is the Google Calendar API guide Invite users to an event (last updated 2026-09-03). Under "Provide a link for users to add the event" it gives this template:
https://calendar.google.com/calendar/r/eventedit?action=TEMPLATE&dates=20230325T224500Z%2F20230326T001500Z&stz=Europe/Brussels&etz=Europe/Brussels&details=EVENT_DESCRIPTION_HERE&location=EVENT_LOCATION_HERE&text=EVENT_TITLE_HERE"This method creates a distinct event on the user's calendar, which you can't update unless you have access to the user's calendar."
Google's template uses the /calendar/r/eventedit path. The generator on this page uses /calendar/render, the older path that most add-to-calendar tools use. Both take the same action=TEMPLATE parameters; that the render path keeps working is community-observed, not stated by Google.
Google once published an "event publisher" guide for these links. That page is gone from google.com, but the Internet Archive keeps a copy from February 2012. It used the google.com/calendar/event path and listed a few parameters the current page leaves out.
URL Parameters Reference
The table lists each parameter, what it does and where its behaviour comes from. Treat anything marked community-observed as something to test with your own link before you send it to a large list. Google can change it without notice.
| Parameter | What it does | Status |
|---|---|---|
action=TEMPLATE | Opens the event editor with a new, prefilled event. Required. | Documented |
text | Event title. Must be URL-encoded. | Documented |
dates | START/END. Google documents the UTC form ending in Z; local times and all-day dates are community-observed. | Documented (UTC form) |
details | Event description. Must be URL-encoded. | Documented |
location | Event location: an address, a place name or a meeting URL. Must be URL-encoded. | Documented |
stz / etz | Start and end time zone as IANA Time Zone Database names. | Documented |
ctz | IANA time zone name (for example Europe/Brussels) for both start and end. | Community-observed |
add | Email address of a guest to invite. Can be repeated. | Retired doc |
recur | Repeat rule in RFC 5545 RRULE syntax, for example RRULE:FREQ=WEEKLY. | Community-observed |
src | Email address of the calendar to add the event to, if the visitor has access to it. | Community-observed |
The community-observed rows come from developer write-ups such as the add-event-to-calendar-docs project, not from Google. Next, here is how the most important parameter, dates, behaves in each of its three forms.
The dates Parameter: Three Formats
Most broken calendar links fail on dates. It always holds two values separated by a slash, START/END, and both must use the same format. The slash may be sent as-is or encoded as %2F; Google's own template encodes it.
Timed Event in Local Time
https://calendar.google.com/calendar/render?action=TEMPLATE&text=Team%20sync&dates=20261006T143000%2F20261006T153000&ctz=Europe%2FBrusselsWithout a trailing Z, the time is a wall-clock time. With ctz it is read in that time zone; without ctz it is read in the visitor's own calendar time zone. This is what the generator above produces. Both behaviours are community-observed.
Timed Event in UTC
https://calendar.google.com/calendar/render?action=TEMPLATE&text=Team%20sync&dates=20261006T123000Z%2F20261006T133000ZA trailing Z marks the time as UTC, the form shown in Google's documented template. Google Calendar then shows the event in each visitor's own time zone. Use this form when you already store event times in UTC, so you do not have to work out the offset by hand.
All-Day Event
https://calendar.google.com/calendar/render?action=TEMPLATE&text=Team%20offsite&dates=20261006%2F20261009All-day events use plain dates, YYYYMMDD, with no time. The end date is exclusive: it is the day after the last day. For a single all-day event on 6 October, write 20261006/20261007. Google does not document this for links, so it is community-observed; it matches how iCalendar files handle all-day events, where RFC 5545 says the "DTEND" property "specifies the non-inclusive end of the event" (RFC 5545, section 3.6.1).
The generator above builds timed events. If you leave the end empty it adds one hour to the start. For an all-day event, edit the dates value by hand using the format shown here.
Description: Plain Text or HTML?
The retired Google guide said of details: "Simple HTML is allowed." (Google event publisher guide, archived 2012). The current Google page only says the description "Must be URL encoded." and says nothing about HTML.
Plain text is the safest choice. A line break is encoded as %0A, and a join link can go in as a bare URL. Simple tags such as <b> or <a> may display, but that is not guaranteed by any current Google page, and other calendar apps that later sync the event may show the tags as text.
Recurring Events and Guests
Two more parameters show up in many tutorials. Neither appears on a current Google page, so test them before you depend on them.
https://calendar.google.com/calendar/render?action=TEMPLATE&text=Weekly%20standup&dates=20261005T090000%2F20261005T091500&ctz=Europe%2FBrussels&recur=RRULE%3AFREQ%3DWEEKLY%3BBYDAY%3DMOrecur takes a repeat rule in the iCalendar RRULE syntax defined in RFC 5545, section 3.8.5.3. The colon, equals sign and semicolon in the rule must be encoded. add=guest@example.com invites a guest; it was listed in the retired Google guide. Neither behaviour has been tested for this page.
An "Add to Calendar" Button
Most people use these links behind a button on a confirmation page or in an email. The link is a normal <a> element, so it works without JavaScript and in email clients that strip scripts.
<a href="https://calendar.google.com/calendar/render?action=TEMPLATE&text=Product%20launch%20webinar&dates=20261020T160000Z%2F20261020T170000Z&details=Join%20link%3A%20https%3A%2F%2Fexample.com%2Fwebinar&location=Online"
target="_blank"
rel="noopener noreferrer"
class="add-to-calendar">
Add to Google Calendar
</a>The event time is in UTC (Z), so every visitor sees it in their own time zone. Inside an HTML attribute the & between parameters may also be written as &; browsers read both the same way.
Building the Link in Code
If you generate links for many events, build them with URLSearchParams or encodeURIComponent so that every value is encoded correctly. This function mirrors what the generator on this page does.
// "2026-10-06T14:30" -> "20261006T143000"
function stamp(local) {
return local.replace(/[-:]/g, '') + '00';
}
function googleCalendarLink({ title, start, end, details, location, timeZone }) {
const params = new URLSearchParams({
action: 'TEMPLATE',
text: title,
dates: `${stamp(start)}/${stamp(end)}`,
});
if (details) params.set('details', details);
if (location) params.set('location', location);
if (timeZone) params.set('ctz', timeZone); // IANA name, e.g. "Europe/Brussels"
return `https://calendar.google.com/calendar/render?${params}`;
}
googleCalendarLink({
title: 'Team sync',
start: '2026-10-06T14:30',
end: '2026-10-06T15:30',
location: 'Room 1',
timeZone: 'Europe/Brussels',
});URLSearchParams encodes spaces as + rather than %20. Both are standard ways to encode a space in a query string; the generator on this page uses %20.
ICS Files for Outlook and Apple Calendar
A Google Calendar link only adds the event to Google Calendar. Visitors who use Outlook or Apple Calendar need an iCalendar (.ics) file, the standard format defined in RFC 5545. Many sites offer both: a Google link and a "Download .ics" link.
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp//Event//EN
BEGIN:VEVENT
UID:20261006-team-sync@example.com
DTSTAMP:20261001T090000Z
DTSTART:20261006T123000Z
DTEND:20261006T133000Z
SUMMARY:Team sync
LOCATION:Room 1
DESCRIPTION:Weekly sync.\nAgenda in the shared doc.
END:VEVENT
END:VCALENDARUID, DTSTAMP and PRODID are required by RFC 5545. RFC 5545 also specifies CRLF line endings. Serve the file with the text/calendar media type so that the browser hands it to the calendar app.
Common Mistakes
These are the errors to check first when a calendar link opens with the wrong time, the wrong day or a cut-off title.
| Mistake | What happens | Fix |
|---|---|---|
| All-day end date equal to the last day | The event can end a day early | Set the end to the day after the last day: 20261006/20261007 for one day |
| Values not URL-encoded | An & or # in the title or description cuts off the rest of the link | Encode every value with encodeURIComponent or URLSearchParams |
| Local time without ctz | Each visitor sees the time in their own calendar zone, so the meeting moves | Add ctz with an IANA name, or convert to UTC and add Z |
| Z added to a local time | The time is read as UTC and shifts by your offset | Use Z only for times that really are in UTC |
| Time zone abbreviation such as CET or EST | Not an IANA name, so it may be ignored | Use names like Europe/Brussels or America/New_York |
| Start and end in different formats | The dates may not be read | Use dates for both, or date-times for both |