Salons & Spas
AI receptionist for Boulevard
An AI voice agent that answers every call, qualifies the caller and works your dormant list — connected directly to Boulevard. No Zapier, no Make, no middleware anywhere in the booking path.
What the connection does
- Read leads & contacts
- Write leads & call outcomes
- Read availability
- Book into the native calendar
Why Boulevard businesses buy this
Salons live and die on the front desk, and the front desk is busiest exactly when the phone rings. A stylist mid-colour will not stop to answer, so the call goes to voicemail and the client books somewhere else. The value of a native Boulevard connection is not that a machine answers — it is that the answer ends in a real appointment sitting in the real calendar, visible to the team on the floor without anyone re-keying it.
The objection we hear from Boulevard businesses is not about voice quality. It is about double-booking. If an AI books into a side calendar and someone syncs it later, two clients eventually arrive for the same chair, and one of them does not come back. Writing into Boulevard as the system of record is the only version of this that a salon owner can safely say yes to.
Multi-location groups need per-location scoping rather than one shared connection. Staff rosters, service menus and opening hours differ by site, and a group that connects each location separately can pilot one shop, prove the booking path, and expand without touching the others. That also matches how Boulevard scopes credentials, so the product model and the API model agree.
Reactivation is where the revenue shows up first. A salon with a few thousand dormant clients in Boulevard is sitting on booked chairs; the constraint has always been that nobody has time to call them. Reading that list and dialling with per-client detail — last service, last visit, usual stylist — is the feature that pays for itself before inbound answering does.
How you connect it
Authentication: API key + secret with HMAC-signed HTTP Basic, scoped per business
| Credential | Where you find it |
|---|---|
| Boulevard API key | Boulevard dashboard → Manage → Developer Apps → your app |
| Boulevard secret key | Shown once when the app credential is created. Store it; Boulevard will not show it again. |
| Business ID | Boulevard dashboard URL, or Manage → Business Information. A UUID, not the business name. |
Boulevard does not use a single platform-wide key, and that detail matters more than it sounds. Every request is signed with your own credentials against your own business ID, so your client records never pass through a shared AutoCallFlow account and we never hold a licence on your behalf. The three values are combined into a signed basic authorization header on each request, and the secret is used only to compute that signature — it is never transmitted upstream. Because the scope is the business ID, a multi-location group connects each location separately, which also means you can pilot one location before rolling the rest out.
Field mapping
The exact paths this connection reads and writes. Published so you can check them against your own Boulevard data before you commit to anything.
| AutoCallFlow | Boulevard | Notes |
|---|---|---|
| caller.phone | clients.edges[].node.mobilePhone | Boulevard matches on its own stored format rather than strict E.164, so we query the number as dialled and then retry the ten-digit national form before treating the caller as unknown. |
| caller.first_name / caller.last_name | clients.edges[].node.firstName / lastName | Used to greet a returning client by name in the first turn. If the lookup misses we fall through to the unknown-caller script rather than guessing at a partial match. |
| appointment.start_at | appointments.edges[].node.startAt | Returned as an absolute instant. We never store a floating local time, because a floating time written back as UTC silently moves an appointment by hours. |
| appointment.timezone | appointments.edges[].node.location.tz | Taken from the location rather than the account, so a two-location group spanning a timezone boundary still reads back the correct local hour to the caller. |
| appointment.service_name | appointments.edges[].node.appointmentServices[].service.name | A booking can carry several services. We join them so a multi-service visit is read aloud as "cut and colour" rather than only the first line item. |
| appointment.staff_name | appointments.edges[].node.appointmentServices[].staff.firstName | Behind a per-account toggle. Some businesses treat stylist assignment as internal, so naming the provider out loud is opt-in rather than default. |
Constraints worth knowing up front
- The Admin API is GraphQL and answers HTTP 200 even for business-logic failures, so the errors array is the real signal. We classify every response rather than string-matching upstream prose, which means a rejected reschedule produces a specific spoken apology instead of a generic failure.
- Identifiers are URNs rather than bare UUIDs. We accept either form and normalise, because an identifier copied out of the Boulevard dashboard is not in the same shape as one returned by the API.
- Client lookup and appointment read are issued as one round trip. Inbound latency is audible — the caller is listening to ringback while this runs, so a second sequential query would be heard as a pause before the greeting.
- Boulevard publishes its Admin API behind a gated developer portal, so access requires an approved developer app on your account. This is a request you make in your own dashboard; we cannot provision it for you and we do not want a copy of your credentials outside your own connection record.
Questions we actually get asked
Connect Boulevard to your phone line
Build the agent yourself in the dashboard, or tell us what you need it to do and we will set the whole thing up for you.
Boulevard is a trademark of its respective owner. AutoCallFlow is not affiliated with, endorsed by, or sponsored by Boulevard. All product names, logos and brands are the property of their respective owners and are used here only to describe interoperability.