iCal feeds (import + export)

Updated on 2026-04-29

For channels that have no API (and so don't go through Channex), use iCal feeds. Works with: Bedandbreakfast.eu, Gites de France, Clévacances, Belvilla, Novasol, Interhome, Logis Hotels and basically anyone who exposes an .ics URL.

How it works

| Direction | What BedFlow does | |---|---| | Import | Pulls a remote .ics URL hourly and turns each VEVENT into a block in /room-availability-overview. Cancellations at the source are auto-reconciled. | | Export | Generates a public .ics URL per room covering all bookings + manual blocks. External systems subscribe to it. | | Both | Both at once (useful for PMS-to-PMS sync). |

Setup

  1. Open Manage → iCal feeds in BedFlow
  2. Click New iCal feed
  3. Fill in:
    • Name: free text, e.g. "Bedandbreakfast.eu — Room 4"
    • Room: pick a room
    • Direction: usually import for incoming blocks
    • iCal URL: the .ics link from the external system
  4. Save
  5. Click Sync now in the actions column to test immediately
  6. Cron picks it up hourly afterwards

For export

  1. Create a feed with direction export (URL not needed)
  2. After save click Copy export URL in the actions column
  3. Paste that URL into the external system (e.g. Booking.com extranet → "Add iCal URL")

Multi-tenancy

Each feed is bound to one property + one room. TenantScope ensures operators only see their own property's feeds. The export token in the public URL is 48 characters long and unique per feed — a leaked token only exposes one room's bookings, not the whole tenant.

Under the hood

  • Table: ical_feeds
  • Services: App\Services\Ical\IcalImportService + IcalExportService
  • Cron: php artisan ical:sync-imports hourly via Laravel scheduler
  • Route: GET /ical/{token}.ics — public, no-auth, token-protected
  • Reconciliation: imported rows are tagged source = "ical:{feed_id}" on room_calendar_data; only rows with that tag are re-evaluated each sync, leaving manual blocks, MyTourist sync, and Channex bookings untouched.

Limitations

  • iCal is a read-only sync: import brings in availability only — no prices, no guest info. For full-feature OTA integration use Channex.
  • iCal publishers themselves often only update daily — a booking made on Bedandbreakfast.eu won't land instantly, more like 1-24 hours later.
  • Recurrence rules (RRULE) are NOT supported. For accommodation feeds this is fine (each booking = 1 VEVENT).