Prompt Details
Model
(claude-5-5-opus)
Token size
781
Example input
[EVENT_AND_OUTCOME]: Live workshop: build your first sales dashboard in Google Sheets in 90 minutes, with a template you keep
[DATE_AND_FORMAT]: 2026-11-12 18:00 Europe/Madrid, 90 minutes, live online with Q&A
[AUDIENCE_AND_DOUBT]: Small online shop owners who think spreadsheets and analytics are too technical for them
[HOST_PRICE_SEATS]: Hosted by Ana Ruiz, 10 years in retail analytics; free; 80 seats
[BRAND_VIBE]: friendly, energetic, clean; coral and navy
Example output
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Build your first sales dashboard in Google Sheets: free live workshop with Ana Ruiz</title>
<meta name="description" content="Free 90-minute live online workshop for small online shop owners. Build your first sales dashboard in Google Sheets and keep the template. Hosted by Ana Ruiz.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600;700;800&display=swap" rel="stylesheet">
<style>
:root{
/* Palette: three neutrals + one accent (accent is used only for register and the date block) */
--ink:#14213D; /* navy: text, dark surfaces */
--muted:#4A5573; /* secondary text, 7.1:1 on paper */
--paper:#FFF8F5; /* warm off-white background */
--accent:#FF7A5C; /* coral: register + date block, navy text on it = 6.3:1 */
--line:rgba(20,33,61,.16);
/* Type scale, ratio 1.333 */
--fs--1:.75rem;
--fs-0:1rem;
--fs-1:1.333rem;
--fs-2:1.777rem;
--fs-3:2.369rem;
--fs-4:3.157rem;
--fs-display:clamp(3.157rem, 2.4rem + 3.2vw, 4.209rem);
/* Spacing, 8px grid */
--sp-1:.5rem; --sp-2:1rem; --sp-3:1.5rem; --sp-4:2rem; --sp-5:2.5rem; --sp-6:3rem; --sp-8:4rem; --sp-10:5rem;
--radius:1rem;
--font:"Plus Jakarta Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
}
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;font-family:var(--font);font-size:var(--fs-0);line-height:1.5;color:var(--ink);background:var(--paper);padding-bottom:var(--sp-10)}
h1,h2,h3,p,ol,ul,dl{margin:0}
img{max-width:100%}
a{color:var(--ink);text-underline-offset:.2em}
:focus-visible{outline:3px solid var(--ink);outline-offset:3px;border-radius:.25rem}
[hidden]{display:none !important}
.skip{position:absolute;left:var(--sp-2);top:-4rem;background:var(--ink);color:var(--paper);padding:var(--sp-1) var(--sp-2);border-radius:.5rem;z-index:20}
.skip:focus{top:var(--sp-2)}
.wrap{width:100%;max-width:70rem;margin:0 auto;padding:0 var(--sp-3)}
.preview{background:var(--ink);color:var(--paper);font-size:var(--fs--1);padding:var(--sp-1) 0}
.preview a{color:var(--paper)}
.site-header{padding:var(--sp-3) 0}
.brand{font-weight:800;font-size:var(--fs-0);letter-spacing:.01em}
/* Hero */
.hero{padding:var(--sp-2) 0 var(--sp-8)}
.hero-grid{display:grid;gap:var(--sp-4)}
.date-block{background:var(--accent);color:var(--ink);border-radius:var(--radius);padding:var(--sp-3)}
.date-display{display:flex;flex-wrap:wrap;gap:0 .25em;font-size:var(--fs-display);font-weight:800;line-height:1.05;letter-spacing:-.02em}
.date-local{margin-top:var(--sp-2);font-size:var(--fs-1);font-weight:700}
.date-host{margin-top:var(--sp-1);font-size:var(--fs--1);font-weight:600}
.eyebrow{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-2);padding:0;list-style:none}
.eyebrow li{font-size:var(--fs--1);font-weight:700;text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--line);border-radius:999px;padding:.25rem var(--sp-1)}
h1{font-size:var(--fs-3);line-height:1.15;font-weight:800;letter-spacing:-.015em}
.lede{margin-top:var(--sp-2);font-size:var(--fs-1);color:var(--muted);max-width:36rem}
.cta{margin-top:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-2)}
.cta-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2)}
.btn{display:inline-flex;align-items:center;justify-content:center;min-height:3rem;padding:var(--sp-2) var(--sp-3);border-radius:.5rem;font:inherit;font-weight:800;font-size:var(--fs-0);text-decoration:none;cursor:pointer;border:2px solid transparent;transition:transform .15s ease, box-shadow .15s ease}
.btn-primary{background:var(--accent);color:var(--ink);border-color:var(--accent)}
.btn-primary:hover{transform:translateY(-2px);box-shadow:0 .5rem 1rem rgba(20,33,61,.18)}
.btn-ghost{background:transparent;color:var(--ink);border-color:var(--ink)}
.btn-ghost:hover{background:rgba(20,33,61,.06)}
.offer{font-weight:700}
.offer span{color:var(--muted);font-weight:600}
.time-left{font-weight:700}
.notice{border:1px solid var(--line);border-radius:var(--radius);padding:var(--sp-3);display:grid;gap:var(--sp-2)}
.notice h2{font-size:var(--fs-1)}
.field{display:grid;gap:var(--sp-1)}
.field label{font-weight:700}
.field input{font:inherit;min-height:3rem;padding:0 var(--sp-2);border:2px solid var(--muted);border-radius:.5rem;background:var(--paper);color:var(--ink)}
.form-row{display:grid;gap:var(--sp-2)}
.small{font-size:var(--fs--1);color:var(--muted)}
/* Sections */
section{padding:var(--sp-8) 0;border-top:1px solid var(--line)}
h2{font-size:var(--fs-2);line-height:1.2;font-weight:800;letter-spacing:-.01em}
.section-intro{margin-top:var(--sp-1);color:var(--muted)}
.outcomes{margin-top:var(--sp-4);display:grid;gap:var(--sp-2);padding:0;list-style:none}
.outcomes li{border:1px solid var(--line);border-radius:var(--radius);padding:var(--sp-3)}
.outcomes h3{font-size:var(--fs-1);margin-bottom:var(--sp-1)}
.outcomes p{color:var(--muted)}
.agenda{margin-top:var(--sp-4);padding:0;list-style:none;border-left:3px solid var(--ink)}
.agenda li{display:grid;grid-template-columns:4.5rem 1fr;gap:var(--sp-2);padding:var(--sp-2) 0 var(--sp-2) var(--sp-3);border-bottom:1px solid var(--line)}
.agenda li:last-child{border-bottom:0}
.stamp{font-weight:800;font-variant-numeric:tabular-nums}
.agenda h3{font-size:var(--fs-0);font-weight:700}
.agenda p{color:var(--muted);font-size:var(--fs--1);margin-top:.25rem}
.confirm{display:inline-block;margin-left:var(--sp-1);font-size:var(--fs--1);font-weight:700;color:var(--muted);border:1px dashed var(--muted);border-radius:.25rem;padding:0 .25rem;vertical-align:middle}
.add{margin-top:var(--sp-3);border:2px dashed var(--muted);border-radius:var(--radius);padding:var(--sp-2) var(--sp-3);color:var(--muted);font-size:var(--fs--1)}
.add strong{color:var(--ink)}
.doubt{margin-top:var(--sp-6);background:var(--ink);color:var(--paper);border-radius:var(--radius);padding:var(--sp-4) var(--sp-3)}
.doubt h2{font-size:var(--fs-2)}
.doubt p{margin-top:var(--sp-2);font-size:var(--fs-1);max-width:40rem}
.doubt p + p{font-size:var(--fs-0)}
.doubt :focus-visible{outline-color:var(--paper)}
.host{margin-top:var(--sp-4);display:flex;gap:var(--sp-3);align-items:center}
.initials{flex:none;width:5rem;height:5rem;border-radius:50%;background:var(--ink);color:var(--paper);display:grid;place-items:center;font-size:var(--fs-2);font-weight:800;letter-spacing:.02em}
.host h3{font-size:var(--fs-1)}
.host p{color:var(--muted)}
.closing-cta{text-align:left}
.closing-cta .cta{margin-top:var(--sp-3)}
.site-footer{padding:var(--sp-4) 0;border-top:1px solid var(--line);color:var(--muted);font-size:var(--fs--1)}
/* Sticky register bar */
.sticky{position:fixed;left:0;right:0;bottom:0;z-index:10;background:var(--ink);color:var(--paper);padding:var(--sp-1) 0;box-shadow:0 -.5rem 1.5rem rgba(20,33,61,.2);transition:transform .2s ease, visibility .2s}
.sticky .wrap{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-2)}
.sticky-meta{font-size:var(--fs--1);line-height:1.3}
.sticky-meta strong{display:block;font-size:var(--fs-0)}
.sticky .btn{min-height:2.75rem;padding:var(--sp-1) var(--sp-2)}
.sticky :focus-visible{outline-color:var(--paper)}
.sticky.is-hidden{transform:translateY(110%);visibility:hidden}
@media (min-width:40rem){
.form-row{grid-template-columns:1fr auto;align-items:end}
.outcomes{grid-template-columns:repeat(3,1fr)}
.agenda li{grid-template-columns:6rem 1fr}
}
@media (min-width:56rem){
h1{font-size:var(--fs-4)}
.hero{padding:var(--sp-4) 0 var(--sp-10)}
.hero-grid{grid-template-columns:minmax(18rem,5fr) 7fr;align-items:center;gap:var(--sp-6)}
.date-block{padding:var(--sp-4)}
.doubt{padding:var(--sp-6)}
}
@media (prefers-reduced-motion:reduce){
html{scroll-behavior:auto}
*,*::before,*::after{transition:none !important;animation:none !important}
.btn-primary:hover{transform:none}
}
</style>
</head>
<body>
<a class="skip" href="#main">Skip to content</a>
<div class="preview" id="preview" role="status" hidden>
<div class="wrap">Owner preview: <strong id="preview-state"></strong> (simulated time).
Switch: <a href="?state=before">before</a> · <a href="?state=closing">closing</a> · <a href="?state=past">past</a> · <a href="?">live clock</a></div>
</div>
<header class="site-header">
<div class="wrap"><p class="brand">Ana Ruiz · Live workshop</p></div>
</header>
<main id="main">
<div class="hero">
<div class="wrap hero-grid">
<!-- Date block: everything here is rendered from EVENT.start -->
<div class="date-block" aria-labelledby="date-label">
<p id="date-label" class="date-host" style="margin:0 0 var(--sp-1)">Live online</p>
<p class="date-display"><time id="date-display" datetime="">
<span id="d-weekday"></span> <span id="d-day"></span> <span id="d-month"></span>
</time></p>
<p class="date-local" id="date-local"></p>
<p class="date-host" id="date-host"></p>
<noscript><p class="date-host">Turn on JavaScript to see the start time in your time zone.</p></noscript>
</div>
<div>
<ul class="eyebrow" aria-label="Format">
<li>Free</li><li>Live online</li><li>90 minutes</li><li>Q&A</li>
</ul>
<h1>Build your first sales dashboard in Google Sheets in 90 minutes, and keep the template</h1>
<p class="lede">A live workshop for small online shop owners. Follow along with Ana Ruiz, ask your questions live, and leave with a working dashboard of your own.</p>
<!-- OPEN STATES (before / closing) -->
<div class="cta" id="cta-open">
<div class="cta-row">
<!-- PLACEHOLDER: replace with the real signup / checkout URL (also update EVENT.registerUrl in the script) -->
<a class="btn btn-primary" data-cta href="https://example.com/register" id="register-main">Register free</a>
<p class="offer">Free <span>· 80 seats</span></p>
<!-- Seats left: the brief gives no live number, so none is shown.
If you track one, add e.g. <span>· 23 seats left</span> above and update it by hand. -->
</div>
<p class="time-left" id="time-left" hidden></p>
<div class="cta-row">
<button type="button" class="btn btn-ghost" id="add-cal">Add to calendar (.ics)</button>
</div>
</div>
<!-- STARTED / PAST STATE -->
<div class="cta" id="cta-past" hidden>
<div class="notice" id="waitlist">
<h2 id="past-heading">Registration is closed</h2>
<p id="past-text"></p>
<!-- PLACEHOLDER: replace action with the real waitlist signup endpoint -->
<form action="https://example.com/waitlist" method="post" class="form-row" aria-labelledby="past-heading">
<div class="field">
<label for="wl-email">Email</label>
<input id="wl-email" name="email" type="email" autocomplete="email" required>
</div>
<button class="btn btn-primary" type="submit">Join the waitlist</button>
</form>
<p class="small">We'll email you if another session is scheduled.</p>
<!-- Replay note: the brief does not mention a replay, so EVENT.hasReplay is false and this stays hidden. -->
<p id="replay-note" hidden>A replay of this session is available. Join the waitlist to get the link.</p>
</div>
</div>
</div>
</div>
</div>
<section aria-labelledby="outcomes-h">
<div class="wrap">
<h2 id="outcomes-h">What you leave with</h2>
<ul class="outcomes">
<li><h3>A working sales dashboard</h3><p>Built in Google Sheets during the session, step by step with Ana.</p></li>
<li><h3>The template, yours to keep</h3><p>Reuse it after the workshop, no need to start from a blank sheet.</p></li>
<li><h3>Answers to your questions</h3><p>Live Q&A, so you can ask about your own shop.</p></li>
</ul>
</div>
</section>
<section aria-labelledby="agenda-h">
<div class="wrap">
<h2 id="agenda-h">Run of show</h2>
<p class="section-intro">90 minutes, live. Proposed timings, each to be confirmed.</p>
<ol class="agenda">
<li><span class="stamp">00:00</span><div><h3>Welcome and the dashboard you'll build <span class="confirm">confirm</span></h3></div></li>
<li><span class="stamp">00:05</span><div><h3>Copy the template into your Google account <span class="confirm">confirm</span></h3></div></li>
<li><span class="stamp">00:15</span><div><h3>Add your sales data <span class="confirm">confirm</span></h3></div></li>
<li><span class="stamp">00:35</span><div><h3>Build the dashboard together, step by step <span class="confirm">confirm</span></h3></div></li>
<li><span class="stamp">01:05</span><div><h3>Reading your dashboard: what the numbers tell you <span class="confirm">confirm</span></h3></div></li>
<li><span class="stamp">01:15</span><div><h3>Live Q&A <span class="confirm">confirm</span></h3></div></li>
<li><span class="stamp">01:30</span><div><h3>Close <span class="confirm">confirm</span></h3></div></li>
</ol>
<p class="add"><strong>Add: what to have ready</strong> (e.g. a Google account and which sales export to bring), and <strong>Add: how the joining link is sent</strong>.</p>
<div class="doubt" aria-labelledby="doubt-h">
<h2 id="doubt-h">“Spreadsheets and analytics are too technical for me.”</h2>
<p>That's who this workshop is for. You start from a ready-made template, not a blank sheet, and Ana builds every step live while you follow along.</p>
<p>Stuck on something? The last part is live Q&A, so you can ask about your own shop before you leave.</p>
</div>
</div>
</section>
<section aria-labelledby="host-h">
<div class="wrap">
<h2 id="host-h">Your host</h2>
<div class="host">
<div class="initials" aria-hidden="true">AR</div>
<div>
<h3>Ana Ruiz</h3>
<p>10 years in retail analytics.</p>
</div>
</div>
</div>
</section>
<section aria-labelledby="final-h" class="closing-cta">
<div class="wrap">
<h2 id="final-h">Save your seat</h2>
<p class="section-intro" id="final-when"></p>
<div class="cta" id="final-open">
<div class="cta-row">
<!-- PLACEHOLDER: signup / checkout URL -->
<a class="btn btn-primary" data-cta href="https://example.com/register" id="register-final">Register free</a>
<p class="offer">Free <span>· 80 seats</span></p>
</div>
</div>
<div class="cta" id="final-past" hidden>
<div class="cta-row"><a class="btn btn-primary" href="#waitlist">Join the waitlist</a></div>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="wrap">
<p>Hosted by Ana Ruiz. Times are shown in your time zone, with the host's time zone (Madrid) alongside.</p>
</div>
</footer>
<!-- Sticky register bar: hidden while any main CTA is on screen -->
<div class="sticky is-hidden" id="sticky" role="region" aria-label="Quick register" hidden>
<div class="wrap">
<p class="sticky-meta"><strong id="sticky-when"></strong><span id="sticky-offer">Free · 80 seats</span></p>
<!-- PLACEHOLDER: signup / checkout URL -->
<a class="btn btn-primary" id="sticky-btn" href="https://example.com/register">Register free</a>
</div>
</div>
<script>
(() => {
// ---- Single source of truth -------------------------------------------
const EVENT = {
start: '2026-11-12T18:00:00+01:00', // ISO 8601 with offset (Europe/Madrid is CET, UTC+1, in November)
hostTimeZone: 'Europe/Madrid',
hostCityLabel: 'Madrid',
durationMin: 90,
title: 'Live workshop: Build your first sales dashboard in Google Sheets',
description: 'Hosted by Ana Ruiz (10 years in retail analytics). 90 minutes, live online with Q&A. You keep the template.',
registerUrl: 'https://example.com/register', // PLACEHOLDER: signup / checkout URL
hasReplay: false // brief does not mention a replay
};
const start = new Date(EVENT.start);
const end = new Date(start.getTime() + EVENT.durationMin * 60000);
const HOUR = 3600000;
// ---- Lifecycle (with ?state= owner override) --------------------------
const params = new URLSearchParams(location.search);
const override = (params.get('state') || '').toLowerCase();
const simulated = {
before: start.getTime() - 14 * 24 * HOUR,
closing: start.getTime() - 20 * HOUR - 15 * 60000,
live: start.getTime() + 30 * 60000,
started: start.getTime() + 30 * 60000,
past: end.getTime() + 24 * HOUR
};
const now = override in simulated ? simulated[override] : Date.now();
const msLeft = start.getTime() - now;
const state = msLeft <= 0 ? 'past' : (msLeft <= 48 * HOUR ? 'closing' : 'before');
const isLive = now >= start.getTime() && now < end.getTime();
document.documentElement.dataset.state = state;
if (override in simulated) {
document.getElementById('preview').hidden = false;
document.getElementById('preview-state').textContent = override;
}
// ---- Time rendering (all from EVENT.start) -----------------------------
const lang = (navigator.language || 'en-GB');
const locale = lang.toLowerCase().startsWith('en') ? lang : 'en-GB';
const part = (parts, type) => (parts.find(p => p.type === type) || {}).value || '';
const dParts = new Intl.DateTimeFormat(locale, { weekday: 'short', day: 'numeric', month: 'short' }).formatToParts(start);
document.getElementById('d-weekday').textContent = part(dParts, 'weekday');
document.getElementById('d-day').textContent = part(dParts, 'day');
document.getElementById('d-month').textContent = part(dParts, 'month');
document.getElementById('date-display').setAttribute('datetime', EVENT.start);
const fTime = new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit' });
const localTz = part(new Intl.DateTimeFormat(locale, { timeZoneName: 'short' }).formatToParts(start), 'timeZoneName');
document.getElementById('date-local').textContent =
`${fTime.format(start)} – ${fTime.format(end)} ${localTz} · your time`;
const fHost = new Intl.DateTimeFormat(locale, {
weekday: 'short', day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit',
timeZone: EVENT.hostTimeZone, timeZoneName: 'short'
});
document.getElementById('date-host').textContent = `Host time (${EVENT.hostCityLabel}): ${fHost.format(start)}`;
const fShort = new Intl.DateTimeFormat(locale, { weekday: 'short', day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit' });
const fLong = new Intl.DateTimeFormat(locale, { weekday: 'long', day: 'numeric', month: 'long', hour: 'numeric', minute: '2-digit', timeZoneName: 'short' });
document.getElementById('sticky-when').textContent = fShort.format(start);
document.getElementById('final-when').textContent = `${fLong.format(start)}, ${EVENT.durationMin} minutes, live online.`;
// ---- State-driven UI ---------------------------------------------------
const $ = id => document.getElementById(id);
if (state === 'past') {
$('cta-open').hidden = true;
$('cta-past').hidden = false;
$('final-open').hidden = true;
$('final-past').hidden = false;
$('final-h').textContent = 'Want the next one?';
$('past-heading').textContent = isLive ? 'This workshop is live right now' : 'This workshop has ended';
$('past-text').textContent = isLive
? 'Registration closed when the session started.'
: `It took place on ${fLong.format(start)}.`;
$('replay-note').hidden = !EVENT.hasReplay;
$('sticky-offer').textContent = 'Registration closed';
$('sticky-btn').textContent = 'Join waitlist';
$('sticky-btn').setAttribute('href', '#waitlist');
} else if (state === 'closing') {
const mins = Math.max(1, Math.round(msLeft / 60000));
const d = Math.floor(mins / 1440), h = Math.floor((mins % 1440) / 60), m = mins % 60;
const plural = (n, w) => `${n} ${w}${n === 1 ? '' : 's'}`;
const bits = [];
if (d) bits.push(plural(d, 'day'));
if (h) bits.push(plural(h, 'hour'));
if (!d && m) bits.push(plural(m, 'minute'));
const tl = $('time-left');
tl.textContent = `Starts in ${bits.join(' ')}.`; // plain text, calculated once from the real start time
tl.hidden = false;
}
// ---- Add to calendar (.ics) -------------------------------------------
const icsDate = d => d.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}/, '');
const esc = s => String(s).replace(/\\/g, '\\\\').replace(/;/g, '\\;').replace(/,/g, '\\,').replace(/\n/g, '\\n');
$('add-cal').addEventListener('click', () => {
const ics = [
'BEGIN:VCALENDAR',
'VERSION:2.0',
'PRODID:-//Ana Ruiz//Sales Dashboard Workshop//EN',
'CALSCALE:GREGORIAN',
'METHOD:PUBLISH',
'BEGIN:VEVENT',
`UID:sales-dashboard-workshop-${icsDate(start)}@example.com`,
`DTSTAMP:${icsDate(new Date())}`,
`DTSTART:${icsDate(start)}`,
`DTEND:${icsDate(end)}`,
`SUMMARY:${esc(EVENT.title)}`,
`DESCRIPTION:${esc(EVENT.description + '\nRegister: ' + EVENT.registerUrl)}`,
'LOCATION:Online',
`URL:${EVENT.registerUrl}`,
'END:VEVENT',
'END:VCALENDAR'
].join('\r\n');
const url = URL.createObjectURL(new Blob([ics], { type: 'text/calendar;charset=utf-8' }));
const a = document.createElement('a');
a.href = url;
a.download = 'sales-dashboard-workshop.ics';
document.body.appendChild(a);
a.click();
a.remove();
setTimeout(() => URL.revokeObjectURL(url), 1000);
});
// ---- Sticky bar: hide while a main CTA is visible ----------------------
const sticky = $('sticky');
sticky.hidden = false;
const targets = state === 'past'
? [$('waitlist')]
: Array.from(document.querySelectorAll('[data-cta]'));
if ('IntersectionObserver' in window) {
const visible = new Set();
const io = new IntersectionObserver(entries => {
entries.forEach(e => e.isIntersecting ? visible.add(e.target) : visible.delete(e.target));
sticky.classList.toggle('is-hidden', visible.size > 0);
}, { threshold: 0.1 });
targets.forEach(t => io.observe(t));
} else {
sticky.classList.remove('is-hidden');
}
})();
</script>
</body>
</html>
By purchasing this prompt, you agree to our terms of service
CLAUDE-5-5-OPUS
A registration page that knows what day it is. Give Claude your event or cohort, date, audience and host, and get one responsive HTML file that shows every visitor their own local start time, changes itself as the date approaches or passes, and adds the event to their calendar. For webinar hosts, course creators and organisers selling dated seats.
...more
Updated 2 weeks ago
