# Appointment Booking All in One for Many Locations

> Appointment booking across branches: the visitor picks the location, only staff who work there are offered, and travel time prevents clashes.

- **What it is:** Appointment booking across branches: the visitor picks the location, only staff who work there are offered, and travel time prevents clashes.
- **For:** Website
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 228 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_booking_locations
- **Not for:** Travel time is a number you set, not a route somebody computed. Two branches ten minutes apart at 11:00 and forty at 17:00 are one number here - pick the one you would rather explain.; A staff member's working hours are still one calendar per person (Booking Pro's Working hours). Different hours at different branches is not modelled; the common approach is a member per branch.
- **Manual:** https://docs.bambooforge.dev/bambooforge_booking_locations/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_booking_locations.action_bf_booking_location
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_booking_locations
- **Manual last updated:** 2026-10-15

---
# Appointment Booking All in One for Many Locations

An add-on for **BambooForge Booking Pro**. Booking Pro's location is one
line of text on the service; this makes the branch a record, with the
people who work there and the time it takes to reach the next one.

## Install

1. Install **BambooForge Booking: Multi-location** (it needs Booking Pro). Nothing changes until a service is given branches; a service with none keeps the page and the behaviour it had.
2. Open the new menu *Booking Pro → Locations*.

## Locations

*Booking Pro → Locations*. A location is:

| Field | What it is for |
|---|---|
| Name, address, phone | Shown to the visitor under the branch selector, in the confirmation page, and in the LOCATION line of the .ics invitation. |
| Directions | Free text for the confirmation: parking, entrance, which floor. |
| Staff working here | Who can take bookings at this branch. A member listed under **no** branch works everywhere - the mobile hairdresser, the online consultant. |
| Travel time to other | Minutes to reach or leave this branch, used |
| locations | when no explicit pair is defined. |
| Travel time to specific | Per pair. One row serves both directions. |
| branches |  |

Then, on each service: **Offered at** - one branch, some, or none.

## What the visitor sees

A *Where?* selector above the calendar, with the address and directions
of the chosen branch under it. The first branch is preselected, so the
calendar is never shown unfiltered. Changing the branch reloads the
slots and hides, in the *With* dropdown, the staff who do not work
there.

The branch travels with the booking: into the record, into the manage
page, into the calendar event and into the invitation - because a
customer with two branches in their calendar and no address on the event
drives to the wrong one.

## Travel time

A stylist finishing in Altona at 12:00 cannot start in the city centre
at 12:00. When a slot is computed for one branch, every booking that
person has at **another** branch blocks the calendar for the booking
**plus the journey** on both sides.

Which journey:

- the explicit pair between the two branches, if there is one, in either
  direction;
- otherwise the **larger** of the two branches' default travel times.

The larger, not the smaller, because the pessimistic side of that choice
is a gap in the diary and the optimistic side is a customer waiting in
the wrong branch.

A booking at the **same** branch needs no journey; the service's own
buffers apply as before.

## Honest limits

- Travel time is a number you set, not a route somebody computed. Two
  branches ten minutes apart at 11:00 and forty at 17:00 are one number
  here - pick the one you would rather explain.
- A staff member's working hours are still one calendar per person
  (Booking Pro's *Working hours*). Different hours at different branches
  is not modelled; the common approach is a member per branch.

## Multi-company

Locations belong to a company and are filtered by it. Staff and services
are Booking Pro's and follow its rules.

## How we make sure it works

Before every release, **30 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- Travel time pads only the journey not the day.
- A branch with upcoming bookings cannot be deleted.
- An archived branch is not offered on the page.
- Moving a booking to another branch updates the invitation.
- A branch of another service is ignored.

The complete list is in the source you receive.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Web; booking pro (BambooForge) must be installed first app. No extra Python package.

****Where does it show up?****

Under the **Locations** menu.

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.

## Support

[support@bambooforge.dev](mailto:support@bambooforge.dev) - the people who wrote it.
