How to put a church bulletin online and send one link

The bulletin you print on Sunday can also be one page that opens on a phone. Send the link by email or message, and edit the same page each week.

A church bulletin online is the same content you print on Sunday, put on one web page and sent as one link.

If your bulletin starts as a Word or Excel file, keep that file as the list and ask an AI chat to turn the list into a page.

People open the link on a phone, with no account and no sign-up form. Here is a bulletin of that kind, for a made-up church.

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>Willow Bend Community Church bulletin</title>
<style>
  * { box-sizing: border-box; }
  body {
    margin: 0; font-family: Georgia, "Times New Roman", serif; font-size: 17px;
    background: #f6f3ec; color: #2a2a2e; line-height: 1.55;
  }
  body.big { font-size: 21px; }
  .wrap { max-width: 640px; margin: 0 auto; padding: 22px 16px 34px; }
  header { text-align: center; padding-bottom: 14px; border-bottom: 2px solid #c9b88f; }
  .logo { width: 64px; height: 64px; display: block; margin: 0 auto 6px; }
  h1 { font-size: 1.55em; margin: 0; line-height: 1.2; font-weight: 600; }
  .made { margin: 2px 0 0; font-size: .8em; color: #6a6354; }
  .date { margin: 8px 0 0; font-weight: 700; color: #5a4520; }
  .notice { margin: 14px 0 0; padding: 10px 14px; background: #fff4d6; border-left: 4px solid #c28a1c; border-radius: 6px; font-size: .92em; text-align: left; }
  .tools { text-align: right; margin: 12px 0 0; }
  .tools button {
    font: inherit; font-size: .8em; padding: 6px 12px; border-radius: 8px; cursor: pointer;
    background: #fff; border: 1px solid #b7aa8c; color: #3b3426;
  }
  .tools button[aria-pressed="true"] { background: #4a3d22; color: #fff; border-color: #4a3d22; }
  h2 { font-size: 1.1em; margin: 22px 0 8px; color: #4a3d22; text-transform: uppercase; letter-spacing: .06em; }
  ol.order { list-style: none; margin: 0; padding: 0; }
  ol.order li {
    display: grid; grid-template-columns: 4.6em 1fr; gap: 2px 12px;
    padding: 9px 0; border-bottom: 1px solid #e4dccb;
  }
  ol.order time { font-weight: 700; color: #7b5b1c; font-variant-numeric: tabular-nums; }
  ol.order .who { display: block; font-size: .88em; color: #625b4c; }
  details { background: #fff; border-radius: 10px; padding: 10px 14px; margin: 0 0 8px; box-shadow: 0 1px 4px rgba(0,0,0,.06); }
  summary { cursor: pointer; font-weight: 600; }
  details p { margin: 8px 0 0; font-size: .94em; }
  .week { width: 100%; border-collapse: collapse; font-size: .94em; }
  .week td { padding: 7px 0; border-bottom: 1px solid #e4dccb; vertical-align: top; }
  .week td:first-child { width: 6.8em; padding-right: 8px; font-weight: 700; color: #7b5b1c; }
  .ask { margin-top: 24px; padding: 12px 14px; background: #ece6d6; border-radius: 10px; text-align: center; font-size: .92em; }
  footer { margin-top: 18px; text-align: center; color: #6a6354; font-size: .82em; }
</style>
</head>
<body>
<div class="wrap">
  <header>
    <svg class="logo" viewBox="0 0 64 64" role="img" aria-label="A simple arched window">
      <circle cx="32" cy="32" r="31" fill="#eadfc4"/>
      <path d="M20 50V28a12 12 0 0 1 24 0v22z" fill="#fff" stroke="#8b6b25" stroke-width="2.5"/>
      <path d="M32 16v34M20 33h24" stroke="#8b6b25" stroke-width="2"/>
    </svg>
    <h1>Willow Bend Community Church</h1>
    <p class="made">A made-up church for this example</p>
    <p class="date"><time datetime="2026-10-11">Sunday 11 October 2026</time></p>
    <p class="notice" id="notice"><b>Change this week:</b> the food pantry opens at 5:00 pm on Tuesday, not 4:30.</p>
  </header>

  <div class="tools"><button id="big" type="button" aria-pressed="false">Larger text</button></div>

  <h2>Order of worship</h2>
  <ol class="order">
    <li><time datetime="09:30">9:30</time><span>Welcome and call to worship<span class="who">Led by Marta Quill</span></span></li>
    <li><time datetime="09:35">9:35</time><span>Opening hymn<span class="who">Number 112 in the blue hymnal</span></span></li>
    <li><time datetime="09:40">9:40</time><span>First reading<span class="who">Read by Tomas Brennick</span></span></li>
    <li><time datetime="09:45">9:45</time><span>Message: &ldquo;Room at the Table&rdquo;<span class="who">Pastor Eleni Rowe</span></span></li>
    <li><time datetime="10:10">10:10</time><span>Prayers of the people</span></li>
    <li><time datetime="10:20">10:20</time><span>Closing hymn and blessing<span class="who">Number 240</span></span></li>
  </ol>

  <h2>Announcements</h2>
  <details open>
    <summary>Food pantry volunteers needed</summary>
    <p>Two more people are needed for the Tuesday shift. Doors open at 5:00 pm. Tell the office if you can help.</p>
  </details>
  <details>
    <summary>Choir rehearsal moves to Wednesday</summary>
    <p>This week only, rehearsal is on Wednesday at 7:00 pm in the hall. New singers are welcome.</p>
  </details>
  <details>
    <summary>Youth supper</summary>
    <p>Friday at 6:00 pm. Bring a dish to share and say how many are coming when you reply.</p>
  </details>

  <h2>This week</h2>
  <table class="week">
    <tr><td>Tuesday</td><td>Food pantry, 5:00 pm</td></tr>
    <tr><td>Wednesday</td><td>Choir rehearsal, 7:00 pm</td></tr>
    <tr><td>Friday</td><td>Youth supper, 6:00 pm</td></tr>
    <tr><td>Sunday</td><td>Worship, 9:30 am</td></tr>
  </table>

  <p class="ask"><b>Questions or prayer requests?</b><br>Reply to the message this link came in.</p>
  <footer>Next bulletin: Sunday 18 October 2026. All names are made up.</footer>
</div>

<script>
  const big = document.getElementById('big');
  big.addEventListener('click', () => {
    const on = document.body.classList.toggle('big');
    big.setAttribute('aria-pressed', on);  // button looks pressed while text is large
    big.textContent = on ? 'Normal text' : 'Larger text';
  });
</script>
</body>
</html>
One week's bulletin: a change notice, the order of worship, announcements that fold open, and a larger-text button. All names are made up.

What goes in an online bulletin

Members open the link from a message and look for a few things. Put those first and keep the rest short.

  • Date and service time. At the top, before anything else.
  • A change notice. One line for what is different this week, so regulars see it at once.
  • The order of worship. One line per item: the time, what it is, and who leads it.
  • Announcements. Short ones. Longer ones can fold open.
  • Where to reply. One sentence saying who to write to.

Ask each person whose name appears whether they are happy to be named. Take extra care with prayer requests and news about someone's health or family.

Make it with AI

An AI chat such as ChatGPT, Claude or Gemini can write the page from your list. Fill in the list below, which also gives you the plain text to paste.

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>This week's list for the bulletin</title>
<style>
  * { box-sizing: border-box; }
  body { margin: 0; font-family: system-ui, "Segoe UI", sans-serif; font-size: 16px; background: #f4f5f7; color: #1f2430; line-height: 1.45; }
  .wrap { max-width: 640px; margin: 0 auto; padding: 18px 14px 28px; }
  h1 { font-size: 1.25em; margin: 0 0 4px; }
  .lead { margin: 0 0 14px; color: #4b5563; font-size: .92em; }
  label { display: block; font-weight: 600; font-size: .9em; margin: 12px 0 4px; }
  input, textarea {
    width: 100%; font: inherit; padding: 8px 10px; border: 1px solid #b8bec9; border-radius: 8px; background: #fff;
  }
  textarea { resize: vertical; }
  .day { font-size: .85em; font-weight: 500; margin-left: 6px; }
  .day.ok { color: #0f5132; }
  .day.warn { color: #9a3412; }
  h2 { font-size: 1.05em; margin: 22px 0 6px; }
  #out { background: #fff; font-family: ui-monospace, Consolas, monospace; font-size: .85em; min-height: 220px; }
  button { font: inherit; padding: 8px 14px; margin-top: 8px; border-radius: 8px; border: 1px solid #2563eb; background: #2563eb; color: #fff; cursor: pointer; }
  #msg { margin-left: 10px; font-size: .85em; color: #0f5132; }
</style>
</head>
<body>
<div class="wrap">
  <h1>This week's list</h1>
  <p class="lead">Fill in what changes each week. The list below updates as you type. Select it and paste it into your AI chat.</p>

  <label for="date">Sunday date<span class="day" id="day"></span></label>
  <input id="date" type="date" value="2026-10-18">

  <label for="title">Message title</label>
  <input id="title" type="text" value="Seeds and Soil">

  <label for="order">Order of worship (time, item, who: one per line)</label>
  <textarea id="order" rows="5">9:30, Welcome, Marta Quill
9:35, Opening hymn, number 118
9:45, Message, Pastor Eleni Rowe
10:15, Closing hymn, number 231</textarea>

  <label for="ann">Announcements (one per line)</label>
  <textarea id="ann" rows="3">Food pantry, Tuesday 5:00 pm
Youth supper, Friday 6:00 pm</textarea>

  <label for="note">Change notice (leave empty if none)</label>
  <input id="note" type="text" value="">

  <h2>Paste this into the chat</h2>
  <textarea id="out" readonly rows="12"></textarea>
  <button id="sel" type="button">Select the list</button><span id="msg"></span>
</div>

<script>
  const $ = (id) => document.getElementById(id);
  const names = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

  function weekday(value) {
    if (!value) return '';
    const [y, m, d] = value.split('-').map(Number);
    return names[new Date(Date.UTC(y, m - 1, d, 12)).getUTCDay()];  // noon UTC avoids time-zone shifts
  }

  function render() {
    const wd = weekday($('date').value);
    $('day').textContent = wd ? '(' + wd + ')' : '';
    $('day').className = 'day ' + (wd === 'Sunday' ? 'ok' : 'warn');

    const lines = (id) => $(id).value.split('\n').map((s) => s.trim()).filter(Boolean);
    const out = [];
    out.push('Date: ' + (wd ? wd + ' ' : '') + $('date').value);
    out.push('Message title: ' + $('title').value.trim());
    if ($('note').value.trim()) out.push('Change notice: ' + $('note').value.trim());
    out.push('Order of worship:');
    lines('order').forEach((l) => out.push('- ' + l));
    out.push('Announcements:');
    lines('ann').forEach((l) => out.push('- ' + l));
    $('out').value = out.join('\n');
  }

  document.querySelectorAll('input, textarea#order, textarea#ann').forEach((el) => el.addEventListener('input', render));
  $('sel').addEventListener('click', () => {
    $('out').focus();
    $('out').select();
    $('msg').textContent = 'Selected. Copy it now.';
  });
  render();
</script>
</body>
</html>
Type the week's details and the list updates. Select it and paste it into your chat.

Then paste this prompt, followed by the list.

Write one complete HTML page, in a single file, as this week's
church bulletin. Use a calm, light layout with large readable text.
It must work on a phone. Do not load anything from other websites:
no external images, scripts or fonts.
Use only the facts I give you. Do not invent times, names, hymns or readings.
Put the church name and date at the top, then a change notice line,
then the order of worship as a list with one line per item,
then announcements that fold open, then a short table for the week ahead,
then one line saying who to reply to.
Add a button that makes the text larger.
Draw any picture as a simple inline SVG.

Here is this week's list:
[paste the list]

When the page comes back, check these before anything else:

  • Every time matches your list, and the order is the one you meant.
  • Every name is spelled the way the person spells it.
  • Nothing appears that you did not provide, such as a reading or a quote.
  • The page reads well when you narrow the browser window to phone width.

If something is wrong, tell the chat the correction in plain words and copy the new version. Host ChatGPT HTML output covers the copy step.

Copy the HTML from the chat, paste it into a NOS document, and choose Create share link. HTML to link walks through it. The page renders as written and its scripts run, so the larger-text button and the folding announcements work.

The people you send it to open it in a browser, phone included, with no account. They cannot edit it. Paste the link into an email or a text message, the way you would paste any web address.

From this week's list to one link in four steps.
From this week's list to one link in four steps.

Open the link on your own phone before you send it. Check the date and the change notice, then scroll to the end.

What a member sees on a phone, and why the page is laid out that way.
What a member sees on a phone, and why the page is laid out that way.

For a paper notice board or the back of the hall, a QR code can point to the same link. QR code link explains how.

Edit the same page each week

On Monday, paste the new list into the chat and ask for the same page with the new details. Copy the new HTML, replace the old code in the NOS document, and the same link shows the new bulletin.

A new file each week piles up in inboxes. One link shows the current page.
A new file each week piles up in inboxes. One link shows the current page.

Members keep one link, and you send a short message each week saying the new bulletin is up. HTML for weekly updates covers the same habit for other kinds of updates.

Editing replaces what the link shows. If you want to keep past bulletins, paste each week into its own NOS document and share each one. Keep the text in your own files too.

A visitor can open an announcement or press the larger-text button, but nothing they do is saved. In View mode, the owner's own changes, such as ticks and added rows, are saved. Treat the page as something you publish, not something members fill in.

A bulletin can travel three ways. They differ most when a time changes after you have sent it.

Printed sheet Attachment Link
Needs an account to open No No, but opening depends on the phone and the mail app No
Fix a time after sending Reprint. Copies already handed out stay as they were Send the file again. The old one stays in inboxes Edit the page. The same link shows the new version
Everyone sees the same version Only if you collect the old ones Only if everyone opens the newest Yes
Good for People who prefer paper Keeping a copy Phones and quick changes

Paper and a link work well together. Print for the pews, and say on the sheet that the page has the latest order. Why links beat attachments compares more ways to send.

When it does not work

What you see Cause Fix
A time or a name is wrong The AI guessed a detail, or a line was mistyped Correct it in the chat, copy the new version, paste it again
A picture is an empty box The page asks another website for the image Ask the AI to draw it as inline SVG, and check on a phone
The text is tiny on a phone The page has no phone sizing Ask the chat to make it work on a phone
Someone cannot open an attached file An attachment depends on the phone and the app Send the link, see open HTML on a phone
Members try to sign up on the page A form inside the page cannot send answers to a server Ask them to reply to your message
People ask for a password NOS has no password feature Send the link only to the people you choose
A member still sees last week's page They opened an old file or an old message Send the link again and say the page is current

Questions people ask

Do members have to sign up or make an account?

No. Anyone who has the link opens the page in a browser, phone included, with no account. You send the link to the people you already write to, so there is no sign-up form to build or manage.

Can I keep last week's bulletin?

Editing the page replaces what it shows, so last week's version is gone from that link. To keep each week, paste each bulletin into its own NOS document and share each one. Keep a copy of the text in your own files as well.

Is the link private?

It is unlisted, not locked. Anyone who has the link can open it, and there is no password feature. Ask people before you name them or their health or family news, and keep home addresses and phone numbers off the page.

Can members reply or sign up for an event on the page?

Not directly. A form inside the page cannot send its answers to a server. Ask people to reply to the message the link came in, and add what they tell you to the page yourself.

Can I still print it?

Yes. Keep a paper copy for people who prefer it. Print your original file, or print the page from the browser, and add a line saying the page has the latest order. The guide on printing an HTML page covers the steps.

Keep reading