Skip to content

Brands

Taxi & Private HireProductsBrand › Brands

Generally available

Multi-brand operations: tenants running multiple consumer-facing brands (e.g. a premium brand and an economy brand under one back-office) configure each as a Brand row. Each brand has its own ref, name, email, phone, website, optional primary fleet binding, and at most one isDefault per tenant. Brands scope Customers (each customer has a default brand) and can be referenced by Fleet operating-mode logic. Brand selection feeds the customer-facing app theming and the email templates.

Example request

POST /client/{clientId}/brand

{
  "isDefault": false,
  "ref": "<string>",
  "name": "<string>",
  "fleets": [
    {
      "id": "<id>"
    }
  ],
  "primaryGroup": "<string>",
  "primaryContact": {
    "id": "<id>"
  },
  "secondaryContact": {
    "id": "<id>"
  },
  "streetAddress": "<string>",
  "addressArea": "<string>",
  "city": "<string>",
  "state": "<string>",
  "postCode": "<string>",
  "country": "<string>",
  "companyNumber": "<string>",
  "taxNumber": "<string>",
  "tradingAlias": "<string>",
  "companyName": "<string>",
  "website": "<string>",
  "phone": "<string>",
  "email": "<string>",
  "tags": [
    {
      "id": "<id>"
    }
  ],
  "driverNote": "<string>",
  "managementNote": "<string>"
}

Example shape, derived from the Brand fields — indicative, not the authoritative schema (that arrives with the API reference).

Endpoints

MethodPath
POST /client/{clientId}/brand/{brandId}/fleet/{fleetId}
POST /client/{clientId}/brand · primary
DELETE /client/{clientId}/brand/{brandId}/fleet/{fleetId}
GET /client/{clientId}/brand/{brandId}
POST /client/{clientId}/brand/{brandId}

Full request/response schemas and an interactive explorer will live in the API reference (coming soon).

Use cases

Operator flows that exercise this feature.

Assign a fleet to a brand

config risk: low

Link a fleet to a brand for brand-scoped dispatch.

  1. POST /client/{clientId}/brand/{brandId}/fleet/{fleetId}
Create a brand

config risk: low

Onboard a white-label brand / sub-fleet within the tenant.

  1. POST /client/{clientId}/brand

Fields

FieldTypeDescription
isDefault bool Default-brand flag — at most one Brand per tenant has this set. New customers / unassigned bookings fall back to the default brand for theming + email templates.
ref string Short tenant-defined reference key (e.g. "premium", "city-cabs"). Stable handle used in URLs and integration payloads.
name string Display name shown to customers + operators. Drives email-template branding and the customer-app theming.
fleets Collection Fleets this brand operates through. A premium brand might bind to a luxury-only fleet while an economy brand uses the full fleet pool.
primaryGroup string Operator-curated grouping label for the brand (used in console list grouping + reporting cuts). Free-text — not a relation.
primaryContact Customer Customer record nominated as the brand's main point of contact (account manager, owner liaison). A `Customer` reference rather than free text so the contact's phone/email stay in sync with their customer profile.
secondaryContact Customer Secondary / fallback contact Customer for the brand. Same shape as `primaryContact`.
streetAddress string
addressArea string
city string
state string
postCode string
country string
companyNumber string Registered company / business number for the legal entity behind the brand. Jurisdiction-dependent format; appears on customer-facing invoices + receipts.
taxNumber string Tax / VAT registration number for the brand's legal entity. Surfaced on invoices for tax-compliance.
tradingAlias string Trading-as name when the brand operates publicly under a name different to `companyName` (the registered legal name).
companyName string Registered legal name of the company behind the brand. Distinct from `name` (the customer-facing display name) and `tradingAlias` (the public trading name).
website string
phone string
email string
tags Collection Allows multiple brands to be grouped by a common tag, and referred to as a group in other areas of the system
driverNote string Notes shared with the Driver and Operator, to be treated as publicly visible and not to include personal information
managementNote string Internal notes for management use only.
clientId bigint Tenant scope. Every tenant-aware entity carries this; `ClientFilter` enforces row-level isolation on read; the multi-tenancy routing layer (`/client/{clientId}`) sets it at create time. Surfaced only under `admin` / `tripLog` groups — never to end users.
internalKey string Optional client-supplied external reference / idempotency key. When present, lets external systems correlate platform-side records back to their own source-of-truth ids. Not persisted to a column — populated by the request handler when the caller sets it.
__objectType string Discriminator string (entity class short-name) emitted alongside the id in serialized output. Resolved at read time by `getObjectType()`; lets the FE dispatch entity-specific rendering without inspecting the URL.
id bigint Snowflake-style primary key (unsigned BIGINT). Generated by `IdFactory` at create time; surfaced to the FE / API as a `G`-prefixed string and stripped back to plain bigint server-side before Doctrine lookup.
createdDate integer Unix timestamp the row was first persisted. Set in the entity's PrePersist hook; never rewritten on subsequent updates.
updatedDate integer Unix timestamp the row was last touched. Bumped on every commit that hits the Doctrine UoW for this entity; drives FE invalidation + the listing change cursor.
passiveUpdatedDate int Read-through alias for `updatedDate` exposed under different serializer groups. Lets the FE distinguish "real edit" from "background touch" projections without changing the underlying column.
listingUpdatedDate int Listing-projection timestamp surfaced only under the `listMode` group. Driven by `TripCache` and other listing-shape refreshers separately from `updatedDate` so a listing rebuild doesn't trigger detail-page invalidation.