Syncing Airbnb, Booking and Agoda calendars by iCal: the bugs behind double bookings
HostBooking · · 7 min read
iCal is the simplest way to sell on Airbnb, Booking.com, Agoda and your own website at once: each side reads the other’s calendar link and blocks the nights already taken. But iCal carries only dates, no prices or guest names, and there is always a delay. Here are two bugs found while testing with real calendars, and the habits that prevent double bookings.
How iCal works
iCal sync runs both ways. You paste your calendar link into the OTA’s Import calendar setting, and paste the OTA’s Export calendar link into your software. Each side re-reads the other’s link on its own schedule; neither pushes a booking across the moment it happens.
An iCal link is just a list of busy date ranges. Each has a start date, an end date, an identifier and sometimes a title. It does not carry the price, guest name, number of guests, deposit or commission. The booking, the money and the guest details stay on the OTA.
There is always a gap
HostBooking re-reads each OTA’s calendar every 5 minutes. The other direction is up to the OTA: how often it reads your link is its own choice, sometimes every few hours, and you cannot change it. In between, a night just sold on your website can still show as free on the OTA. iCal cannot close that gap; you can only make it less harmful.
Bug 1: an expired link read as an empty calendar
Testing with real calendars, we met iCal links that returned an ordinary web page, such as a sign-in page or a "this link has expired" notice, with HTTP status 200, meaning "success". The earlier version read that page as a calendar with no stays in it. An "empty" calendar released every night already sold on the OTA, with no error shown. This is the most dangerous way iCal fails.
Now any content without a BEGIN:VCALENDAR line (the first line of every calendar file) is a "not a calendar" error. Nights already blocked stay blocked, the calendar sync page shows the reason, and the manager is notified, once per problem. Other fetch errors, such as a link that is gone (404) or a site that does not answer, also leave blocked nights as they were.
Bug 2: UTC times shifting a stay by a day
OTA calendars usually write whole dates, with no time. But calendars exported from Google Calendar, Outlook and some other tools write instants in UTC, such as 20261115T170000Z: 5 pm on the 15th in Greenwich, which is midnight on the 16th in Vietnam. The earlier version took the date part (the 15th) as it was, so the whole stay moved a day early: the night before arrival was blocked and the guest’s last night was left open.
Now a UTC instant is converted to the property’s time zone before its date is taken. Calendars with whole dates are read as before.
What is skipped when a calendar is read
- Cancelled stays: some OTAs leave a cancelled stay in the calendar, only marked as cancelled. Those are skipped and the nights open again.
- Past stays: skipped, so a calendar with years of history cannot push the coming stays out.
- That OTA’s own guests: the link you give Airbnb leaves out guests who booked on Airbnb. Echoed back, the two calendars would block each other in a loop and a cancelled night would never reopen.
Habits that prevent double bookings
- Connect both directions for every room type. One direction means only one side knows about the other. If each unit is its own OTA listing, use that room’s link rather than the room type’s.
- Check right after connecting. Press Sync now, then compare one real stay on both sides: same check-in, same check-out, no shift.
- Be careful with last-minute bookings. When a guest calls for tonight or tomorrow, look at the OTA calendar before accepting, or close the room on the OTA by hand right after: the OTA may not have re-read your link yet.
- Paste a new link straight away. When you regenerate an export link on the OTA, the old one usually stops working.
- Do not ignore a broken-calendar alert. While a calendar is broken, old nights stay blocked but new OTA bookings do not come in.
- Sort out an overlap at once: move one guest to another room of the same type if there is one; if not, contact one of the guests early to find an alternative.
On HostBooking
OTA calendar sync pulls OTA calendars every 5 minutes, gives each OTA its own link, and alerts you when a calendar breaks or a night is double-booked. Pulling OTA calendars needs the Basic plan or above, or the OTA sync add-on on the Free plan (see pricing). Your own calendar link, for pasting into OTAs, works on every plan.
For guest names and prices as well as dates, forward the OTAs’ booking emails so they become bookings.
Frequently asked questions
Is iCal sync instant?
No. HostBooking reads OTA calendars every 5 minutes, and each OTA reads your link on its own schedule, sometimes every few hours. Check last-minute bookings by hand.
Why does the OTA still show a night as free after a website booking?
The OTA has not re-read your calendar link yet. Wait for its next read, or close the room on the OTA by hand if the night is soon.
What should I do when a calendar says it "returned a web page, not a calendar"?
The link has expired or changed. Copy a fresh export link from the OTA and paste it in place of the old one. Meanwhile, blocked nights are kept.
Does iCal carry prices or guest names?
No. iCal carries booked dates only. Prices and bookings stay on the OTA, or use the OTA’s booking emails to get full bookings.