> ## Documentation Index
> Fetch the complete documentation index at: https://opencals.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Checkout: existing customers and booking addresses

> Storefront checkout no longer returns tokens for, or changes, an existing customer identified only by the email in the request. Addresses entered for such a booking are saved to the customer once the order is placed.

**October 18, 2026**

## Existing customers at checkout

Storefront API keys are public, so an email or `customerId` in a checkout
request is a claim, not proof of who is booking. A customer named in the
request is now only treated as the caller when the request is signed in as
that customer (customer `Authorization` token), or when this cart's checkout
created them.

When a guest enters the email of an existing customer and isn't signed in:

* The booking is still attached to that customer, so it shows in their account
  after they sign in (for example with a login code).
* Nothing on their profile is overwritten: name, phone, billing address and
  marketing consent stay as they were.
* `checkout/submit` returns no `auth` or `customer`, and `checkout/save-customer`
  returns `{}` without a `customerId`.
* Cart and appointment responses show `customer` and `customerId` as `null`.
  The `customerFirstName`, `customerEmail` and other snapshot fields echo what
  was entered.

### Addresses

`checkout/save-customer` and `checkout/start` don't write to the customer.
Until the order is placed, billing and delivery addresses entered for such a
booking belong to the cart only, and their `customerId` is `null` (for example
`cart.billingAddress.customerId`). When `checkout/submit` places the order,
they're added to the customer's saved addresses. The order and invoice use
them as entered. Treat an address's `customerId` as nullable.

### Billing at submit

Required billing fields are checked against the `billingAddress` in the
request, or, when the request has none, against the billing address already
saved on the cart. You no longer need to send the billing address again at
`checkout/start` or `checkout/submit`. A billing address sent for the first
time with `checkout/submit` is linked to the order. A submit rejected for missing customer
details leaves the cart's reservation in place until the cart expires as
usual.

**What to change in your integration:** always treat `auth` on the submit
response as optional, and don't rely on `save-customer` returning a
`customerId`. When it doesn't, either send the same customer details again in
the next steps or leave `customer` out: the cart already holds the customer.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.