<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on BunnyCal Blog</title><link>https://bunnycal.io/blog/</link><description>Recent content in Blog on BunnyCal Blog</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://bunnycal.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Let Customers Book Appointments Online</title><link>https://bunnycal.io/blog/how-to-let-customers-book-appointments-online/</link><pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/how-to-let-customers-book-appointments-online/</guid><description>&lt;p&gt;If you run a small business, you know this conversation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Are you free Tuesday?&amp;rdquo;
&amp;ldquo;Tuesday&amp;rsquo;s full. Wednesday afternoon?&amp;rdquo;
&amp;ldquo;Can&amp;rsquo;t do Wednesday. Thursday morning?&amp;rdquo;
&amp;ldquo;Thursday morning works — 10 or 11?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Four messages, two days, one appointment. Multiply that by every client, and
you are spending hours a week doing calendar arithmetic instead of the work you
actually get paid for.&lt;/p&gt;
&lt;p&gt;Online appointment booking replaces all of it with one link. You share the link,
the customer sees the times you are genuinely free, they pick one, and it lands
on both of your calendars. No back-and-forth, no double bookings, and nobody has
to be awake at the same time for it to work.&lt;/p&gt;</description></item><item><title>The outbox pattern and the crash in between</title><link>https://bunnycal.io/blog/the-outbox-pattern-and-the-crash-in-between/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/the-outbox-pattern-and-the-crash-in-between/</guid><description>&lt;p&gt;When you build a calendar application, creating a booking is rarely just a
database operation.&lt;/p&gt;
&lt;p&gt;Imagine this simple flow:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bob creates a calendar booking with Alice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the booking is created, we need to do at least two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Save the booking in the database.&lt;/li&gt;
&lt;li&gt;Notify Alice that she has been invited.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At first glance, this sounds straightforward.&lt;/p&gt;
&lt;p&gt;But once these operations cross system boundaries, things get surprisingly
interesting.&lt;/p&gt;
&lt;p&gt;What happens if the booking is saved successfully, but the application crashes
before the email is sent?&lt;/p&gt;</description></item><item><title>What shipped in July</title><link>https://bunnycal.io/blog/changelog-july-2026/</link><pubDate>Sat, 25 Jul 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/changelog-july-2026/</guid><description>&lt;p&gt;A month of work that mostly amounts to removing steps from things you already
do more than once a day.&lt;/p&gt;
&lt;h2 id="multi-account-calendars"&gt;Multi-account calendars&lt;/h2&gt;
&lt;p&gt;You can now connect more than one calendar account per provider — two Google
accounts, or a Google and a Microsoft account side by side. Every connected
calendar can be marked as a conflict source, while exactly one stays the write
target for new bookings.&lt;/p&gt;
&lt;p&gt;This also fixes a long-standing sharp edge: connecting a second account used to
overwrite the first. Each connection is now independent, with its own disconnect.&lt;/p&gt;</description></item><item><title>Round-robin that actually balances</title><link>https://bunnycal.io/blog/round-robin-that-actually-balances/</link><pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/round-robin-that-actually-balances/</guid><description>&lt;p&gt;Every scheduling tool with a team plan claims to do round-robin. Most of them
implement the same thing: keep a pointer, hand the next booking to whoever is
next in the list, advance the pointer. It demos beautifully. It falls apart in
the second week.&lt;/p&gt;
&lt;h2 id="why-a-rotating-pointer-drifts"&gt;Why a rotating pointer drifts&lt;/h2&gt;
&lt;p&gt;A pointer only counts &lt;em&gt;offers&lt;/em&gt;, not outcomes. Consider a three-person team where
everyone is nominally equal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Priya works Tuesdays through Fridays.&lt;/li&gt;
&lt;li&gt;Marco is on Pacific time; the team&amp;rsquo;s booking page is mostly booked by European
prospects in the morning.&lt;/li&gt;
&lt;li&gt;Dana has back-to-back internal meetings every Monday.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pointer doesn&amp;rsquo;t know any of that. It offers Marco the 9am CET slot, finds he
has no availability, and skips to the next person. Skipping &lt;em&gt;doesn&amp;rsquo;t cost Marco
his turn&lt;/em&gt; — so he stays at the head of the queue and gets skipped again. By
Friday, Priya has taken sixteen calls and Marco has taken three, and nobody
touched a setting.&lt;/p&gt;</description></item><item><title>Every timezone bug is really a calendar bug</title><link>https://bunnycal.io/blog/timezone-bugs-are-calendar-bugs/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/timezone-bugs-are-calendar-bugs/</guid><description>&lt;p&gt;Scheduling bugs cluster around two moments in the year, and they are the same
two moments for everyone: the second Sunday in March and the last Sunday in
October — give or take, depending on which hemisphere and which government.&lt;/p&gt;
&lt;h2 id="the-assumption-that-breaks"&gt;The assumption that breaks&lt;/h2&gt;
&lt;p&gt;The bug is almost always this: storing a meeting as a &lt;em&gt;wall-clock time plus an
offset&lt;/em&gt; rather than as an instant plus a timezone.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;startsAt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2026-10-24T09:00:00+01:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;recurrence&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WEEKLY&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That looks unambiguous, and for a single meeting it is. But the recurrence rule
has to answer &amp;ldquo;when is the next one?&amp;rdquo; — and on 25 October, &lt;code&gt;+01:00&lt;/code&gt; stops being
the correct offset for Europe/London. Naively adding seven days gives you
&lt;code&gt;2026-10-31T09:00:00+01:00&lt;/code&gt;, an instant that renders as &lt;strong&gt;8:00am&lt;/strong&gt; to the host.
Their weekly standup silently moves an hour earlier, and only for the half of
the team in a country that just changed its clocks.&lt;/p&gt;</description></item><item><title>Booking pages that convert</title><link>https://bunnycal.io/blog/booking-pages-that-convert/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/booking-pages-that-convert/</guid><description>&lt;p&gt;A booking page has exactly one job, and the gap between a good one and a bad one
is mostly about how much work you ask the guest to do before they see a time.&lt;/p&gt;
&lt;h2 id="1-show-times-before-you-ask-for-anything"&gt;1. Show times before you ask for anything&lt;/h2&gt;
&lt;p&gt;The single biggest drop-off is a form that appears before the calendar. A guest
arrives wanting to know &lt;em&gt;whether you&amp;rsquo;re free Thursday&lt;/em&gt;. Asking for their name,
company, and reason for meeting first inverts the order — they&amp;rsquo;re paying a cost
before receiving any value. Put the slots first and collect details on the
confirm step, when they&amp;rsquo;re already committed.&lt;/p&gt;</description></item><item><title>Multiple calendars, one source of availability</title><link>https://bunnycal.io/blog/multiple-calendars-one-availability/</link><pubDate>Sat, 27 Jun 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/multiple-calendars-one-availability/</guid><description>&lt;p&gt;Most people don&amp;rsquo;t have &lt;em&gt;a&lt;/em&gt; calendar. They have a work Google account, a personal
one, maybe an Outlook calendar from a client engagement — and meetings booked
against any of them are equally real when someone asks if you&amp;rsquo;re free at two.&lt;/p&gt;
&lt;h2 id="read-from-everything-write-to-one"&gt;Read from everything, write to one&lt;/h2&gt;
&lt;p&gt;BunnyCal separates the two operations, because they want opposite defaults.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conflict checking should be greedy.&lt;/strong&gt; Every connected calendar you mark as a
conflict source is queried when computing availability. A dentist appointment on
your personal calendar blocks a work booking, and nobody outside sees why — the
slot is simply gone.&lt;/p&gt;</description></item></channel></rss>