# Business Info

## Business Info

**File:** `src/config/config.toml` (`[business]`) · **Skill level:** Beginner

Your company name, phone number, email, address, and opening hours are written **once**, in the `[business]` table of `config.toml`. Every page reads them from there: the header, the mobile action bar, the footer, the contact page, the area pages, the booking form, the structured data for search engines, and `llms.txt`. Change a number here and it changes everywhere.

All the shipped values are samples. The phone numbers use the fictional 555-01xx range, and the address is made up. Replace them before you launch.

### The Business Table
```toml
# src/config/config.toml
[business]
  name = ""                       # Empty uses site.title
  legalName = ""                  # Optional, for structured data
  type = "LocalBusiness"          # schema.org type
  phone = "+15550100199"          # sample. E.164 format, used for tel: links. Empty hides every call link
  phoneDisplay = "(555) 010-0199" # sample. How the number is shown
  sms = "+15550100198"            # sample. Optional number for "Text" links. Empty hides them
  smsDisplay = "(555) 010-0198"   # sample
  email = "hello@example.com"     # sample. PLACEHOLDER: replace
  priceRange = "$$"               # Shown in structured data
  timezone = "America/New_York"   # IANA time zone for "Open now" and booking dates
  closedDates = [
    "2026-12-25",
    "2027-01-01",
  ]                               # sample. Holidays: no bookings on these days (YYYY-MM-DD)
```

| Key            | What to write                                                                                     |
| -------------- | ------------------------------------------------------------------------------------------------- |
| `name`         | Your business name. Leave it empty to use `[site] title`                                          |
| `legalName`    | Your registered company name, if it differs. Only used in structured data                         |
| `type`         | The kind of business for search engines. One of `LocalBusiness`, `HomeAndConstructionBusiness`, `GeneralContractor`, `HousePainter`, `Plumber`, `Electrician`, `HVACBusiness`, `RoofingContractor`, `Locksmith`, `MovingCompany`, `ProfessionalService` |
| `phone`        | The number as it is dialed, in **E.164** format: `+`, the country code, then digits only. `+15551234567`, `+447700900123`. This is what call links use |
| `phoneDisplay` | The number as people read it: `(555) 123-4567`, `07700 900123`. Empty shows `phone`               |
| `sms`, `smsDisplay` | A mobile number that takes text messages, in the same two formats. Empty hides every "Text" link |
| `email`        | Your public email address                                                                         |
| `priceRange`   | `$`, `$$`, or `$$$`. Only used in structured data                                                 |
| `timezone`     | Your time zone, for example `"America/Chicago"`, `"Europe/London"`, `"Europe/Paris"`. It decides when the site says "Open now" and which dates the booking form offers |
| `closedDates`  | Days you don't work, as `"YYYY-MM-DD"`. The booking form doesn't offer them                       |

<Aside type="caution" title="Use the E.164 format for phone and sms">
  A number with spaces, dashes, or brackets in `phone` is cleaned up, but a
  number without the `+` and country code is not valid. The build then prints a
  `[business]` warning and ignores the value, and the call buttons disappear.
  The build never fails on these values, so read the warnings.
</Aside>

### Address
```toml
  [business.address]
    show       = true   # false = service-area business: street and postal code are hidden everywhere
    street     = "100 Example Street, Suite 200" # sample
    locality   = "Springfield" # city, sample
    region     = "ST"          # state or province, sample
    postalCode = "00000"       # sample
    country    = "US"          # ISO 3166-1 alpha-2
```

`country` is the two-letter country code (`US`, `CA`, `GB`, `FR`). If you work from home or from a yard customers don't visit, set `show = false`: the street and postal code are then hidden on every page, and only the city and region show. The structured data leaves out the street.

`[business.geo]` takes an optional `latitude` and `longitude` for map results. Leave both empty if you are not sure.

### Opening Hours
```toml
  # Opening hours per day, 24-hour "HH:MM-HH:MM". Several ranges: "08:00-12:00,13:00-17:00". Empty = closed.
  [business.hours]
    mon = "07:30-18:00" # sample
    tue = "07:30-18:00" # sample
    wed = "07:30-18:00" # sample
    thu = "07:30-18:00" # sample
    fri = "07:30-18:00" # sample
    sat = "08:00-14:00" # sample
    sun = ""
```

- Use the 24-hour clock: `"08:00-17:30"`, not `"8am-5:30pm"`.
- A lunch break is two ranges: `"08:00-12:00,13:00-17:00"`.
- `""` means closed that day.
- Hours that run past midnight are not supported.

The site groups days with the same hours for you and writes the times in the format of the page's language. The "Open now" line uses `timezone`, so a visitor in another time zone still sees whether you are open.

### Where Each Value Appears
| Value                       | Where it shows                                                                                      |
| --------------------------- | --------------------------------------------------------------------------------------------------- |
| `phone`, `phoneDisplay`     | The phone pill in the header (`default`, `simple`, `centered` layouts), the green call strip of the `utility` header, the **Call** button in the mobile menu and the mobile action bar, the footer, the contact page, the CTA band, the FAQ help box, the booking form, the 404 page, and the page headers that show a phone line |
| `sms`, `smsDisplay`         | The **Text** option on the contact page and the guarantee claim section, and the **Text** button of the mobile action bar when `showText = true` |
| `email`                     | The footer, the contact page, the guarantee claim section, and the areas section's tabs              |
| `address`                   | The `default` and `columns` footers, the contact details, and job postings                           |
| `hours`, `timezone`         | The opening hours and "Open now" line in the footer, on the contact page, in the CTA band, and next to phone lines |
| `closedDates`, `timezone`   | The dates the booking form offers                                                                    |
| `name`                      | The structured data, `llms.txt`, the RSS feed title, the default author meta tag, and job postings    |
| `type`, `legalName`, `priceRange`, `geo` | The structured data (JSON-LD) only                                                      |
| Everything                  | The business entry in the structured data on every page, and the top of `/llms.txt`                  |

<Aside type="note" title="Area pages can use a local number">
  Each area file in `src/content/areas/` can set its own `phone`,
  `phoneDisplay`, and `hours`. On that area's page, the header, the mobile
  action bar, and the call boxes use the local values instead. Empty values
  fall back to `[business]`. The Elm Park sample area has a sample local number:
  set it to `""` if you have one number. See [Service Areas](/homio/customization/service-areas/).
</Aside>

The business name in the header logo is not `[business] name`: it is `logoText` in `[site]`. The footer copyright uses `{brand}`, which is `site.title`. When you rename the company, change all three. See [Site Identity & Logo](/homio/customization/site-identity-logo/).

### Use The Details In Your Own Text
In the body of a Markdown (`.md`) page, such as the legal pages or a blog post written as `.md`, you can type these tokens and the site fills in the value:

| Token       | Becomes                                          |
| ----------- | ------------------------------------------------ |
| `{name}`    | `[business] name`                                |
| `{phone}`   | `phoneDisplay`                                   |
| `{email}`   | `email`                                          |
| `{address}` | The address, formatted for the page's language   |
| `{hours}`   | The opening hours, grouped by day                |

A few fields in content files also accept `{phone}`: the form error messages, the announcement text, and the rate cards' `largerNote` in the pricing file. The comment next to a field says when it does. `.mdx` files read `{…}` as code, so the tokens don't work there.

### Check It
1. Run `npm run dev` and read the terminal: a `[business]` line names any value that was ignored.
2. Open the homepage at phone width. Tap **Call** in the bottom bar: your phone app should open with your number.
3. Open `/contact/` and check the phone, email, address, and hours.
4. In a browser, view the page source and search for `"telephone"` to see the number search engines get.

### Do It With AI
```text
Set my business details in [business] of src/config/config.toml: name "[NAME]", phone
[NUMBER] (convert it to E.164 for phone and keep my format for phoneDisplay), email [EMAIL],
address [STREET, CITY, REGION, POSTAL CODE, COUNTRY], time zone [ZONE], hours [DAYS AND TIMES],
closed on [DATES]. [We don't take texts: set sms and smsDisplay to "".] Remove the "# sample"
comments on the values you change. Then set phone and phoneDisplay to "" in every file in
src/content/areas/english/ and french/, so the area pages use this number.
```