An Airbnb welcome guide that lives at one link

Put the wifi, the door, checkout and your local tips on one page, and give guests one link. When something changes, you edit the page and the link stays the same.

An Airbnb welcome guide is one short page that answers what a guest needs in the first hour: the wifi, how to get in, what is odd about the place, how to check out and where to eat.

A guest arriving somewhere new wants those answers on a phone, in that order.

Build it as a web page with its own link. When the wifi password changes, you edit one line instead of sending a new file to everyone.

Here is a complete guide for a made-up flat. Tap the copy button, and tick the checkout list.

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>Welcome to Linden Row Flat</title>
<style>
  * { box-sizing: border-box; }
  body { margin: 0; font-family: system-ui, sans-serif; background: #f3f6f4; color: #1f2a26; }
  .wrap { max-width: 560px; margin: 0 auto; padding: 22px 16px 30px; }
  h1 { font-size: 25px; margin: 0 0 4px; }
  .sub { margin: 0; color: #5a6b64; font-size: 14.5px; line-height: 1.45; }
  .updated { display: inline-block; margin-top: 10px; padding: 4px 10px; border-radius: 99px; background: #dcebe3; color: #24513d; font-size: 12.5px; font-weight: 600; }
  .card { background: #fff; border: 1px solid #dde6e1; border-radius: 14px; padding: 15px 16px; margin-top: 14px; }
  h2 { font-size: 13px; text-transform: uppercase; letter-spacing: 1.1px; color: #2f7a57; margin: 0 0 10px; }
  .k { font-size: 12.5px; color: #6b7c75; margin: 0 0 2px; }
  .net { font-size: 18px; font-weight: 700; margin: 0 0 10px; }
  .pass { display: block; font: 700 21px/1.3 ui-monospace, Consolas, monospace; letter-spacing: .06em; background: #eef4f0; border-radius: 8px; padding: 10px 12px; user-select: all; word-break: break-all; }
  .copy { margin-top: 10px; font: inherit; font-size: 14px; padding: 9px 14px; border: 0; border-radius: 8px; background: #2f7a57; color: #fff; cursor: pointer; }
  .msg { font-size: 13px; color: #24513d; margin-left: 8px; }
  ul { margin: 0; padding-left: 19px; }
  li { margin: 0 0 8px; font-size: 15px; line-height: 1.45; }
  li:last-child { margin-bottom: 0; }
  .check { list-style: none; padding: 0; }
  .check li { margin: 0; }
  .check label { display: flex; gap: 10px; align-items: flex-start; padding: 9px 0; border-bottom: 1px solid #edf2ef; font-size: 15px; line-height: 1.4; cursor: pointer; }
  .check li:last-child label { border-bottom: 0; }
  .check input { width: 20px; height: 20px; margin: 1px 0 0; flex: none; accent-color: #2f7a57; }
  .prog { font-size: 13px; color: #5a6b64; margin: 10px 0 0; }
  .help { background: #fff8ec; border-color: #f0dfbf; }
  .help h2 { color: #92600e; }
  .help p { margin: 0 0 6px; font-size: 15px; line-height: 1.45; }
  .help p:last-child { margin: 0; }
</style>
</head>
<body>
<div class="wrap">
  <h1>Welcome to Linden Row Flat</h1>
  <p class="sub">Everything you asked about before you asked it. Read the first two boxes now; the rest can wait.</p>
  <span class="updated">Updated 1 October 2026</span>

  <div class="card">
    <h2>Wifi</h2>
    <p class="k">Network name</p>
    <p class="net">LindenGuest</p>
    <p class="k">Password (tap it to select)</p>
    <code class="pass" id="pass">maple-river-4417</code>
    <button class="copy" id="copy" type="button">Copy password</button><span class="msg" id="msg"></span>
  </div>

  <div class="card">
    <h2>Getting in</h2>
    <ul>
      <li><b>Check-in from 3 pm.</b> The key box is on the wall to the left of the blue door.</li>
      <li>The box code is in your booking messages. Pull the lid up, then slide the key out.</li>
      <li>The flat is on the second floor. The stairs are inside the blue door.</li>
    </ul>
  </div>

  <div class="card">
    <h2>Things in the flat that are not obvious</h2>
    <ul>
      <li><b>Shower:</b> the water runs cold for about half a minute. Leave it running, then turn the lever to the red dot.</li>
      <li><b>Heating:</b> the dial in the hall. Turn it to 3 for a warm evening.</li>
      <li><b>Front door:</b> lift the handle slightly as you turn the key.</li>
      <li><b>Bins:</b> the kitchen bin goes in the green bin in the yard.</li>
    </ul>
  </div>

  <div class="card">
    <h2>Before you leave</h2>
    <ul class="check" id="list">
      <li><label><input type="checkbox"> Check out by 10 am</label></li>
      <li><label><input type="checkbox"> Put used towels in the bath</label></li>
      <li><label><input type="checkbox"> Take the kitchen bin to the yard</label></li>
      <li><label><input type="checkbox"> Turn the heating dial back to 1</label></li>
      <li><label><input type="checkbox"> Close the windows</label></li>
      <li><label><input type="checkbox"> Lock the door and return the key to the box</label></li>
    </ul>
    <p class="prog" id="prog">0 of 6 done</p>
  </div>

  <div class="card help">
    <h2>If something goes wrong</h2>
    <p><b>Message me first.</b> I usually answer within the hour.</p>
    <p>Emergency services in an urgent case: call the local emergency number from your phone.</p>
  </div>
</div>

<script>
  // Copy button: try the clipboard, fall back to selecting the text
  var pass = document.getElementById('pass');
  var msg = document.getElementById('msg');
  document.getElementById('copy').addEventListener('click', function () {
    var done = function () { msg.textContent = 'Copied'; };
    var fallback = function () {
      var r = document.createRange();
      r.selectNodeContents(pass);
      var s = window.getSelection();
      s.removeAllRanges();
      s.addRange(r);
      msg.textContent = 'Selected, now copy it';
    };
    if (navigator.clipboard && navigator.clipboard.writeText) {
      navigator.clipboard.writeText(pass.textContent).then(done, fallback);
    } else {
      fallback();
    }
  });

  // Checkout list: count the ticks
  var boxes = document.querySelectorAll('#list input');
  var prog = document.getElementById('prog');
  function count() {
    var n = 0;
    boxes.forEach(function (b) { if (b.checked) n++; });
    prog.textContent = n === boxes.length ? 'All done. Safe travels.' : n + ' of ' + boxes.length + ' done';
  }
  boxes.forEach(function (b) { b.addEventListener('change', count); });
</script>
</body>
</html>
A fictional flat. Wifi and getting in come first, because they are needed first.

Every name, time and password in it is invented. Replace them with yours, and the page works the same way.

What goes in the guide, and in what order

Put the things a guest needs soonest at the top, so they are on screen before any scrolling.

What a guest sees on a phone, and why the order is wifi, getting in, quirks, then the rest.
What a guest sees on a phone, and why the order is wifi, getting in, quirks, then the rest.
  1. Wifi. Airbnb's Resource Center says it is one of the first things guests ask for, and suggests putting it at the top of a house manual.
  2. Getting in. Say where the key box or lock is, and how to work it.
  3. What is not obvious. The shower, the heating, a door that sticks. Say what to do.
  4. Checkout. A short list with the time first.
  5. Local tips. A few places you actually use.
  6. How to reach you. Say when you usually answer.

Share the password of a guest network, not the one your own devices use. Sharing wifi details as a link covers that choice.

Keep the door code off the page. Anyone with the link can open it and pass it on, and NOS has no password option. Say instead where in the booking the code can be found.

As of October 2026, Airbnb shows guests the detailed check-in instructions 48 hours before check-in.

If you also keep an in-app or printed manual, a house manual for guests covers the same ground from the printed side.

Make it with AI

An assistant can turn your notes into the page. Paste this into ChatGPT, Claude or Gemini, and put your own details at the end.

Write one self-contained HTML page: a welcome guide for guests at my
short-term rental, [name of the place].
Make it readable on a phone, 390 px wide. Use only HTML, CSS and a little
JavaScript. No outside files, images or fonts.
Order: wifi, getting in, things that are not obvious, a checkout checklist
with tick boxes, local tips, how to reach me.
Do not put a door code on the page. Say it is in the booking messages.
Under the title add "Updated [date]".
Use only the facts I give you. Do not invent places or times.
My details:
[paste your notes]

Before you use the result, check these:

  1. The wifi. Letters, capitals and dashes must match your router exactly.
  2. Times. Check-in, checkout and any quiet hours.
  3. Local places. AI assistants can invent a cafe. Keep only places you know are real.
  4. No door code, no full address. Remove them if the assistant added them.
  5. No outside pictures. A photo linked from another website will not load on the shared page.
Write down your answers, ask the AI for one page, paste it into NOS and send the link to guests.
Write down your answers, ask the AI for one page, paste it into NOS and send the link to guests.

Copy the whole page the assistant gave you and paste it into a NOS document. Choose Create share link. The page shows as you saw it, and its script runs, so the copy button and the checklist work. HTML to link walks through the steps.

Anyone with the link can open it in a browser, on a phone too, with no account. They cannot edit it. If you change the code later, the same link shows the new version.

A guest can tick the checkout list, but their ticks are not saved.

Airbnb has its own house manual tool, and its Resource Center describes guests opening it in the app. The page is a good fit when you want a layout of your own, or one guide for guests who book in different ways.

Several routes, one page. Edit the page once and every route shows the new version.
Several routes, one page. Edit the page once and every route shows the new version.

Airbnb's rules about messages matter here. As of October 2026, its Off-Platform and Fee Transparency Policy says that including links that take people off Airbnb in listings or messages is not allowed.

Its page on sending documents says you can share a link to a document hosted on a file-sharing platform such as Google Drive, Dropbox, OneDrive or WeTransfer. A NOS page is not named there, so read both pages before using the link in a message.

The same policy says that after booking, you may use another way of communicating, such as a chat app, if the guest requests it.

Route When the guest sees it Worth knowing
Airbnb house manual In the app, any time Airbnb's own tool, no outside link needed
QR code card in the home After arriving Needs no message. QR codes that open a link shows how
A link in an Airbnb message Before arrival Read the off-platform policy first
A channel the guest asked for Before arrival Only after booking, and only if the guest requests it
Printed folder After arriving Goes out of date when anything changes

Airbnb lets you schedule quick replies, for example one day before check-in at 10 am. Its Resource Center suggests 24 to 48 hours before check-in. Use that slot for whatever route you settle on.

Keep it correct

A guide goes wrong in small ways: a cafe closes, the heating dial moves, the wifi changes. Because the page keeps its facts in plain lists, you fix one line and nothing else.

The second example is a local tips page with a filter. Pick a type and the list changes. All the places sit in one list at the top 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>Around Linden Row</title>
<style>
  * { box-sizing: border-box; }
  body { margin: 0; font-family: system-ui, sans-serif; background: #f7f4ee; color: #2a2620; }
  .wrap { max-width: 560px; margin: 0 auto; padding: 22px 16px 28px; }
  h1 { font-size: 24px; margin: 0 0 4px; }
  .sub { margin: 0 0 14px; color: #6d655a; font-size: 14.5px; line-height: 1.45; }
  .chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; }
  .chips button { font: inherit; font-size: 14px; padding: 8px 14px; border: 1px solid #d8cfbf; border-radius: 99px; background: #fff; color: #2a2620; cursor: pointer; }
  .chips button[aria-pressed="true"] { background: #2a2620; border-color: #2a2620; color: #fff; }
  .place { background: #fff; border: 1px solid #e6dfd1; border-radius: 12px; padding: 13px 15px; margin-top: 10px; }
  .top { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
  .name { font-size: 16.5px; font-weight: 700; }
  .walk { font-size: 13px; color: #6d655a; white-space: nowrap; }
  .tag { display: inline-block; margin-top: 4px; font-size: 11.5px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase; color: #8a5a1c; }
  .why { margin: 6px 0 0; font-size: 14.5px; line-height: 1.45; color: #403a31; }
  .empty { color: #6d655a; font-size: 14px; }
  .note { margin-top: 16px; font-size: 13px; color: #6d655a; line-height: 1.5; }
</style>
</head>
<body>
<div class="wrap">
  <h1>Around Linden Row</h1>
  <p class="sub">The places I send friends to. Walking times are from the front door.</p>
  <div class="chips" id="chips"></div>
  <div id="list"></div>
  <p class="note">Opening hours change. Check the sign on the door before you set out.</p>
</div>

<script>
  // To add a place, copy one line in PLACES and change the words
  var PLACES = [
    { name: "Pell's Bakery", type: 'Coffee', walk: 4, why: 'Opens early. Ask for the seeded loaf before it sells out.' },
    { name: 'Quay Street Market', type: 'Food', walk: 9, why: 'Stalls for lunch, and a fish counter if you are cooking.' },
    { name: 'The Wren Kitchen', type: 'Food', walk: 12, why: 'Small and friendly. Book a table if there are more than four of you.' },
    { name: 'Corner Grocer', type: 'Shops', walk: 2, why: 'Milk, bread and basics, close to the flat.' },
    { name: 'Hollin Park', type: 'Kids', walk: 7, why: 'A playground with a fenced corner for small children.' },
    { name: 'The Lamp Room Cafe', type: 'Coffee', walk: 6, why: 'Quiet tables and plug sockets if you need to work.' },
    { name: 'Harbour Steps', type: 'Walks', walk: 15, why: 'An easy loop along the water. Good in the evening light.' }
  ];
  var TYPES = ['All', 'Food', 'Coffee', 'Kids', 'Shops', 'Walks'];
  var current = 'All';
  var chips = document.getElementById('chips');
  var list = document.getElementById('list');

  function render() {
    chips.innerHTML = '';
    TYPES.forEach(function (t) {
      var b = document.createElement('button');
      b.type = 'button';
      b.textContent = t;
      b.setAttribute('aria-pressed', t === current ? 'true' : 'false');
      b.addEventListener('click', function () { current = t; render(); });
      chips.appendChild(b);
    });
    var shown = PLACES.filter(function (p) { return current === 'All' || p.type === current; });
    shown.sort(function (a, b) { return a.walk - b.walk; });
    list.innerHTML = '';
    shown.forEach(function (p) {
      var d = document.createElement('div');
      d.className = 'place';
      d.innerHTML = '<div class="top"><span class="name"></span><span class="walk"></span></div>' +
        '<span class="tag"></span><p class="why"></p>';
      d.querySelector('.name').textContent = p.name;
      d.querySelector('.walk').textContent = p.walk + ' min walk';
      d.querySelector('.tag').textContent = p.type;
      d.querySelector('.why').textContent = p.why;
      list.appendChild(d);
    });
  }
  render();
</script>
</body>
</html>
Fictional places, sorted by walking time. To add a place, copy one line and change the words.

Add a tip each time a guest asks you something. After a few stays the page answers most of what you used to type out.

When it does not work

What you see Cause Fix
The copy button only selects the text The browser blocked clipboard access Ask guests to hold the selected password and copy it
A guest cannot open the link Part of the address was cut off when pasting Send the whole address again
The link will not go through in an Airbnb message Airbnb's rules limit links in messages Use the card in the home, or read the policy
A photo shows as a blank box The picture comes from another website, which the shared page blocks Remove it, or ask for a drawing built into the page
A guest sees an old wifi password They saved a screenshot or a copy Ask them to open the link again
Ticks vanish when the guest reloads A visitor's ticks are not saved Treat the list as a reminder, not a record

Questions people ask

What should an Airbnb welcome guide include?

Start with the wifi, then how to get in, then anything in the home that is not obvious, such as the shower or the heating. After those come checkout steps, a few local tips and a way to reach you. Airbnb's own advice for its house manual is to put the wifi first and keep the text short.

Can I send a link to my own page in an Airbnb message?

Check Airbnb's Off-Platform and Fee Transparency Policy before you do. As of October 2026 it says that including links that take people off Airbnb in listings or messages is not allowed. A QR code card inside the home avoids the question, because it needs no message.

Should I put the door code on the page?

It is safer not to. Anyone who has the link can open the page and can forward it, and NOS has no password option. Keep the code in the check-in instructions you give guests through the booking, and let the page say where to find it.

How do I change the wifi password later?

Edit the password in the page code. The share link stays the same, so every card and message that points to it now shows the new password.

Do guests need an account or an app to open it?

No. The page opens in an ordinary browser, on a phone too, for anyone who has the link. They can read it and tick the checkout list for themselves, but they cannot edit the page.

Keep reading