# Chains and multi-location businesses – Tiempo

> Model a chain with several shops: locations with their own timezones, staff who work at different sites on different days, searches per shop, and closing one site without touching the others.

Source: https://tiempo.one/docs/multi-location

A business with several sites is still one account, with a **location** per site. Staff belong to the business, not a shop, so someone who works Mondays in Soho and Tuesdays in Shoreditch is one resource with one diary, and can never be booked in both places at once.

Independent businesses that happen to share an owner (franchises, say) are usually separate accounts, so their data, staff and bookings stay apart. That’s your product’s call.

One location per site

```bash
curl -X POST "$TIEMPO/v1/locations" \
  -H "Authorization: Bearer $TIEMPO_KEY" \
  -H "Tiempo-Account: $ACCOUNT" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Shoreditch",
    "timezone": "Europe/London"
  }'
```

## Who works where

Each interval of a schedule can name a `location`; without one it falls back to the resource’s `default_location`. Times are read in that location’s timezone, so a chain across London and Madrid writes everyone’s hours in local time.

Rooms and chairs that never move just get a `default_location` and a plain schedule.

Sam alternates between two shops

```json
"weeks": [{
  "monday":    [{ "start": "09:00", "end": "17:00", "location": "loc_soho" }],
  "tuesday":   [{ "start": "09:00", "end": "17:00", "location": "loc_shoreditch" }],
  "wednesday": [{ "start": "09:00", "end": "17:00", "location": "loc_soho" }]
}]
```

## Search one shop

Pass `location` to a search and only time at that site counts. A customer browsing the Shoreditch page sees Sam on Tuesdays only. Without `location` you get every site, which suits “any shop near me” if you then show where each slot is.

The [availability calendar](https://tiempo.one/docs/availability) explains a day per resource: on a day Sam is at the other shop, a calendar filtered to Soho says `elsewhere` and names the location, so your app can link across.

Times at Shoreditch

```bash
curl -X POST "$TIEMPO/v1/availability" \
  -H "Authorization: Bearer $TIEMPO_KEY" \
  -H "Tiempo-Account: $ACCOUNT" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "2026-11-16T00:00:00Z",
    "to": "2026-11-23T00:00:00Z",
    "location": "loc_shoreditch",
    "segments": [
      {
        "resources": [
          "res_sam",
          "res_jo"
        ],
        "duration_minutes": 60
      }
    ]
  }'
```

## Closing one site

A block on a location closes that site for everyone scheduled there, for a refit or a bank holiday that only one city observes. Staff who are at another site that day are untouched. A block on the account closes every site at once.

Bookings caught by a closure are flagged `conflicted` with a `booking.conflicted` webhook, so each shop can rebook its customers.

Shoreditch closed for a refit

```bash
curl -X POST "$TIEMPO/v1/blocks" \
  -H "Authorization: Bearer $TIEMPO_KEY" \
  -H "Tiempo-Account: $ACCOUNT" \
  -H "Content-Type: application/json" \
  -d '{
    "location": "loc_shoreditch",
    "start_date": "2026-11-23",
    "end_date": "2026-11-25",
    "reason": "refit"
  }'
```

## Reporting across sites

Every booking segment records its location, and every change is an event your webhook receives, so your app can keep per-shop reports in its own database. To list a site’s day, list the account’s bookings for the date and group them by segment location.

Start with the [salons guide](https://tiempo.one/docs/salons-and-barbers) for services and staff, or the [locations reference](https://tiempo.one/docs/locations).

The machine-readable description is at [/openapi.json](https://tiempo.one/openapi.json). Try calls in [Swagger UI](https://tiempo.one/swagger-ui.html).[Tiempo home](https://tiempo.one/)[Dashboard](https://tiempo.one/app)
