Save the date website template: one page, sent by link

A save-the-date does not need a website builder. One short page with the date, the place and a note is enough, and a link lets you fix it if the plan moves.

A save-the-date website template is one short page with three things on it: the date, the place and a note about what comes next. You send it as a link before the formal invitations go out.

One Quora question asks how to make a digital wedding invitation card for a wedding. A save-the-date is the lighter version of that job. It asks for no reply and carries no schedule. It only lets people hold the date.

Here is a page of that kind, for a made-up couple. The number of days to go is worked out when the page opens, and every line comes from one block near the bottom of the code.

Live exampletry it here, then copy the code
Share it as a link
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Save the date: Maren and Theo, 12 June 2027</title>
<style>
  * { box-sizing: border-box; }
  body { margin: 0; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 16px; background: #efe9df; font-family: Georgia, "Times New Roman", serif; color: #2f2a24; }
  .card { width: 100%; max-width: 440px; background: #fffdf8; border: 1px solid #d9cfbf; border-radius: 6px; padding: 30px 24px 26px; text-align: center; box-shadow: 0 2px 14px rgba(60, 45, 20, .1); }
  .kicker { margin: 0; font-size: 13px; letter-spacing: .28em; text-transform: uppercase; color: #8a6d3b; }
  svg { display: block; margin: 12px auto; }
  h1 { margin: 0; font-size: 38px; font-weight: 400; line-height: 1.15; }
  .when { margin: 18px 0 2px; font-size: 22px; }
  .where { margin: 0; font-size: 17px; color: #5b5146; }
  .left { display: inline-block; margin: 16px 0 0; padding: 4px 14px; border-radius: 999px; background: #f2e8d3; font: 600 13px system-ui, sans-serif; color: #6b4f1d; }
  .note { margin: 20px 0 0; padding-top: 16px; border-top: 1px solid #e6dccb; font-size: 16px; line-height: 1.5; color: #4a4137; }
  .small { margin: 12px 0 0; font: 13px system-ui, sans-serif; color: #7a7064; }
  @media (max-width: 400px) { h1 { font-size: 32px; } .when { font-size: 19px; } }
</style>
</head>
<body>
<main class="card">
  <p class="kicker">Save the date</p>
  <svg width="120" height="18" viewBox="0 0 120 18" aria-hidden="true"><path d="M2 9h46M72 9h46" stroke="#c9b48a" stroke-width="1.5"/><path d="M60 2c3 4 6 5 8 7-2 2-5 3-8 7-3-4-6-5-8-7 2-2 5-3 8-7z" fill="#c9b48a"/></svg>
  <h1 id="names"></h1>
  <p class="when"><time id="date"></time></p>
  <p class="where" id="place"></p>
  <p class="left" id="left" hidden></p>
  <p class="note" id="note"></p>
  <p class="small" id="small"></p>
</main>

<script>
  // Edit these lines. Everything on the page comes from here.
  const EVENT = {
    names: 'Maren & Theo',
    date: '2027-06-12',               // year-month-day
    place: 'Harbour Barn, Lindholm',
    note: 'The formal invitation will follow in the spring. For now, please keep the weekend free.',
    small: 'Questions? Reply to the message this link came in.'
  };

  const day = new Date(EVENT.date + 'T12:00:00');
  document.getElementById('names').textContent = EVENT.names;
  const dateEl = document.getElementById('date');
  dateEl.setAttribute('datetime', EVENT.date);
  dateEl.textContent = day.toLocaleDateString('en-GB', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' });
  document.getElementById('place').textContent = EVENT.place;
  document.getElementById('note').textContent = EVENT.note;
  document.getElementById('small').textContent = EVENT.small;

  // Days to go, counted by calendar day (hidden once the date has passed)
  const now = new Date();
  const today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate());
  const target = Date.UTC(day.getFullYear(), day.getMonth(), day.getDate());
  const days = Math.round((target - today) / 86400000);
  if (days > 0) {
    const left = document.getElementById('left');
    left.textContent = days + (days === 1 ? ' day to go' : ' days to go');
    left.hidden = false;
  }
</script>
</body>
</html>
One screen: names, date, place and a note. Edit the lines in the EVENT block and the page changes.

What goes on the page

Keep it to what a guest needs in order to keep a day free. Anything more makes the later invitation feel repeated.

  • The date with the weekday. Write out the month. A number such as 12/06 reads as two different days in different countries.
  • The place. A town or venue name is enough at this stage.
  • One line about what happens next. For example, when the formal invitation will arrive.
  • A way to ask questions. Tell people to reply to the message the link came in.

The example marks its date with a time element, which holds the date in a machine-readable form. MDN describes the datetime attribute as a way to give dates in a format machines can process.

Make it with AI

Paste your facts into ChatGPT, Claude or Gemini with this prompt.

Make one HTML page, a save-the-date for guests. Show the names,
the date with the weekday, the place and a short note, centred on
one card with a soft background and a serif font. Put all the text
in one JavaScript object near the bottom of the code so I can edit
it. Show how many days remain, and hide that once the date has
passed. Large text, works on a phone. No outside libraries,
images, fonts or forms. Do not save data anywhere.

Names: [your names]
Date: [year-month-day]
Place: [venue and town]
Note: [one line about the invitation]

Then check the result before you send it:

  • The date and its weekday. Look at a calendar. An AI can pair a date with the wrong weekday without saying so.
  • Every name. A misspelt name is the one mistake guests notice.
  • Anything outside. Images and fonts loaded from other sites will not appear on a shared page. Ask for a version without them.
  • Phone width. Make the browser window narrow. The card should still sit on one screen.

For help changing details afterwards, see editing AI-generated HTML without code.

  1. Copy all of the code the AI returned.
  2. Paste it into a NOS document. The page renders and its scripts run, so you can check the countdown.
  3. Choose Create share link and copy the address. HTML to link walks through it.
  4. Paste the address into a message, an email or a group chat.
From your three facts to one link, in four steps.
From your three facts to one link, in four steps.

Anyone with the link can open the page in a browser, on a phone or a laptop, without an account. They cannot edit it.

If a phone shows a sent file as plain text instead of a page, see opening an HTML file on a phone.

What a guest sees when the link is opened on a phone.
What a guest sees when the link is opened on a phone.

For a paper card, print the link as a QR code. QR code link explains why a printed code stays useful when the page behind it changes. The invitation itself is a different job, covered in wedding invitation HTML.

Ways to send a save-the-date compared

Image in a message Text only Link to a page
What guests hold A copy A copy of the words An address
After the date changes Send a new image Send a new message Edit once, same link
Guest can reopen the latest No No Yes
Works with a paper card Printed once Printed once A QR code on the card
A date change sent as a new image, compared with a change made on a page.
A date change sent as a new image, compared with a change made on a page.

A link does not tell guests that anything changed. If the date moves, send a short message as well, and let the page be the place they confirm it.

When some details are not settled yet

Not every event has a venue when you want people to hold a weekend. This second page, for a made-up family weekend, shows what is settled and what is open.

Each line has a tag, and you change the tag when the detail is decided.

Live exampletry it here, then copy the code
Share it as a link
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Save the date: Aldous family weekend, August 2027</title>
<style>
  * { box-sizing: border-box; }
  body { margin: 0; padding: 16px; background: #e8f1ee; font-family: system-ui, "Segoe UI", sans-serif; color: #1d2b27; line-height: 1.5; }
  main { max-width: 480px; margin: 0 auto; background: #fff; border-radius: 14px; overflow: hidden; box-shadow: 0 2px 12px rgba(0, 0, 0, .08); }
  header { background: #1f5d52; color: #fff; padding: 22px 20px 20px; }
  header p { margin: 0; font-size: 13px; letter-spacing: .12em; text-transform: uppercase; opacity: .85; }
  header h1 { margin: 6px 0 2px; font-size: 26px; line-height: 1.2; }
  header .dates { margin: 0; font-size: 18px; font-weight: 600; }
  section { padding: 16px 20px 20px; }
  h2 { margin: 0 0 8px; font-size: 15px; }
  ul { list-style: none; margin: 0; padding: 0; }
  li { display: flex; gap: 10px; align-items: baseline; padding: 9px 0; border-bottom: 1px solid #e6eeea; font-size: 15px; }
  li:last-child { border-bottom: 0; }
  .tag { flex: none; min-width: 78px; text-align: center; padding: 2px 8px; border-radius: 999px; font-size: 12px; font-weight: 700; }
  .set .tag { background: #d9f0e3; color: #0f5132; }
  .open .tag { background: #fdecc8; color: #7a5200; }
  .label { font-weight: 700; display: block; }
  .val { color: #4a5a55; }
  .hold { margin: 0; padding: 12px 20px 18px; font-size: 15px; background: #f5faf8; border-top: 1px solid #dbe8e3; }
</style>
</head>
<body>
<main>
  <header>
    <p>Save the date</p>
    <h1>Aldous family weekend</h1>
    <p class="dates" id="dates"></p>
  </header>
  <section>
    <h2>What we know, and what we are still sorting out</h2>
    <ul id="items"></ul>
  </section>
  <p class="hold" id="hold"></p>
</main>

<script>
  // Edit these lines. "open: true" shows a yellow tag, remove it once the detail is settled.
  const WEEKEND = {
    title: 'Friday 20 to Sunday 22 August 2027',
    hold: 'Please keep the whole weekend free. We will send a reply date once the venue is confirmed.',
    items: [
      { label: 'Place', value: 'Near Karlsvik, by the lake', open: false },
      { label: 'Where to sleep', value: 'Cabins and a campsite are being compared', open: true },
      { label: 'Food', value: 'Saturday dinner for everyone, other meals shared', open: false },
      { label: 'Cost', value: 'Not decided yet', open: true },
      { label: 'Children', value: 'Welcome. Activities for all ages', open: false }
    ]
  };

  document.getElementById('dates').textContent = WEEKEND.title;
  document.getElementById('hold').textContent = WEEKEND.hold;
  const list = document.getElementById('items');
  WEEKEND.items.forEach((it) => {
    const li = document.createElement('li');
    li.className = it.open ? 'open' : 'set';
    const tag = document.createElement('span');
    tag.className = 'tag';
    tag.textContent = it.open ? 'To be set' : 'Settled';
    const box = document.createElement('span');
    const label = document.createElement('span');
    label.className = 'label';
    label.textContent = it.label;
    const val = document.createElement('span');
    val.className = 'val';
    val.textContent = it.value;
    box.append(label, val);
    li.append(tag, box);
    list.appendChild(li);
  });
</script>
</body>
</html>
Settled items have a green tag, open ones a yellow tag. Edit the list near the bottom of the code.

Ask for it with the same prompt, changed to: "a list of details, each marked settled or to be set, plus a line asking guests to keep the whole weekend free." People then see what is still open without a second announcement from you.

Because the link stays the same, you can send this page months early and keep it up to date. For a fuller picture of one address that holds all event details, see event link and sharing wedding details with guests.

When it does not work

Symptom Cause Fix
Guests see code, not a page The file was sent as an attachment and opened as text Send the link, not the file
The weekday does not match the date The AI paired them wrongly Check a calendar and fix the date line
A picture or font is missing It comes from another website, which a shared page blocks Ask for a version with no outside images or fonts
A reply form does nothing NOS blocks forms that send data to a server Ask guests to reply in your message
Guests still have the old date They saw the first message and never reopened the link Send a short note that the date changed
You cannot see who opened it NOS does not record who opens a link Ask guests to confirm in your message

If you want the guest to add the day to a calendar, calendar invite link covers that step. Share AI-generated HTML explains what to check before you send any page an AI wrote.

Questions people ask

What should a save-the-date page say?

The date with the weekday, the town or venue, and one line about what happens next, such as when the formal invitation will arrive. Leave out the schedule, the dress code and the reply form. Those belong on the invitation.

Do I need a website builder for a save-the-date?

No. The page is one screen of text. Ask ChatGPT, Claude or Gemini for a single HTML page, check it, paste it into NOS and create a share link. There is nothing to install and no site to look after.

Can guests reply from the page?

Not with a form that sends the answer to you. NOS blocks forms that send data to a server, so a form inside the page cannot reach you. A save-the-date rarely needs a reply anyway. Ask people to answer in the message the link came in.

What if the date or place changes after I send it?

Edit the date in the code and paste the page again into the same NOS document. The link you already sent shows the new version. Still tell guests that something changed, because nobody knows to look again.

Can I put the link on a paper card?

Yes. Print the link as a QR code on the card. The code points at an address, so the paper stays correct when the page behind it changes.

Keep reading