{"id":69417,"date":"2026-11-04T09:53:45","date_gmt":"2026-11-04T04:23:45","guid":{"rendered":"https:\/\/www.quickonlinetips.com\/archives\/tools\/add-to-calendar-link-generator\/"},"modified":"2026-11-04T09:53:45","modified_gmt":"2026-11-04T04:23:45","slug":"add-to-calendar-link-generator","status":"publish","type":"page","link":"https:\/\/www.quickonlinetips.com\/archives\/tools\/add-to-calendar-link-generator\/","title":{"rendered":"Add to Calendar Link Generator: Event Links and ICS File"},"content":{"rendered":"<p>This free <strong>add to calendar link generator<\/strong> turns your event into ready-made links that open the event in Google Calendar, Outlook.com, Microsoft 365 and Yahoo Calendar, plus a standard <strong>.ics file<\/strong> for Apple Calendar and any other calendar app. Paste the links into emails, invitations, newsletters or your website so people can save the date in one click.<\/p>\n<div class=\"qt-tool\" id=\"qt-cal\">\n<p class=\"qt-label\" style=\"font-size:1.15em;margin:0 0 10px\"><strong>Step 1:<\/strong> Enter the event details<\/p>\n<div class=\"qt-field\"><label for=\"qt-cal-title\">Event title<\/label><input type=\"text\" id=\"qt-cal-title\" maxlength=\"200\" placeholder=\"e.g. Team webinar: 2027 plans\"><\/div>\n<p> <label class=\"qt-check\" style=\"margin-top:12px\"><input type=\"checkbox\" id=\"qt-cal-all\"> All-day event<\/label> <\/p>\n<div class=\"qt-grid\">\n<div class=\"qt-field\"><label for=\"qt-cal-sd\">Start date<\/label><input type=\"date\" id=\"qt-cal-sd\"><\/div>\n<div class=\"qt-field\" id=\"qt-cal-stw\"><label for=\"qt-cal-st\">Start time<\/label><input type=\"time\" id=\"qt-cal-st\" value=\"10:00\"><\/div>\n<div class=\"qt-field\"><label for=\"qt-cal-ed\">End date<\/label><input type=\"date\" id=\"qt-cal-ed\"><\/div>\n<div class=\"qt-field\" id=\"qt-cal-etw\"><label for=\"qt-cal-et\">End time<\/label><input type=\"time\" id=\"qt-cal-et\" value=\"11:00\"><\/div>\n<\/div>\n<div class=\"qt-grid\">\n<div class=\"qt-field\" id=\"qt-cal-tzw\"><label for=\"qt-cal-tz\">Time zone<\/label><select id=\"qt-cal-tz\"><\/select><\/div>\n<div class=\"qt-field\"><label for=\"qt-cal-loc\">Location or meeting link (optional)<\/label><input type=\"text\" id=\"qt-cal-loc\" maxlength=\"300\" placeholder=\"Address, room or https:\/\/ link\"><\/div>\n<\/div>\n<div class=\"qt-field\" style=\"margin-top:12px\"><label for=\"qt-cal-desc\">Description (optional)<\/label><textarea id=\"qt-cal-desc\" class=\"qt-prose\" maxlength=\"3000\" style=\"min-height:110px\" placeholder=\"Agenda, joining details, what to bring...\"><\/textarea><\/div>\n<p class=\"qt-label\" style=\"font-size:1.15em;margin:18px 0 10px\"><strong>Step 2:<\/strong> Press Create calendar links<\/p>\n<p> <button type=\"button\" class=\"qt-btn qt-btn-big\" id=\"qt-cal-go\" style=\"width:100%\">Create calendar links<\/button> <\/p>\n<p class=\"qt-status\" id=\"qt-cal-status\" aria-live=\"polite\">\n<div id=\"qt-cal-res\" hidden>\n<p class=\"qt-label qtx-h\">Your add to calendar links<\/p>\n<table class=\"qt-table\">\n<tbody id=\"qt-cal-rows\"><\/tbody>\n<\/table>\n<div class=\"qt-row\"><button type=\"button\" class=\"qt-btn\" id=\"qt-cal-ics\">Download .ics file<\/button><button type=\"button\" class=\"qt-btn qt-btn-ghost\" id=\"qt-cal-copyall\">Copy all links<\/button><button type=\"button\" class=\"qt-btn qt-btn-ghost\" id=\"qt-cal-copyhtml\">Copy HTML buttons<\/button><button type=\"button\" class=\"qt-btn qt-btn-ghost qtx-nomark\" id=\"qt-cal-reset\">&#8634; Start over<\/button><span class=\"qt-status\" id=\"qt-cal-copied\" aria-live=\"polite\" style=\"margin:0\"><\/span><\/div>\n<p class=\"qt-label qtx-h\">Preview: test each link<\/p>\n<div class=\"qtx-links\" id=\"qt-cal-test\"><\/div>\n<p class=\"qt-note\" style=\"font-size:1rem;font-weight:600\">Each test link opens in a new tab.<\/p>\n<\/div>\n<p class=\"qt-note\"><strong>Private by design:<\/strong> the links and the .ics file are built in your browser. Your event details are not sent to QuickOnlineTips or stored. A calendar service sees them only when someone clicks its link. QuickOnlineTips is not affiliated with Google, Microsoft, Yahoo or Apple.<\/p>\n<\/p><\/div>\n<p><script>(function () { function qtReady(fn) { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn); } else { fn(); } } function qtCopy(text, statusEl, okMsg) { function done(ok) { if (statusEl) { statusEl.textContent = ok ? (okMsg || 'Copied to clipboard.') : 'Press Ctrl+C (or Cmd+C) to copy.'; } } function fallback() { var ta = document.createElement('textarea'); ta.value = text; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.top = '-1000px'; document.body.appendChild(ta); ta.select(); var ok = false; try { ok = document.execCommand('copy'); } catch (e) { ok = false; } document.body.removeChild(ta); done(ok); } if (navigator.clipboard) { if (window.isSecureContext) { navigator.clipboard.writeText(text).then(function () { done(true); }, fallback); return; } } fallback(); } function qtSave(blob, name) { var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = name; document.body.appendChild(a); a.click(); setTimeout(function () { URL.revokeObjectURL(a.href); a.remove(); }, 1500); } qtReady(function () { var root = document.getElementById('qt-cal'); if (!root) { return; } var A = String.fromCharCode(38); function $(id) { return document.getElementById('qt-cal-' + id); } var st = $('status'), res = $('res'), tzEl = $('tz'), allEl = $('all'), links = [], icsText = '', icsName = 'event.ics'; function say(t, bad) { st.textContent = t; st.classList.toggle('qt-error', !!bad); } var here = 'UTC'; try { here = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'; } catch (e) { } var zones = []; try { zones = Intl.supportedValuesOf('timeZone'); } catch (e) { zones = ['UTC', 'America\/New_York', 'America\/Chicago', 'America\/Denver', 'America\/Los_Angeles', 'Europe\/London', 'Europe\/Paris', 'Asia\/Kolkata', 'Asia\/Singapore', 'Asia\/Tokyo', 'Australia\/Sydney']; } if (zones.indexOf(here) === -1) { zones.unshift(here); } if (zones.indexOf('UTC') === -1) { zones.unshift('UTC'); } zones.forEach(function (z) { var o = document.createElement('option'); o.value = z; o.textContent = z.replace(\/_\/g, ' ') + (z === here ? ' (your time zone)' : ''); if (z === here) { o.selected = true; } tzEl.appendChild(o); }); var d0 = new Date(Date.now() + 86400000); function ymd(d) { return d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2); } $('sd').value = ymd(d0); $('ed').value = ymd(d0); function toggleAll() { var on = allEl.checked; $('stw').hidden = on; $('etw').hidden = on; $('tzw').hidden = on; } allEl.addEventListener('change', toggleAll); $('sd').addEventListener('change', function () { if ($('sd').value > $('ed').value || !$('ed').value) { $('ed').value = $('sd').value; } }); function offsetMin(ms, tz) { var f = new Intl.DateTimeFormat('en-US', { timeZone: tz, hourCycle: 'h23', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); var p = {}; f.formatToParts(new Date(ms)).forEach(function (x) { p[x.type] = x.value; }); var asUtc = Date.UTC(+p.year, +p.month - 1, +p.day, +p.hour % 24, +p.minute, +p.second); return (asUtc - ms) \/ 60000; } function wallToUtc(date, time, tz) { var dp = date.split('-'), tp = time.split(':'); var guess = Date.UTC(+dp[0], +dp[1] - 1, +dp[2], +tp[0], +tp[1]); var off = offsetMin(guess, tz); var t = guess - off * 60000; var off2 = offsetMin(t, tz); if (off2 !== off) { t = guess - off2 * 60000; } return new Date(t); } function z2(n) { return ('0' + n).slice(-2); } function utcStamp(d) { return d.getUTCFullYear() + z2(d.getUTCMonth() + 1) + z2(d.getUTCDate()) + 'T' + z2(d.getUTCHours()) + z2(d.getUTCMinutes()) + '00Z'; } function iso(d) { return d.toISOString().replace(\/\\.\\d{3}Z$\/, 'Z'); } function nextDay(s) { var p = s.split('-'), d = new Date(Date.UTC(+p[0], +p[1] - 1, +p[2] + 1)); return d.getUTCFullYear() + '-' + z2(d.getUTCMonth() + 1) + '-' + z2(d.getUTCDate()); } function qs(o) { return Object.keys(o).filter(function (k) { return o[k] !== ''; }).map(function (k) { return k + '=' + encodeURIComponent(o[k]); }).join(A); } function esc(s) { return s.replace(\/\\\\\/g, '\\\\\\\\').replace(\/;\/g, '\\\\;').replace(\/,\/g, '\\\\,').replace(\/\\r?\\n\/g, '\\\\n'); } function fold(line) { var out = [], cur = ''; Array.from(line).forEach(function (ch) { if (new TextEncoder().encode(cur + ch).length > 73) { out.push(cur); cur = ' ' + ch; } else { cur += ch; } }); out.push(cur); return out.join('\\r\\n'); } $('go').addEventListener('click', function () { var title = $('title').value.trim(), all = allEl.checked, sd = $('sd').value, ed = $('ed').value || sd, stv = $('st').value, etv = $('et').value, tz = tzEl.value, loc = $('loc').value.trim(), desc = $('desc').value.trim(); if (!title) { say('Step 1 first: type an event title.', true); $('title').focus(); return; } if (!sd) { say('Step 1 first: pick a start date.', true); return; } var g, o, m, y, ics = ['BEGIN:VCALENDAR', 'VERSION:2.0', 'PRODID:-\/\/QuickOnlineTips\/\/Add to Calendar Link Generator\/\/EN', 'CALSCALE:GREGORIAN', 'METHOD:PUBLISH', 'BEGIN:VEVENT', 'UID:' + Date.now() + '-' + Math.floor(Math.random() * 1e9) + '@quickonlinetips.com', 'DTSTAMP:' + utcStamp(new Date())]; if (all) { if (sd > ed) { say('The end date is before the start date.', true); return; } var endEx = nextDay(ed), s1 = sd.replace(\/-\/g, ''), e1 = endEx.replace(\/-\/g, ''); g = 'https:\/\/calendar.google.com\/calendar\/render?' + qs({ action: 'TEMPLATE', text: title, dates: s1 + '\/' + e1, details: desc, location: loc }); o = 'https:\/\/outlook.live.com\/calendar\/0\/action\/compose?' + qs({ allday: 'true', subject: title, startdt: sd, enddt: endEx, body: desc, location: loc, path: '\/calendar\/action\/compose', rru: 'addevent' }); m = 'https:\/\/outlook.office.com\/calendar\/0\/action\/compose?' + qs({ allday: 'true', subject: title, startdt: sd, enddt: endEx, body: desc, location: loc, path: '\/calendar\/action\/compose', rru: 'addevent' }); y = 'https:\/\/calendar.yahoo.com\/?' + qs({ v: '60', title: title, st: s1, et: e1, dur: 'allday', desc: desc, in_loc: loc }); ics.push('DTSTART;VALUE=DATE:' + s1, 'DTEND;VALUE=DATE:' + e1); } else { if (!stv || !etv) { say('Step 1 first: pick a start and end time, or tick All-day event.', true); return; } var s = wallToUtc(sd, stv, tz), e = wallToUtc(ed, etv, tz); if (s.getTime() >= e.getTime()) { say('The end must be after the start. Check the end date and time.', true); return; } g = 'https:\/\/calendar.google.com\/calendar\/render?' + qs({ action: 'TEMPLATE', text: title, dates: utcStamp(s) + '\/' + utcStamp(e), details: desc, location: loc, ctz: tz }); o = 'https:\/\/outlook.live.com\/calendar\/0\/action\/compose?' + qs({ subject: title, startdt: iso(s), enddt: iso(e), body: desc, location: loc, path: '\/calendar\/action\/compose', rru: 'addevent' }); m = 'https:\/\/outlook.office.com\/calendar\/0\/action\/compose?' + qs({ subject: title, startdt: iso(s), enddt: iso(e), body: desc, location: loc, path: '\/calendar\/action\/compose', rru: 'addevent' }); y = 'https:\/\/calendar.yahoo.com\/?' + qs({ v: '60', title: title, st: utcStamp(s), et: utcStamp(e), desc: desc, in_loc: loc }); ics.push('DTSTART:' + utcStamp(s), 'DTEND:' + utcStamp(e)); } ics.push('SUMMARY:' + esc(title)); if (desc) { ics.push('DESCRIPTION:' + esc(desc)); } if (loc) { ics.push('LOCATION:' + esc(loc)); if (\/^https?:\\\/\\\/\/i.test(loc)) { ics.push('URL:' + loc); } } ics.push('END:VEVENT', 'END:VCALENDAR'); icsText = ics.map(fold).join('\\r\\n') + '\\r\\n'; icsName = (title.toLowerCase().replace(\/[^a-z0-9]+\/g, '-').replace(\/^-+|-+$\/g, '').slice(0, 50) || 'event') + '.ics'; links = [['Google Calendar', g], ['Outlook.com', o], ['Microsoft 365', m], ['Yahoo Calendar', y]]; var rows = $('rows'), test = $('test'); rows.textContent = ''; test.textContent = ''; links.forEach(function (l) { var tr = document.createElement('tr'), th = document.createElement('th'), td = document.createElement('td'), code = document.createElement('code'), b = document.createElement('button'); th.textContent = l[0]; code.textContent = l[1]; code.style.cssText = 'display:block;max-height:4.5em;overflow:auto;font-size:12px'; b.type = 'button'; b.className = 'qt-btn qt-btn-ghost qt-btn-sm'; b.textContent = 'Copy'; b.style.marginTop = '6px'; b.addEventListener('click', function () { qtCopy(l[1], $('copied'), l[0] + ' link copied.'); }); td.appendChild(code); td.appendChild(b); tr.appendChild(th); tr.appendChild(td); rows.appendChild(tr); var a = document.createElement('a'); a.href = l[1]; a.target = '_blank'; a.rel = 'nofollow noopener noreferrer'; a.textContent = 'Test in ' + l[0]; test.appendChild(a); }); res.hidden = false; say('Done. Copy the links you need, or download the .ics file for Apple Calendar and other apps.'); }); $('ics').addEventListener('click', function () { if (!icsText) { $('copied').textContent = 'Press Create calendar links first.'; return; } qtSave(new Blob([icsText], { type: 'text\/calendar;charset=utf-8' }), icsName); $('copied').textContent = 'Saved ' + icsName + '.'; }); $('copyall').addEventListener('click', function () { if (!links.length) { $('copied').textContent = 'Press Create calendar links first.'; return; } qtCopy(links.map(function (l) { return l[0] + ': ' + l[1]; }).join('\\n'), $('copied'), 'All links copied.'); }); $('copyhtml').addEventListener('click', function () { if (!links.length) { $('copied').textContent = 'Press Create calendar links first.'; return; } var lt = String.fromCharCode(60), amp = new RegExp(A, 'g'); var h = links.map(function (l) { return lt + 'a href=\"' + l[1].replace(amp, A + 'amp;') + '\" target=\"_blank\" rel=\"noopener\" style=\"display:inline-block;margin:4px;padding:8px 14px;border-radius:6px;background:#2B6CB0;color:#fff;text-decoration:none;font-family:sans-serif\"' + '>Add to ' + l[0] + lt + '\/a>'; }).join('\\n'); qtCopy(h, $('copied'), 'HTML buttons copied. Paste them into your page or email template.'); }); $('reset').addEventListener('click', function () { res.hidden = true; links = []; icsText = ''; $('title').value = ''; $('loc').value = ''; $('desc').value = ''; say(''); $('title').focus(); }); toggleAll(); }); })();<\/script><\/p>\n<div class=\"qt-next\">\n<p class=\"qt-next-h\">Try another free tool<\/p>\n<div class=\"qt-next-g\"><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/time-zone-converter\/\">Time Zone Converter<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/countdown-to-date\/\">Countdown to a Date<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/qr-code-generator\/\">QR Code Generator<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/days-between-dates\/\">Days Between Dates<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/url-encode-decode\/\">URL Encode and Decode<\/a><a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/online-timer\/\">Online Timer<\/a><\/div>\n<\/div>\n<p><strong>Quick answer:<\/strong> Type the event title, date, time and time zone, add a location or meeting link if you like, and press <strong>Create calendar links<\/strong>. Copy the Google, Outlook, Microsoft 365 or Yahoo link, or download the .ics file for Apple Calendar and other apps.<\/p>\n<h2>How to create an add to calendar link<\/h2>\n<ol>\n<li>Enter the event title, start and end, and the time zone the times are in. Tick <strong>All-day event<\/strong> for things like holidays and deadlines.<\/li>\n<li>Add a location (an address or a video-call link) and a short description.<\/li>\n<li>Press <strong>Create calendar links<\/strong>, then copy the link you need, copy all of them, or copy ready-made HTML buttons for a website or email template.<\/li>\n<li>Click each test link once to check the event opens with the right date and time.<\/li>\n<\/ol>\n<h2>Which link should I use?<\/h2>\n<table class=\"qt-ref\">\n<thead>\n<tr>\n<th>Your guests use<\/th>\n<th>Give them<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Gmail or an Android phone<\/td>\n<td>The Google Calendar link<\/td>\n<\/tr>\n<tr>\n<td>Outlook.com or Hotmail<\/td>\n<td>The Outlook.com link<\/td>\n<\/tr>\n<tr>\n<td>Work or school Microsoft accounts<\/td>\n<td>The Microsoft 365 link<\/td>\n<\/tr>\n<tr>\n<td>Yahoo Mail<\/td>\n<td>The Yahoo Calendar link<\/td>\n<\/tr>\n<tr>\n<td>iPhone, iPad, Mac, Outlook desktop, Thunderbird<\/td>\n<td>The .ics file (attach it to your email or upload it to your site)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Not sure? Offer the Google link plus the .ics file; between them they cover almost every calendar.<\/p>\n<h2>Time zones made simple<\/h2>\n<p>Pick the time zone the event happens in. The links store the time in a way each calendar converts automatically, so a 10 AM New York webinar shows as 3 PM for a guest in London. Need to check times for guests? Use the <a href=\"https:\/\/www.quickonlinetips.com\/archives\/tools\/time-zone-converter\/\">time zone converter<\/a>.<\/p>\n<h2>FAQ<\/h2>\n<h3>Do the links expire?<\/h3>\n<p>No. The event details are written into the link itself, so it keeps working as long as the calendar service supports this kind of link. Nothing is stored on our side.<\/p>\n<h3>Can I add an add to calendar button to my website?<\/h3>\n<p>Yes. Press <strong>Copy HTML buttons<\/strong> and paste the code into your page or email template. For the .ics option, upload the downloaded file to your site and link to it.<\/p>\n<h3>Why does a long description get cut short?<\/h3>\n<p>Very long links can break in some email programs, so keep the description short and put full details on a web page. The tool limits the description to 3,000 characters.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This free add to calendar link generator turns your event into ready-made links that open the event in Google Calendar, Outlook.com, Microsoft 365 and Yahoo Calendar, plus a standard .ics file for Apple Calendar and any other calendar app. Paste the links into emails, invitations, newsletters or your website so people can save the date&#8230;<\/p>\n","protected":false},"author":7,"featured_media":0,"parent":65595,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-69417","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/69417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/comments?post=69417"}],"version-history":[{"count":0,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/69417\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/pages\/65595"}],"wp:attachment":[{"href":"https:\/\/www.quickonlinetips.com\/archives\/wp-json\/wp\/v2\/media?parent=69417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}