<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[WeddingBeacon Engineering]]></title><description><![CDATA[WeddingBeacon Engineering]]></description><link>https://weddingbeacon.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 01 Nov 2026 17:14:31 GMT</lastBuildDate><atom:link href="https://weddingbeacon.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Giving your caterer a final headcount when your wedding has more than one event]]></title><description><![CDATA[What I learned modelling per-event RSVPs, written for couples as much as developers]]></description><link>https://weddingbeacon.hashnode.dev/giving-your-caterer-a-final-headcount-when-your-wedding-has-more-than-one-event</link><guid isPermaLink="true">https://weddingbeacon.hashnode.dev/giving-your-caterer-a-final-headcount-when-your-wedding-has-more-than-one-event</guid><category><![CDATA[wedding]]></category><category><![CDATA[Django]]></category><category><![CDATA[Python]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[Carlton Shiembo]]></dc:creator><pubDate>Sun, 18 Oct 2026 20:27:58 GMT</pubDate><content:encoded><![CDATA[<p>If your wedding is one ceremony and one reception with the same guests at both, the headcount is easy. Count the yeses and send the number.</p>
<p>A lot of weddings don't look like that. A Nigerian or Cameroonian couple might have a traditional ceremony on Friday, a church wedding on Saturday morning and a reception that evening. Some guests come to everything. Some are only invited to the reception. Close family might be at the traditional ceremony but miss the church service because they're busy with the food. Then the caterer asks for "the final number" and you realise there isn't one number. There are three.</p>
<h2>The mistake: one yes for the whole wedding</h2>
<p>The most common setup I see is a spreadsheet with a single "Attending" column. It works until someone says yes and you can't tell which event they meant. Your aunt who is coming to the traditional ceremony and your colleague who is coming to the reception both count as one "yes", and the Friday caterer gets a number that includes people who will never be there.</p>
<p>When I started building RSVPs for WeddingBeacon, this was the first thing I got wrong. I had an <code>attending</code> boolean on the guest. It lasted about a week.</p>
<h2>The shape that works</h2>
<p>The fix is to stop treating an RSVP as something a guest has. It belongs to a pair: this guest, this event.</p>
<p>A simplified version in Django looks like this:</p>
<pre><code class="language-python">class Event(models.Model):
    wedding = models.ForeignKey(Wedding, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)  # "Traditional", "Church", "Reception"
    starts_at = models.DateTimeField()


class Invitation(models.Model):
    guest = models.ForeignKey(Guest, on_delete=models.CASCADE)
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    response = models.CharField(
        max_length=10,
        choices=[("pending", "Pending"), ("yes", "Yes"), ("no", "No")],
        default="pending",
    )

    class Meta:
        unique_together = ("guest", "event")
</code></pre>
<p>Two useful things come out of this.</p>
<p>First, a guest can only answer for events they have an invitation row for. No row, no event on their page. That matters socially as much as technically. Nobody wants to find out about a reception they weren't invited to.</p>
<p>Second, the headcount for an event is just a count:</p>
<pre><code class="language-python">Invitation.objects.filter(event=event, response="yes").count()
</code></pre>
<p>That's the number for the caterer, one per event. If guests can bring children or a partner, store the party size on the invitation and sum it instead of counting rows.</p>
<h2>If you're not a developer</h2>
<p>You don't need code to use the same idea. A spreadsheet will do:</p>
<ul>
<li>Make one column per event, not one "Attending" column.</li>
<li>Leave a cell blank if that guest isn't invited to that event. Blank means "not invited" and "No" means "invited but not coming". Keep those apart.</li>
<li>Count each column on its own. That's the number for that event.</li>
<li>Keep "no reply yet" as its own figure. Caterers want to know how many are still unknown, not only how many said yes.</li>
</ul>
<h2>Getting to the number you'll actually send</h2>
<p>Caterers usually want a final figure a week or two before the day. A few things make that easier.</p>
<p>Set your RSVP deadline a few days before the caterer's deadline, not on the same day. You'll need that gap to chase the people who haven't replied.</p>
<p>Chase per event. "Are you coming?" gets a vague answer. "Are you coming to the reception on Saturday evening?" gets a real one.</p>
<p>Ask about children separately if your caterer prices them differently.</p>
<p>Leave a small buffer for the event where extra family tends to appear. Most couples already know which one that is.</p>
<h2>Where WeddingBeacon fits</h2>
<p>This is how RSVPs work in WeddingBeacon. You can set up to six events on one site, each guest gets a personal WhatsApp or email invite that opens their own page, and they only see and answer for the events they're invited to. Guests who say yes get a QR guest pass, and your door team can check people in from a phone, so you also know who actually turned up. If you'd like to see it, everything is at <a href="https://weddingbeacon.com/">weddingbeacon.com</a>.</p>
<p>Free to start at weddingbeacon.com</p>
]]></content:encoded></item><item><title><![CDATA[What I learned building QR guest check-in for weddings with Django]]></title><description><![CDATA[WeddingBeacon is a wedding website builder, and one of the parts I enjoyed building most was the guest check-in at the door. Here are a few honest notes…]]></description><link>https://weddingbeacon.hashnode.dev/what-i-learned-building-qr-guest-check-in-for-weddings-with-django</link><guid isPermaLink="true">https://weddingbeacon.hashnode.dev/what-i-learned-building-qr-guest-check-in-for-weddings-with-django</guid><dc:creator><![CDATA[Carlton Shiembo]]></dc:creator><pubDate>Sun, 18 Oct 2026 18:27:13 GMT</pubDate><content:encoded><![CDATA[<p>WeddingBeacon is a wedding website builder, and one of the parts I enjoyed building most was the guest check-in at the door. Here are a few honest notes from building it with Django and Python.</p>
<h2>The problem</h2>
<p>At a lot of weddings, especially big multi-event ones, the door is chaos. Someone has a printed list, someone else has a WhatsApp thread, and nobody is sure who has already arrived. I wanted the door team to be able to check people in from a phone without seeing anything they don't need.</p>
<h2>Guest QR passes</h2>
<p>When a guest RSVPs yes, they get a QR guest pass. The idea is that the QR code identifies the guest's pass without carrying their personal details, so the door team just scans and the server does the lookup.</p>
<p>A few things I learned:</p>
<ul>
<li><strong>Keep the token unguessable and separate from the primary key.</strong> Sequential IDs in a QR code are an invitation to enumerate guests.</li>
<li><strong>Make scanning idempotent.</strong> Door staff will scan the same pass twice. The second scan should simply say the guest is already checked in, not throw an error or create a duplicate.</li>
<li><strong>Keep the screen simple.</strong> Venues often have weak reception, so the check-in screen should be lightweight and do one thing.</li>
</ul>
<h2>A check-in role that only marks arrivals</h2>
<p>The bit I care most about is permissions. Couples add helpers through team roles: Owner, Editor and Check-in. The Check-in role can mark arrivals and see who's coming. It can't open gifts, guest notes, invites or the website.</p>
<p>In Django this was mostly about being strict and boring:</p>
<ul>
<li>Each wedding has team memberships with a role.</li>
<li>Views check the role explicitly instead of relying on "is this user logged in and attached to the wedding".</li>
<li>The check-in views only expose what the door needs.</li>
</ul>
<p>It's tempting to give helpers broad access "just for the day". In practice, a cousin on the door with full edit access is how guest lists get accidentally changed at 6pm. A narrow role removes that risk.</p>
<h2>Per-event guests</h2>
<p>Many weddings have several events, like a traditional ceremony, a white wedding and a reception. Each guest is invited to specific events and RSVPs to each one. Modelling invitations per event, rather than a single "attending" flag on the guest, makes both RSVPs and the door list much simpler.</p>
<h2>What I'd tell someone building something similar</h2>
<ol>
<li>Put permissions in the data model early. Retrofitting roles is painful.</li>
<li>Treat the door as a separate, minimal part of the app.</li>
<li>Test with real people holding real phones in a noisy room. It exposes every unclear button.</li>
</ol>
<p>If you're curious what this looks like in a real product, it's live at <a href="https://weddingbeacon.com">weddingbeacon.com</a>.</p>
]]></content:encoded></item></channel></rss>