# Builderly API reference

Base URL: http://hristovtintdetailng.com
Generated from the running server on 2026-11-09T17:13:29.278Z. Every mounted route is listed with the access it needs, the parameters its handler reads and the data models it uses.

## Authentication

Send `Authorization: Bearer <token>` where a route needs a token. Add `?ionic=true` to get JSON from routes that also render pages.

- **Admin token** (`admin`): Bearer token of a site admin (Authorization: Bearer <token>).
- **User token** (`user`): Bearer token of a signed-in user of the site.
- **Optional user** (`optional-user`): Works without a token; a user token personalises the answer.
- **User with access** (`user-priv`): A signed-in user whose plan grants access to the item.
- **Page access** (`page-priv`): Pages limited to some users check the token when one is sent.
- **Webhook signature** (`webhook`): Called by a provider; verified by its signature.
- **reCAPTCHA** (`recaptcha`): Needs a reCAPTCHA token from the site form.
- **System** (`system`): Internal - called by the platform itself.

### For AI assistants: getting a token

Public endpoints (Access: Public) need no token. Everything else - changing the site, or reading its orders, bookings, customers and other private data - needs the site owner's API token.

You cannot create a token yourself, and you must not ask for the owner's password. Ask the user for a token instead - you can send them this message as it is:

> To work with your site through its API, I need an API token from you:
> 1. Sign in to your Builderly admin: https://admin.max-media.io
> 2. Open Developers > API reference (or go straight to https://admin.max-media.io/tabs/site-builder/api-docs).
> 3. Press "Generate token", copy the token and paste it here.
> The token acts as you, so only share it in this chat. You can cancel it at any time by signing out of all devices.

Then send it with every request as `Authorization: Bearer <token>`, and add `?ionic=true` to get JSON. Calls go to the site's own address (its domain), not to the reference's.

The token acts as the user: say what you will change and wait for their yes before any request that creates, changes or deletes something, never repeat the token back, and never put it in a link or a file you share.

## Status codes

| Code | Name | Meaning |
| --- | --- | --- |
| 200 | OK | It worked. The answer is the object or list asked for. |
| 201 | Created | The object was created. Some endpoints send it back; others send an empty body. |
| 202 | Accepted | The work was started and finishes in the background - for example a video being processed ({ "status": "processing" }). Check back on the object. |
| 204 | No Content | It worked, and there is nothing to send back - for example after removing a staff member. |
| 301 | Moved Permanently | The address changed; follow the Location header. |
| 400 | Bad Request | The request was refused as sent: a required field is missing, a value has the wrong type or fails validation. The body says what - often as plain text. |
| 401 | Unauthorized | No token, or one that is invalid or signed out. Without ?ionic=true, some endpoints answer this with the HTML login page instead of JSON. |
| 402 | Payment Required | The content needs a subscription: the user has no price plan that unlocks it. |
| 403 | Forbidden | The token is valid but may not do this - the record belongs to someone else, or the user is not an admin. AI builder endpoints also answer 403 when the account is out of credits. |
| 404 | Not Found | No object with that ID or URL slug, or no such endpoint. |
| 409 | Conflict | It clashes with the current state: the item is already being processed, a version is already applied, or an AI plan or preview is no longer available. |
| 410 | Gone | It existed but is no longer there - for example a comment already deleted on the social network. |
| 412 | Precondition Failed | A rule the request must meet is not met - for example push notifications of the same type at least 48 hours apart. |
| 418 | I'm a teapot | An account confirmation or password reset link was used with an email that does not match it. |
| 421 | Misdirected Request | The domain is not a Builderly site. Call the site's own address. |
| 422 | Unprocessable Content | The request was understood but could not be done - for example the AI could not read the website it was asked to clone. The message says what to try instead. |
| 429 | Too Many Requests | Slow down: the site's request limit was reached, an AI chat already has a request running, or the hourly limit of AI search answers is used up. Wait and retry. |
| 500 | Internal Server Error | Something failed on the server. Retrying later may work; if it keeps failing, the request may be one the endpoint does not handle. |
| 502 | Bad Gateway | A service the request depends on failed - for example the address a redirect forwards to. |
| 503 | Service Unavailable | Used by the lead form when an order is below its minimum value, not only for outages: read the message. |

Errors do not share one shape: depending on the endpoint the body is plain text, { "error": "..." }, { "message": "..." } or empty. Rely on the status code, and show the body to the user as the reason.

## Endpoints

### Blog posts

Blog posts are the site's articles: a title, a short excerpt for listings and previews, the body in HTML, images, and a category (a blogpost/ collection) for filtering. A post can be limited to signed-in users or to subscribers of a price plan.

##### Like or unlike a blog post
`PATCH /blogpost-likes/:id`
Likes or unlikes a post and notifies its author. Calling it again takes the like back. Answers { like }.
- Access: User token
- Path:
  - `id` (string): The ID of the blog post.
- Returns: the BlogPost object.
- Status codes: 200, 400, 401, 404, 500
- Models: BlogPost, UserEngagementNotification

##### Find a blog post by its address
`GET /blogpost-redirect/:url`
Opens a post in the app (redirects to its app page). For links shared from the app: the website sends the visitor to the post in the app.
- Access: Optional user
- Path:
  - `url` (string): The blog post's URL slug, as in its address on the site.
- Status codes: 200, 500
- Models: MyContact, SocialModeSettings

##### Save or unsave a blog post
`PATCH /blogpost-saves/:id`
Saves or unsaves a post for the signed-in user. Calling it again unsaves.
- Access: User token
- Path:
  - `id` (string): The ID of the blog post.
- Returns: the BlogPost object.
- Status codes: 200, 400, 401, 404, 500
- Models: BlogPost

##### List all blog posts
`GET /blogposts`
The blog page, or the posts as JSON with ?ionic: filtered by category and published state, and sorted. Paged with ?skip, filtered by ?collection and ?published, newest first by default. Cached for an hour.
- Access: User with access, Optional user
- Query:
  - `published` (string): true: only blog posts that are published; false: only those that are not.
  - `sortBy` (string): The order of the results.
  - `collection` (string): Only results in this collection.
  - `skip` (string): How many results to skip - for paging.
- Returns: a list of BlogPost objects.
- Status codes: 200, 401, 402, 404, 500
- Models: Theme, SocialModeSettings, Collection, BlogPost, AboutPage

##### Create a blog post
`POST /blogposts`
Creates a blog post. url is made from title, so do not send one. Answers 201 with the post and re-renders the home page. To create it for an account you manage, send on_behalf_of (403 without rights).
- Access: User token
- Body:
  - `title` (string): Title of blogpost.
  - `on_behalf_of` (string): The blog post's on behalf of.
- Returns: the BlogPost object.
- Status codes: 201, 400, 401, 403, 500
- Models: ConnectedAccount, SocialModeSettings, BlogPost, ProfessionalAccount, MyContact

##### Delete multiple blog posts
`DELETE /blogposts-multiple/:delete_ids`
Deletes several posts, ids comma-separated. Answers the ids that were deleted.
- Access: User token
- Path:
  - `delete_ids` (string): The blog post's delete ids.
- Returns: an empty answer on success.
- Status codes: 200, 401, 500
- Models: BlogPost

##### Update multiple blog posts
`PATCH /blogposts-multiple/:patch_ids`
Applies the same changes (updates) to several posts, ids comma-separated. Answers the ids that were changed.
- Access: User token
- Path:
  - `patch_ids` (string): The blog post's patch ids.
- Body:
  - `collection_id` (objectid): Collection, to which the blog post belongs.
  - `grouping` (string): The blog post's grouping.
  - `updates` (string): The blog post's updates.
- Returns: the BlogPost object.
- Status codes: 200, 400, 401, 500
- Models: BlogPost

##### Update a blog post
`PATCH /blogposts/:id`
Updates a blog post. Fields outside the allowed list are silently ignored. Answers the post. 403 unless the author, an admin or a manager with rights.
- Access: User token
- Path:
  - `id` (string): The ID of the blog post.
- Returns: the BlogPost object.
- Status codes: 200, 400, 401, 403, 404, 500
- Models: BlogPost, ConnectedAccount

##### Delete a blog post
`DELETE /blogposts/:id`
Deletes a blog post. Answers the deleted post. 403 unless the author or an admin.
- Access: User token
- Path:
  - `id` (string): The ID of the blog post.
- Returns: an empty answer on success.
- Status codes: 200, 401, 403, 404, 500
- Models: BlogPost, ConnectedAccount

##### Retrieve a blog post
`GET /blogposts/:id/media`
A post's first picture. Answers the image bytes. Cached for an hour.
- Access: Public
- Path:
  - `id` (string): The ID of the blog post.
- Returns: the BlogPost object.
- Status codes: 200, 404, 500
- Models: BlogPost, Media

##### Create a blog post
`POST /blogposts/:id/media`
Uploads a picture to a post (media, form field). Multipart upload; the picture is resized and added to the post's medias. 404 when there is no such post.
- Access: User token
- Path:
  - `id` (string): The ID of the blog post.
- Status codes: 200, 400, 401

##### Delete a blog post
`DELETE /blogposts/:id/media/delete_last`
Removes a post's last picture. Deletes the media record too.
- Access: User token
- Path:
  - `id` (string): The ID of the blog post.
- Returns: an empty answer on success.
- Status codes: 200, 401
- Models: BlogPost, Media

##### Retrieve a blog post
`GET /blogposts/:url`
A blog post's page by its url, or the post as JSON with ?ionic. By url, not id. 404 when there is no such post. Comes with its likes and three related posts.
- Access: Page access, Optional user
- Path:
  - `url` (string): The blog post's URL slug, as in its address on the site.
- Returns: the BlogPost object.
- Status codes: 200, 401, 402, 404, 500
- Models: BlogPost, Collection, SocialModeSettings, User, AboutPage, Comment

## Objects

### AboutPage

A page built in the editor or by the AI builder. Its content is in containers: each container is a full-width section with columns, and each column has components, laid out on a 12-column grid by their size.

- `requiresLogin`: Boolean, default false - Only signed-in users can see the page.
- `requiresSubscription`: Boolean, default false - Only subscribers of one of price_plan_ids can see the page.
- `price_plan_ids`: String[] - The price plans whose subscribers can see the page, with requiresSubscription.
- `title`: String, required - The page's title, shown in the browser tab and in the admin.
- `url`: String, required - The page's address on the site: /<url>. Unique.
- `redirectUrl`: String - When set, visitors who open the page are sent to this address instead.
- `legal_kind`: String - For legal pages: which document it is, in English (Privacy Policy, Terms of Service...).
- `isPartial`: Boolean, default false - A part of other pages (a banner, a block inside a product page), not a page of its own.
- `showTo`: String, default "0" - Who sees the page: "0" everyone, "1" signed-in users only, "2" visitors who are not signed in.
- `showHeader`: Boolean, default true - Show the site's header on the page.
- `showFooter`: Boolean, default true - Show the site's footer on the page.
- `ai_context_v2`: Mixed - Legacy, no longer written: the AI context is built on demand. Old copies are not selected and are removed by npm run migrate:strip-about-page-ai-context.
- `ai_surfaces_v2`: Mixed - The editable regions the AI page modifier found on the page last time it read it; written by the AI builder.
- `ai_overview`: String - A short summary of the page the AI builder keeps for its own use.
- `ai_generation_metadata`: Mixed - How the AI builder generated the page (mode, prompt, timings); written by the AI builder.
- `containers`: Object[] - The page's content: sections, each with columns of components.
  - `isFluid`: Boolean, default false
  - `parallaxEnabled`: Boolean
  - `parallaxAmount`: Number
  - `parallaxZoom`: Number
  - `continuousEnabled`: Boolean, default false
  - `continuousEffect`: String, default "none"
  - `continuousDuration`: Number, default 2400
  - `continuousIntensity`: Number, default 4
  - `backgroundImage`: String
  - `backgroundSize`: String
  - `backgroundPosition`: String
  - `backgroundRepeat`: String
  - `backgroundVideo`: String
  - `backgroundColor`: String
  - `backgroundGradient.enabled`: Boolean, default false
  - `backgroundGradient.type`: String
  - `backgroundGradient.degrees`: Number
  - `backgroundGradient.radialShape`: String
  - `backgroundGradient.radialPosition`: String
  - `backgroundGradient.colors`: Object[]
    - `color`: String
    - `percentage`: Number
    - `_id`: ObjectId
  - `backgroundGradient.css`: String
  - `backgroundParallax`: Boolean, default false
  - `minHeight`: Number
  - `minHeightMobile`: Number
  - `padding_top.value`: String, default ""
  - `padding_top.unit`: String, default "px"
  - `padding_top.mobile_value`: String, default ""
  - `padding_top.mobile_unit`: String, default "px"
  - `padding_right.value`: String, default ""
  - `padding_right.unit`: String, default "px"
  - `padding_right.mobile_value`: String, default ""
  - `padding_right.mobile_unit`: String, default "px"
  - `padding_bottom.value`: String, default ""
  - `padding_bottom.unit`: String, default "px"
  - `padding_bottom.mobile_value`: String, default ""
  - `padding_bottom.mobile_unit`: String, default "px"
  - `padding_left.value`: String, default ""
  - `padding_left.unit`: String, default "px"
  - `padding_left.mobile_value`: String, default ""
  - `padding_left.mobile_unit`: String, default "px"
  - `allowOffset`: Boolean, default false
  - `offsetX`: Number, default 0
  - `offsetY`: Number, default 0
  - `offsetMobileX`: Number, default 0
  - `offsetMobileY`: Number, default 0
  - `zIndex`: Number, default 0
  - `wrap_reverse`: Boolean, default false
  - `borderRadius`: Number, default 0
  - `marginX`: Number, default 0
  - `editorName`: String
  - `horizontalScroll`: Boolean, default false
  - `horizontalScrollWidth`: Number, default 100
  - `overflowX`: String, default "hidden"
  - `columns`: Object[]
    - `size`: String
    - `hoverGroup`: Boolean
    - `parallaxEnabled`: Boolean
    - `parallaxAmount`: Number
    - `parallaxZoom`: Number
    - `continuousEnabled`: Boolean, default false
    - `continuousEffect`: String, default "none"
    - `continuousDuration`: Number, default 2400
    - `continuousIntensity`: Number, default 4
    - `sticky`: Boolean, default false
    - `justify`: String
    - `align`: String
    - `onHoverActions`: Boolean, default false
    - `onHoverTransition`: Number, default 0.3
    - `backgroundColor`: String
    - `backgroundGradient.enabled`: Boolean, default false
    - `backgroundGradient.type`: String
    - `backgroundGradient.degrees`: Number
    - `backgroundGradient.radialShape`: String
    - `backgroundGradient.radialPosition`: String
    - `backgroundGradient.colors`: Object[]
      - `color`: String
      - `percentage`: Number
      - `_id`: ObjectId
    - `backgroundGradient.css`: String
    - `backgroundColorOnHover`: String
    - `innerBackgroundColor`: String
    - `innerBackgroundGradient.enabled`: Boolean, default false
    - `innerBackgroundGradient.type`: String
    - `innerBackgroundGradient.degrees`: Number
    - `innerBackgroundGradient.radialShape`: String
    - `innerBackgroundGradient.radialPosition`: String
    - `innerBackgroundGradient.colors`: Object[]
      - `color`: String
      - `percentage`: Number
      - `_id`: ObjectId
    - `innerBackgroundGradient.css`: String
    - `innerBackgroundColorOnHover`: String
    - `backgroundImage`: String
    - `backgroundSize`: String
    - `backgroundPosition`: String
    - `backgroundRepeat`: String
    - `backgroundVideo`: String
    - `paddingX`: Number, default 0
    - `paddingXOnHover`: Number, default 0
    - `paddingY`: Number, default 0
    - `paddingYOnHover`: Number, default 0
    - `innerPaddingX`: Number, default 0
    - `innerPaddingXOnHover`: Number, default 0
    - `innerPaddingY`: Number, default 0
    - `allowOffset`: Boolean, default false
    - `offsetX`: Number, default 0
    - `offsetY`: Number, default 0
    - `offsetMobileX`: Number, default 0
    - `offsetMobileY`: Number, default 0
    - `zIndex`: Number, default 0
    - `innerPaddingYOnHover`: Number, default 0
    - `paddingOptions`: String
    - `paddingOptionsOnHover`: String
    - `innerPaddingOptions`: String
    - `borderOptions`: String
    - `borderOptionsOnHover`: String
    - `card`: Boolean, default false
    - `borderRadius`: Number, default 0
    - `borderRadiusOnHover`: Number, default 0
    - `borderType`: String, default "none"
    - `borderTypeOnHover`: String, default "none"
    - `borderWidth`: Number, default 0
    - `borderWidthOnHover`: Number, default 0
    - `borderColor`: String, default ""
    - `borderColorOnHover`: String, default ""
    - `components`: Object[]
      - `type`: String
      - `size`: String, default "12"
      - `sticky`: Boolean, default false
      - `paddingX`: Number, default 0
      - `paddingY`: Number, default 0
      - `allowOffset`: Boolean, default false
      - `offsetX`: Number, default 0
      - `offsetY`: Number, default 0
      - `offsetMobileX`: Number, default 0
      - `offsetMobileY`: Number, default 0
      - `zIndex`: Number, default 0
      - `position`: String, one of static | relative | absolute | fixed | sticky, default "static"
      - `top.value`: String, default "0"
      - `top.unit`: String, default "px"
      - `top.mobile_value`: String, default ""
      - `top.mobile_unit`: String, default "px"
      - `left.value`: String, default "0"
      - `left.unit`: String, default "px"
      - `left.mobile_value`: String, default ""
      - `left.mobile_unit`: String, default "px"
      - `right.value`: String, default "0"
      - `right.unit`: String, default "px"
      - `right.mobile_value`: String, default ""
      - `right.mobile_unit`: String, default "px"
      - `bottom.value`: String, default "0"
      - `bottom.unit`: String, default "px"
      - `bottom.mobile_value`: String, default ""
      - `bottom.mobile_unit`: String, default "px"
      - `custom_measurements`: Boolean, default false
      - `edit_type`: String, default "simple"
      - `custom_width.value`: Mixed
      - `custom_width.unit`: String, default "px"
      - `custom_width.mobile_value`: Mixed
      - `custom_width.mobile_unit`: String, default "px"
      - `custom_min_width.value`: Mixed
      - `custom_min_width.unit`: String, default "px"
      - `custom_min_width.mobile_value`: Mixed
      - `custom_min_width.mobile_unit`: String, default "px"
      - `custom_max_width.value`: Mixed
      - `custom_max_width.unit`: String, default "px"
      - `custom_max_width.mobile_value`: Mixed
      - `custom_max_width.mobile_unit`: String, default "px"
      - `custom_height.value`: Mixed
      - `custom_height.unit`: String, default "px"
      - `custom_height.mobile_value`: Mixed
      - `custom_height.mobile_unit`: String, default "px"
      - `custom_min_height.value`: Mixed
      - `custom_min_height.unit`: String, default "px"
      - `custom_min_height.mobile_value`: Mixed
      - `custom_min_height.mobile_unit`: String, default "px"
      - `custom_max_height.value`: Mixed
      - `custom_max_height.unit`: String, default "px"
      - `custom_max_height.mobile_value`: Mixed
      - `custom_max_height.mobile_unit`: String, default "px"
      - `object_fit`: String, default "none"
      - `aspect_ratio.custom`: Boolean, default false
      - `aspect_ratio.ratio`: String, default ""
      - `min_height`: Number, default 0
      - `margin_left.value`: Mixed
      - `margin_left.unit`: String, default "px"
      - `margin_left.mobile_value`: Mixed
      - `margin_left.mobile_unit`: String, default "px"
      - `margin_right.value`: Mixed
      - `margin_right.unit`: String, default "px"
      - `margin_right.mobile_value`: Mixed
      - `margin_right.mobile_unit`: String, default "px"
      - `margin_top.value`: Mixed
      - `margin_top.unit`: String, default "px"
      - `margin_top.mobile_value`: Mixed
      - `margin_top.mobile_unit`: String, default "px"
      - `margin_bottom.value`: Mixed
      - `margin_bottom.unit`: String, default "px"
      - `margin_bottom.mobile_value`: Mixed
      - `margin_bottom.mobile_unit`: String, default "px"
      - `padding_left.value`: Mixed
      - `padding_left.unit`: String, default "px"
      - `padding_left.mobile_value`: Mixed
      - `padding_left.mobile_unit`: String, default "px"
      - `padding_right.value`: Mixed
      - `padding_right.unit`: String, default "px"
      - `padding_right.mobile_value`: Mixed
      - `padding_right.mobile_unit`: String, default "px"
      - `padding_top.value`: Mixed
      - `padding_top.unit`: String, default "px"
      - `padding_top.mobile_value`: Mixed
      - `padding_top.mobile_unit`: String, default "px"
      - `padding_bottom.value`: Mixed
      - `padding_bottom.unit`: String, default "px"
      - `padding_bottom.mobile_value`: Mixed
      - `padding_bottom.mobile_unit`: String, default "px"
      - `border_left.color`: String
      - `border_left.width.value`: Mixed
      - `border_left.width.unit`: String, default "px"
      - `border_left.style`: String
      - `border_right.color`: String
      - `border_right.width.value`: Mixed
      - `border_right.width.unit`: String, default "px"
      - `border_right.style`: String
      - `border_top.color`: String
      - `border_top.width.value`: Mixed
      - `border_top.width.unit`: String, default "px"
      - `border_top.style`: String
      - `border_bottom.color`: String
      - `border_bottom.width.value`: Mixed
      - `border_bottom.width.unit`: String, default "px"
      - `border_bottom.style`: String
      - `border_top_left_radius.value`: Mixed
      - `border_top_left_radius.unit`: String, default "px"
      - `border_top_right_radius.value`: Mixed
      - `border_top_right_radius.unit`: String, default "px"
      - `border_bottom_left_radius.value`: Mixed
      - `border_bottom_left_radius.unit`: String, default "px"
      - `border_bottom_right_radius.value`: Mixed
      - `border_bottom_right_radius.unit`: String, default "px"
      - `custom_border_radius.value`: Number
      - `custom_border_radius.unit`: String, default "px"
      - `specific_border_radius`: Boolean, default false
      - `box_shadows`: Object[]
      - `mix_blend_mode`: String, one of normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity, default "normal"
      - `paddingOptions`: String
      - `backgroundColor`: String
      - `backgroundGradient.enabled`: Boolean, default false
      - `backgroundGradient.type`: String
      - `backgroundGradient.degrees`: Number
      - `backgroundGradient.radialShape`: String
      - `backgroundGradient.radialPosition`: String
      - `backgroundGradient.colors`: Object[]
      - `backgroundGradient.css`: String
      - `card`: Boolean, default false
      - `borderRadius`: Number, default 0
      - `borderType`: String, default "none"
      - `borderWidth`: Number, default 0
      - `borderColor`: String, default ""
      - `borderOptions`: String
      - `showOnMobile`: Boolean, default true
      - `showOnDesktop`: Boolean, default true
      - `icon`: String
      - `iconSettings.size`: Number, default 40
      - `iconSettings.color`: String, default "var(--ion-color-primary)"
      - `heading`: String
      - `subHeading`: String
      - `heading_alignment`: String
      - `innerHTML`: String
      - `innerCSS`: String
      - `innerJS`: String
      - `lineHeight`: String, default "normal"
      - `medias`: Object[]
      - `products`: ObjectId[], → Product
      - `product_gallery.design_layout`: String, default ""
      - `product_gallery.mode`: String, default "card"
      - `product_gallery.columns`: Number, default 3
      - `product_gallery.placeholderItems`: Object[]
      - `product_gallery.placeholderPlateColor`: String, default ""
      - `product_gallery.showName`: Boolean, default true
      - `product_gallery.showPrice`: Boolean, default true
      - `product_gallery.showDescription`: Boolean, default false
      - `product_gallery.showBrand`: Boolean, default false
      - `product_gallery.showRibbon`: Boolean, default false
      - `product_gallery.showRating`: Boolean, default false
      - `product_gallery.showCart`: Boolean, default false
      - `product_gallery.showLink`: Boolean, default false
      - `product_gallery.linkLabel`: String, default "View product"
      - `product_gallery.imageAspectRatio`: String, default "1/1"
      - `product_gallery.imageHeight`: Number, default 260
      - `product_gallery.imageRadius`: Number, default 20
      - `product_gallery.imageObjectFit`: String, default "cover"
      - `product_gallery.cardBackgroundColor`: String, default "var(--ion-card-background, #ffffff)"
      - `product_gallery.cardBorderRadius`: Number, default 28
      - `product_gallery.cardBorderWidth`: Number, default 0
      - `product_gallery.cardBorderColor`: String, default "transparent"
      - `product_gallery.cardPaddingX`: Number, default 20
      - `product_gallery.cardPaddingY`: Number, default 20
      - `product_gallery.gap`: Number, default 24
      - `product_gallery.boxShadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.22)"
      - `product_gallery.boxShadowOffsetY`: Number, default 20
      - `product_gallery.boxShadowBlurRadius`: Number, default 40
      - `product_gallery.boxShadowSpreadRadius`: Number, default -22
      - `product_gallery.fieldBackground`: String, default "transparent"
      - `product_gallery.hairlineColor`: String, default "transparent"
      - `product_gallery.hairlineWidth`: Number, default 0
      - `product_gallery.maxWidth`: Number, default 0
      - `product_gallery.scrimGradient`: String, default ""
      - `product_gallery.align`: String, default "left"
      - `product_gallery.accentColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `product_gallery.nameColor`: String, default "var(--ion-text-color, #1e293b)"
      - `product_gallery.nameFontSize`: String, default "1em"
      - `product_gallery.nameFontWeight`: String, default "700"
      - `product_gallery.nameFontFamily`: String, default ""
      - `product_gallery.nameTransform`: String, default "none"
      - `product_gallery.priceColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `product_gallery.priceFontSize`: String, default "0.94em"
      - `product_gallery.priceFontWeight`: String, default "600"
      - `product_gallery.priceFontFamily`: String, default ""
      - `product_gallery.priceFontStyle`: String, default "normal"
      - `product_gallery.metaColor`: String, default "rgba(var(--ion-text-color-rgb, 30,41,59), 0.66)"
      - `product_gallery.titlePosition`: String, default "bottom"
      - `product_gallery.imageSide`: String, default "left"
      - `product_gallery.imagePadding`: Number, default 0
      - `product_gallery.boxShadowOffsetX`: Number, default 0
      - `product_gallery.descFontSize`: String, default "13px"
      - `product_gallery.descFontWeight`: String, default "400"
      - `product_gallery.animation`: String, default "none"
      - `product_gallery.animationDuration`: Number, default 0
      - `product_gallery.animationDelay`: Number, default 0
      - `product_gallery.showCustomFields`: Boolean, default false
      - `product_gallery.cardDesign`: String, default ""
      - `product_gallery.carouselLoop`: Boolean, default false
      - `product_gallery.carouselControls`: Boolean, default false
      - `product_gallery.customCss`: String, default ""
      - `services`: ObjectId[], → Service
      - `service_gallery.design_layout`: String, default ""
      - `service_gallery.mode`: String, default "card"
      - `service_gallery.columns`: Number, default 3
      - `service_gallery.placeholderItems`: Object[]
      - `service_gallery.placeholderPlateColor`: String, default ""
      - `service_gallery.showTitle`: Boolean, default true
      - `service_gallery.showPrice`: Boolean, default true
      - `service_gallery.showDescription`: Boolean, default false
      - `service_gallery.showDuration`: Boolean, default false
      - `service_gallery.durationLabel`: String, default "min"
      - `service_gallery.showImage`: Boolean, default true
      - `service_gallery.showLink`: Boolean, default false
      - `service_gallery.linkLabel`: String, default "View service"
      - `service_gallery.imageAspectRatio`: String, default "1/1"
      - `service_gallery.imageHeight`: Number, default 260
      - `service_gallery.imageRadius`: Number, default 20
      - `service_gallery.imageObjectFit`: String, default "cover"
      - `service_gallery.cardBackgroundColor`: String, default "var(--ion-card-background, #ffffff)"
      - `service_gallery.cardBorderRadius`: Number, default 28
      - `service_gallery.cardBorderWidth`: Number, default 0
      - `service_gallery.cardBorderColor`: String, default "transparent"
      - `service_gallery.cardPaddingX`: Number, default 20
      - `service_gallery.cardPaddingY`: Number, default 20
      - `service_gallery.gap`: Number, default 24
      - `service_gallery.boxShadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.22)"
      - `service_gallery.boxShadowOffsetY`: Number, default 20
      - `service_gallery.boxShadowBlurRadius`: Number, default 40
      - `service_gallery.boxShadowSpreadRadius`: Number, default -22
      - `service_gallery.fieldBackground`: String, default "transparent"
      - `service_gallery.hairlineColor`: String, default "transparent"
      - `service_gallery.hairlineWidth`: Number, default 0
      - `service_gallery.rowRuleColor`: String, default "transparent"
      - `service_gallery.rowRuleWidth`: Number, default 0
      - `service_gallery.maxWidth`: Number, default 0
      - `service_gallery.scrimGradient`: String, default ""
      - `service_gallery.align`: String, default "left"
      - `service_gallery.accentColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `service_gallery.titleColor`: String, default "var(--ion-text-color, #1e293b)"
      - `service_gallery.titleFontSize`: String, default "1em"
      - `service_gallery.titleFontWeight`: String, default "700"
      - `service_gallery.titleFontFamily`: String, default ""
      - `service_gallery.titleTransform`: String, default "none"
      - `service_gallery.priceColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `service_gallery.priceFontSize`: String, default "0.94em"
      - `service_gallery.priceFontWeight`: String, default "600"
      - `service_gallery.priceFontFamily`: String, default ""
      - `service_gallery.priceFontStyle`: String, default "normal"
      - `service_gallery.metaColor`: String, default "rgba(var(--ion-text-color-rgb, 30,41,59), 0.66)"
      - `service_gallery.titlePosition`: String, default "bottom"
      - `service_gallery.imageSide`: String, default "left"
      - `service_gallery.imagePadding`: Number, default 0
      - `service_gallery.boxShadowOffsetX`: Number, default 0
      - `service_gallery.descFontSize`: String, default "13px"
      - `service_gallery.descFontWeight`: String, default "400"
      - `service_gallery.animation`: String, default "none"
      - `service_gallery.animationDuration`: Number, default 0
      - `service_gallery.animationDelay`: Number, default 0
      - `service_gallery.showCustomFields`: Boolean, default false
      - `service_gallery.cardDesign`: String, default ""
      - `service_gallery.carouselLoop`: Boolean, default false
      - `service_gallery.carouselControls`: Boolean, default false
      - `service_gallery.customCss`: String, default ""
      - `blog_gallery.design_layout`: String, default ""
      - `blog_gallery.mode`: String, default "card"
      - `blog_gallery.columns`: Number, default 3
      - `blog_gallery.leadLayout`: String, default "beside"
      - `blog_gallery.leadWidth`: Number, default 58
      - `blog_gallery.placeholderItems`: Object[]
      - `blog_gallery.placeholderPlateColor`: String, default ""
      - `blog_gallery.showTitle`: Boolean, default true
      - `blog_gallery.showExcerpt`: Boolean, default false
      - `blog_gallery.showDate`: Boolean, default true
      - `blog_gallery.showImage`: Boolean, default true
      - `blog_gallery.showLink`: Boolean, default false
      - `blog_gallery.linkLabel`: String, default "Read more"
      - `blog_gallery.showCustomFields`: Boolean, default false
      - `blog_gallery.imageAspectRatio`: String, default "1/1"
      - `blog_gallery.imageHeight`: Number, default 260
      - `blog_gallery.imageRadius`: Number, default 20
      - `blog_gallery.imageObjectFit`: String, default "cover"
      - `blog_gallery.imagePadding`: Number, default 0
      - `blog_gallery.imageSide`: String, default "left"
      - `blog_gallery.cardBackgroundColor`: String, default "var(--ion-card-background, #ffffff)"
      - `blog_gallery.cardBorderRadius`: Number, default 28
      - `blog_gallery.cardBorderWidth`: Number, default 0
      - `blog_gallery.cardBorderColor`: String, default "transparent"
      - `blog_gallery.cardPaddingX`: Number, default 20
      - `blog_gallery.cardPaddingY`: Number, default 20
      - `blog_gallery.gap`: Number, default 24
      - `blog_gallery.boxShadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.22)"
      - `blog_gallery.boxShadowOffsetX`: Number, default 0
      - `blog_gallery.boxShadowOffsetY`: Number, default 20
      - `blog_gallery.boxShadowBlurRadius`: Number, default 40
      - `blog_gallery.boxShadowSpreadRadius`: Number, default -22
      - `blog_gallery.fieldBackground`: String, default "transparent"
      - `blog_gallery.hairlineColor`: String, default "transparent"
      - `blog_gallery.hairlineWidth`: Number, default 0
      - `blog_gallery.rowRuleColor`: String, default "transparent"
      - `blog_gallery.rowRuleWidth`: Number, default 0
      - `blog_gallery.maxWidth`: Number, default 0
      - `blog_gallery.scrimGradient`: String, default ""
      - `blog_gallery.align`: String, default "left"
      - `blog_gallery.accentColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `blog_gallery.titleColor`: String, default "var(--ion-text-color, #1e293b)"
      - `blog_gallery.titleFontSize`: String, default "1em"
      - `blog_gallery.titleFontWeight`: String, default "700"
      - `blog_gallery.titleFontFamily`: String, default ""
      - `blog_gallery.titleTransform`: String, default "none"
      - `blog_gallery.dateColor`: String, default "var(--ion-color-primary, #3880ff)"
      - `blog_gallery.dateFontSize`: String, default "0.81em"
      - `blog_gallery.dateFontWeight`: String, default "600"
      - `blog_gallery.dateFontFamily`: String, default ""
      - `blog_gallery.dateFontStyle`: String, default "normal"
      - `blog_gallery.metaColor`: String, default "rgba(var(--ion-text-color-rgb, 30,41,59), 0.66)"
      - `blog_gallery.excerptFontSize`: String, default "0.88em"
      - `blog_gallery.excerptFontWeight`: String, default "400"
      - `blog_gallery.excerptFontFamily`: String, default ""
      - `blog_gallery.titlePosition`: String, default "bottom"
      - `blog_gallery.animation`: String, default "none"
      - `blog_gallery.animationDuration`: Number, default 0
      - `blog_gallery.animationDelay`: Number, default 0
      - `blog_gallery.cardDesign`: String, default ""
      - `blog_gallery.customCss`: String, default ""
      - `multi_booking.layout`: String, default "chips"
      - `multi_booking.columns`: Number, default 3
      - `multi_booking.pickerBackground`: String, default "transparent"
      - `multi_booking.gap`: Number, default 10
      - `multi_booking.align`: String, default "left"
      - `multi_booking.showPrice`: Boolean, default false
      - `multi_booking.showDuration`: Boolean, default false
      - `multi_booking.showDescription`: Boolean, default false
      - `multi_booking.showImage`: Boolean, default false
      - `multi_booking.itemPaddingX`: Number, default 18
      - `multi_booking.itemPaddingY`: Number, default 10
      - `multi_booking.itemRadius`: Number, default 100
      - `multi_booking.itemBorderWidth`: Number, default 0
      - `multi_booking.itemBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.itemBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.10)"
      - `multi_booking.itemTextColor`: String, default "var(--ion-text-color, inherit)"
      - `multi_booking.itemSubTextColor`: String, default "var(--ion-color-medium, rgba(0,0,0,0.55))"
      - `multi_booking.selectedBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.selectedTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.selectedSubTextColor`: String, default "rgba(var(--ion-color-primary-contrast-rgb, 255,255,255), 0.75)"
      - `multi_booking.selectedBorderColor`: String, default "var(--ion-color-primary)"
      - `multi_booking.hoverBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.18)"
      - `multi_booking.titleFontSize`: Number, default 14
      - `multi_booking.titleFontWeight`: String, default "500"
      - `multi_booking.subFontSize`: Number, default 13
      - `multi_booking.dividerColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.dividerWidth`: Number, default 1
      - `multi_booking.autoScroll`: Boolean, default true
      - `multi_booking.cardBackground`: String, default "var(--ion-card-color, #ffffff)"
      - `multi_booking.cardRadius`: Number, default 28
      - `multi_booking.cardBorderWidth`: Number, default 0
      - `multi_booking.cardBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.cardMaxWidth`: Number, default 820
      - `multi_booking.cardLayout`: String, default "stack"
      - `multi_booking.splitWidth`: Number, default 340
      - `multi_booking.shadowColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.18)"
      - `multi_booking.shadowOffsetY`: Number, default 20
      - `multi_booking.shadowBlur`: Number, default 40
      - `multi_booking.shadowSpread`: Number, default -22
      - `multi_booking.sectionPaddingX`: Number, default 40
      - `multi_booking.sectionPaddingY`: Number, default 32
      - `multi_booking.sectionDividerColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.12)"
      - `multi_booking.sectionDividerWidth`: Number, default 1
      - `multi_booking.showStepLabels`: Boolean, default true
      - `multi_booking.serviceStepLabel`: String, default "Step 1 — Service"
      - `multi_booking.dayStepLabel`: String, default "Step 2 — Day"
      - `multi_booking.staffStepLabel`: String, default "Step 3 — Staff member"
      - `multi_booking.timeStepLabel`: String, default "Step 4 — Time"
      - `multi_booking.stepLabelColor`: String, default "var(--ion-color-medium, rgba(0,0,0,0.55))"
      - `multi_booking.stepLabelSize`: Number, default 13
      - `multi_booking.stepLabelWeight`: String, default "700"
      - `multi_booking.stepLabelSpacing`: Number, default 0.04
      - `multi_booking.stepLabelUppercase`: Boolean, default true
      - `multi_booking.dayCount`: Number, default 6
      - `multi_booking.dayLayout`: String, default "strip"
      - `multi_booking.dayBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.15)"
      - `multi_booking.dayShape`: String, default "circle"
      - `multi_booking.daySize`: Number, default 64
      - `multi_booking.dayGap`: Number, default 10
      - `multi_booking.dayShowWeekday`: Boolean, default false
      - `multi_booking.dayBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.10)"
      - `multi_booking.dayTextColor`: String, default "var(--ion-text-color, inherit)"
      - `multi_booking.daySelectedBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.daySelectedTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.dayDisabledOpacity`: Number, default 0.35
      - `multi_booking.timeGap`: Number, default 10
      - `multi_booking.timeRadius`: Number, default 100
      - `multi_booking.timeBorderWidth`: Number, default 0
      - `multi_booking.timeBorderColor`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.15)"
      - `multi_booking.timeSelectedBorderColor`: String, default "var(--ion-color-primary)"
      - `multi_booking.timePaddingX`: Number, default 18
      - `multi_booking.timePaddingY`: Number, default 10
      - `multi_booking.timeBackground`: String, default "rgba(var(--ion-color-primary-rgb, 56,128,255), 0.10)"
      - `multi_booking.timeTextColor`: String, default "var(--ion-text-color, inherit)"
      - `multi_booking.timeSelectedBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.timeSelectedTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.buttonText`: String, default "Confirm my booking"
      - `multi_booking.buttonBackground`: String, default "var(--ion-color-primary)"
      - `multi_booking.buttonTextColor`: String, default "var(--ion-color-primary-contrast, #ffffff)"
      - `multi_booking.buttonRadius`: Number, default 100
      - `multi_booking.buttonPaddingY`: Number, default 16
      - `multi_booking.buttonFontSize`: Number, default 15
      - `multi_booking.buttonFontWeight`: String, default "700"
      - `multi_booking.buttonFullWidth`: Boolean, default true
      - `blogposts`: ObjectId[], → BlogPost
      - `videos`: ObjectId[], → Video
      - `price_plans`: ObjectId[], → PricePlan
      - `href`: String, default "#"
      - `router_link`: String
      - `buttonOptions.fill`: String
      - `buttonOptions.expand`: String
      - `buttonOptions.size`: String
      - `buttonOptions.color`: String
      - `buttonOptions.class`: String
      - `buttonOptions.customColor`: String
      - `buttonOptions.customColorContrast`: String
      - `buttonOptions.customColorHover`: String
      - `buttonOptions.hoverRoll`: Boolean
      - `buttonOptions.fontWeight`: Number
      - `buttonOptions.letterSpacing`: Number
      - `buttonOptions.fontSize`: Number, default 14
      - `buttonOptions.borderRadius`: Number, default 6
      - `buttonOptions.customColorA`: String
      - `buttonOptions.customColorB`: String
      - `buttonOptions.customColorC`: String
      - `buttonOptions.custom_measurements`: Boolean, default false
      - `buttonOptions.height.value`: String
      - `buttonOptions.height.unit`: String
      - `buttonOptions.width.value`: String
      - `buttonOptions.width.unit`: String
      - `carousel.showArrows`: Boolean, default true
      - `carousel.showIndicators`: Boolean, default true
      - `carousel.height`: Number, default 90
      - `carousel.automaticHeight`: Boolean, default true
      - `carousel.carouselMedias`: Object[]
      - `map`: String
      - `contactForm.name`: String
      - `contactForm.email`: String
      - `contactForm.subject`: String
      - `contactForm.body`: String
      - `contactForm.button`: String
      - `contactForm.hideNewsletter`: Boolean
      - `contactForm.placeholders.name`: String
      - `contactForm.placeholders.email`: String
      - `contactForm.placeholders.subject`: String
      - `contactForm.placeholders.body`: String
      - `contactForm.style.backgroundColor`: String
      - `contactForm.style.textColor`: String
      - `contactForm.style.accentColor`: String
      - `contactForm.style.border.color`: String
      - `contactForm.style.border.width.value`: Mixed
      - `contactForm.style.border.width.unit`: String
      - `contactForm.style.border.style`: String
      - `contactForm.style.borderRadius.value`: Mixed
      - `contactForm.style.borderRadius.unit`: String
      - `contactForm.style.padding.value`: Mixed
      - `contactForm.style.padding.unit`: String
      - `contactForm.style.labelFontSize.value`: Mixed
      - `contactForm.style.labelFontSize.unit`: String
      - `contactForm.style.consentFontSize.value`: Mixed
      - `contactForm.style.consentFontSize.unit`: String
      - `contactForm.style.inputBackgroundColor`: String
      - `contactForm.style.inputTextColor`: String
      - `contactForm.style.placeholderColor`: String
      - `contactForm.style.inputFocusColor`: String
      - `contactForm.style.inputFontSize.value`: Mixed
      - `contactForm.style.inputFontSize.unit`: String
      - `contactForm.style.inputPadding.value`: Mixed
      - `contactForm.style.inputPadding.unit`: String
      - `contactForm.style.textareaMinHeight.value`: Mixed
      - `contactForm.style.textareaMinHeight.unit`: String
      - `contactForm.style.inputMargin.value`: Mixed
      - `contactForm.style.inputMargin.unit`: String
      - `contactForm.style.inputBorder.color`: String
      - `contactForm.style.inputBorder.width.value`: Mixed
      - `contactForm.style.inputBorder.width.unit`: String
      - `contactForm.style.inputBorder.style`: String
      - `contactForm.style.inputBorderRadius.value`: Mixed
      - `contactForm.style.inputBorderRadius.unit`: String
      - `contactForm.style.buttonBackgroundColor`: String
      - `contactForm.style.buttonTextColor`: String
      - `contactForm.style.buttonAlign`: String
      - `contactForm.style.buttonFontSize.value`: Mixed
      - `contactForm.style.buttonFontSize.unit`: String
      - `contactForm.style.buttonBorder.color`: String
      - `contactForm.style.buttonBorder.width.value`: Mixed
      - `contactForm.style.buttonBorder.width.unit`: String
      - `contactForm.style.buttonBorder.style`: String
      - `contactForm.style.buttonBorderRadius.value`: Mixed
      - `contactForm.style.buttonBorderRadius.unit`: String
      - `contactForm.style.buttonWidth.value`: Mixed
      - `contactForm.style.buttonWidth.unit`: String
      - `contactForm.additional`: Object[]
      - `instagram.columns`: Number
      - `instagram.first`: Number
      - `instagram.skip`: Number
      - `instagram.showInfo`: Boolean
      - `instagram.gridType`: Number
      - `instagram.profile`: String
      - `facebook.url`: String
      - `facebook.width`: String
      - `facebook.height`: String
      - `animation`: String, default "none"
      - `animationDuration`: Number, default 0
      - `animationStrength`: Number
      - `parallaxEnabled`: Boolean
      - `parallaxAmount`: Number
      - `parallaxZoom`: Number
      - `textReveal`: String
      - `animationDelay`: Number, default 0
      - `animationReplay`: String, default "once"
      - `animationEasing`: String, default "power3.out"
      - `animationBreakpoint`: String, default "all"
      - `scrollScrubEnabled`: Boolean, default false
      - `scrollScrubAxis`: String, default "y"
      - `scrollScrubDistance`: Number, default 80
      - `motionOrigin`: String, default "center center"
      - `hoverEnabled`: Boolean, default false
      - `hoverEffect`: String, default "none"
      - `hoverDuration`: Number, default 240
      - `hoverIntensity`: Number, default 4
      - `continuousEnabled`: Boolean, default false
      - `continuousEffect`: String, default "none"
      - `continuousDuration`: Number, default 2400
      - `continuousIntensity`: Number, default 4
      - `statefulEnabled`: Boolean, default false
      - `statefulEffect`: String, default "none"
      - `statefulDuration`: Number, default 260
      - `statefulStagger`: Number, default 60
      - `transform.enabled`: Boolean, default false
      - `transform.translateX.value`: Number, default 0
      - `transform.translateX.unit`: String, default "px"
      - `transform.translateY.value`: Number, default 0
      - `transform.translateY.unit`: String, default "px"
      - `transform.scaleX`: Number, default 1
      - `transform.scaleY`: Number, default 1
      - `transform.rotate`: Number, default 0
      - `transform.rotateX`: Number, default 0
      - `transform.rotateY`: Number, default 0
      - `transform.skewX`: Number, default 0
      - `transform.skewY`: Number, default 0
      - `transform.perspective`: Number, default 0
      - `transform.originX`: String, default "center"
      - `transform.originY`: String, default "center"
      - `opacity`: Mixed
      - `transitionDuration`: Mixed
      - `transitionEasing`: String
      - `states`: Mixed
      - `useIframe`: Boolean, default false
      - `popup.text`: String
      - `popup.backgroundColor`: String
      - `popup.fullScreen`: Boolean, default false
      - `popup.about_page`: ObjectId, → AboutPage
      - `custom_component.html`: String
      - `custom_component.compiled_html`: String
      - `custom_component.css`: String
      - `custom_component.compiled_css`: String
      - `custom_component.js`: String
      - `custom_component.iframe`: Boolean, default false
      - `custom_component.variables`: Object[]
      - `hoverable_media.before_hover_media.media`: ObjectId, → Media
      - `hoverable_media.before_hover_media.gcs_url`: String
      - `hoverable_media.before_hover_media.vimeo_uri`: String
      - `hoverable_media.before_hover_media.vimeo_picture`: String
      - `hoverable_media.before_hover_media.youtube_url`: String
      - `hoverable_media.before_hover_media.vimeo_url`: String
      - `hoverable_media.before_hover_media.href`: String
      - `hoverable_media.before_hover_media.router_link`: String
      - `hoverable_media.before_hover_media.thumbnail`: String
      - `hoverable_media.before_hover_media.autoplay`: Boolean, default false
      - `hoverable_media.before_hover_media.loop`: Boolean, default false
      - `hoverable_media.before_hover_media.show_controls`: Boolean, default true
      - `hoverable_media.after_hover_media.media`: ObjectId, → Media
      - `hoverable_media.after_hover_media.gcs_url`: String
      - `hoverable_media.after_hover_media.vimeo_uri`: String
      - `hoverable_media.after_hover_media.vimeo_picture`: String
      - `hoverable_media.after_hover_media.youtube_url`: String
      - `hoverable_media.after_hover_media.vimeo_url`: String
      - `hoverable_media.after_hover_media.href`: String
      - `hoverable_media.after_hover_media.router_link`: String
      - `hoverable_media.after_hover_media.thumbnail`: String
      - `hoverable_media.after_hover_media.autoplay`: Boolean, default false
      - `hoverable_media.after_hover_media.loop`: Boolean, default false
      - `hoverable_media.after_hover_media.show_controls`: Boolean, default true
      - `collapsible_container`: Object[]
      - `collapsible_container_settings.enable_customization`: Boolean, default false
      - `collapsible_container_settings.title_color`: String
      - `collapsible_container_settings.title_color_checked`: String
      - `collapsible_container_settings.title_background`: String
      - `collapsible_container_settings.title_background_checked`: String
      - `collapsible_container_settings.title_font_size`: String
      - `collapsible_container_settings.title_border_radius`: String
      - `collapsible_container_settings.title_border_color`: String
      - `collapsible_container_settings.title_border_width`: String
      - `collapsible_container_settings.body_color`: String
      - `collapsible_container_settings.body_background`: String
      - `collapsible_container_settings.body_border_radius`: String
      - `collapsible_container_settings.body_border_color`: String
      - `collapsible_container_settings.body_border_width`: String
      - `collapsible_container_settings.body_font_size`: String
      - `collapsible_container_settings.icon_color`: String
      - `collapsible_container_settings.icon_glyph_color`: String
      - `collapsible_container_settings.icon_background_color`: String
      - `quiz.title`: String
      - `quiz.header`: String
      - `quiz.questions`: Object[]
      - `quiz.score_results`: Object[]
      - `quiz.show_right_answers`: Boolean, default false
      - `quiz.mutliple_choice`: Boolean, default false
      - `partners.defaultCollection`: String, default ""
      - `partners.defaultView`: String, default "locations"
      - `scroll_sequence.media`: ObjectId, → Media
      - `scroll_sequence.scroll_length`: Number, default 3
      - `scroll_sequence.fit`: String, one of cover | contain, default "cover"
      - `scroll_sequence.background_color`: String, default "#000000"
      - `scroll_sequence.overlay_color`: String, default ""
      - `scroll_sequence.overlay_opacity`: Number, default 0
      - `scroll_sequence.rows_over`: Boolean, default true
      - `scroll_sequence.rows_effect`: String, one of slide | pop, default "slide"
      - `scroll_sequence.snap_points`: Number[]
      - `scroll_sequence.snap_scroll_speed`: Number, default 1.5
      - `scroll_sequence.snap_down`: Boolean, default true
      - `scroll_sequence.snap_up`: Boolean, default false
      - `scroll_sequence.stop_momentum`: Boolean, default false
      - `smart_search.placeholder`: String, default ""
      - `smart_search.kinds`: String[]
      - `smart_search.collections`: String[]
      - `smart_search.items`: Object[]
      - `smart_search.showKindFilter`: Boolean, default true
      - `smart_search.showPriceFilter`: Boolean, default false
      - `smart_search.showDateFilter`: Boolean, default false
      - `smart_search.showSort`: Boolean, default true
      - `smart_search.dateMode`: String, one of created | updated | availability, default "created"
      - `smart_search.layout`: String, one of grid | list, default "grid"
      - `smart_search.columns`: Number, default 3
      - `smart_search.perPage`: Number, default 12
      - `smart_search.instant`: Boolean, default true
      - `smart_search.showImages`: Boolean, default true
      - `smart_search.showPrices`: Boolean, default true
      - `smart_search.showInitial`: Boolean, default false
      - `smart_search.showAnswer`: Boolean, default false
      - `countdown.targetDate`: String, default ""
      - `countdown.expiredText`: String, default "Offer has ended"
      - `countdown.hideOnExpire`: Boolean, default false
      - `countdown.textColor`: String, default ""
      - `countdown.boxColor`: String, default ""
      - `countdown.align`: String, one of  | left | center | right, default ""
      - `swiper.slides`: Object[]
      - `swiper.autoplay`: Boolean, default false
      - `swiper.loop`: Boolean, default false
      - `swiper.show_controls`: Boolean, default true
      - `swiper.dynamic_bullets`: Boolean, default false
      - `swiper.pagination`: Boolean, default true
      - `dynamicField`: String
      - `useDynamicField`: Boolean, default false
      - `text_auto_slider.speed`: Number
      - `text_auto_slider.aspect_ratio`: String
      - `text_auto_slider.text_color`: String
      - `text_auto_slider.background_color`: String
      - `text_auto_slider.delimiter_color`: String
      - `text_auto_slider.direction`: String
      - `text_auto_slider.width`: Number
      - `text_auto_slider.font_size`: Number
      - `text_auto_slider.text_transform`: String, one of none | uppercase, default "none"
      - `text_auto_slider.texts`: Object[]
      - `image_auto_slider.speed`: Number
      - `image_auto_slider.aspect_ratio`: String
      - `image_auto_slider.direction`: String
      - `image_auto_slider.width`: Number
      - `image_auto_slider.medias`: Object[]
      - `image_dragger.aspect_ratio`: String
      - `image_dragger.media_1.media`: ObjectId, → Media
      - `image_dragger.media_1.gcs_url`: String
      - `image_dragger.media_1.vimeo_uri`: String
      - `image_dragger.media_1.vimeo_picture`: String
      - `image_dragger.media_1.vimeo_url`: String
      - `image_dragger.media_1.youtube_url`: String
      - `image_dragger.media_2.media`: ObjectId, → Media
      - `image_dragger.media_2.gcs_url`: String
      - `image_dragger.media_2.vimeo_uri`: String
      - `image_dragger.media_2.vimeo_picture`: String
      - `image_dragger.media_2.vimeo_url`: String
      - `image_dragger.media_2.youtube_url`: String
      - `image_dragger.media_2.title`: String
      - `image_dragger.media_2.body`: String
      - `image_dragger.media_2.textColor`: String
      - `image_dragger.media_2.href`: String
      - `image_dragger.media_2.router_link`: String
      - `_id`: ObjectId
    - `sections`: Object[]
      - `position`: String, one of static | relative | absolute | fixed | sticky, default "static"
      - `overflow`: String, one of visible | hidden | scroll | auto, default "visible"
      - `editorName`: String
      - `top.value`: String, default "0"
      - `top.unit`: String, default "px"
      - `top.mobile_value`: String, default ""
      - `top.mobile_unit`: String, default "px"
      - `left.value`: String, default "0"
      - `left.unit`: String, default "px"
      - `left.mobile_value`: String, default ""
      - `left.mobile_unit`: String, default "px"
      - `right.value`: String, default "0"
      - `right.unit`: String, default "px"
      - `right.mobile_value`: String, default ""
      - `right.mobile_unit`: String, default "px"
      - `bottom.value`: String, default "0"
      - `bottom.unit`: String, default "px"
      - `bottom.mobile_value`: String, default ""
      - `bottom.mobile_unit`: String, default "px"
      - `display`: String, one of block | inline | flex, default "block"
      - `flex_direction`: String, one of row | row-reverse | column | column-reverse, default "row"
      - `flex_direction_mobile`: String, default ""
      - `backdropFilter`: String, default ""
      - `justify`: String, one of start | end | center | space-between | space-around | stretch, default "start"
      - `justify_mobile`: String, default ""
      - `align`: String, one of start | end | center | space-between | space-around | stretch, default "start"
      - `align_mobile`: String, default ""
      - `animation`: String, default "none"
      - `animationDuration`: Number, default 0
      - `animationStrength`: Number
      - `parallaxEnabled`: Boolean
      - `parallaxAmount`: Number
      - `parallaxZoom`: Number
      - `animationDelay`: Number, default 0
      - `animationReplay`: String, default "once"
      - `animationEasing`: String, default "power3.out"
      - `animationBreakpoint`: String, default "all"
      - `scrollScrubEnabled`: Boolean, default false
      - `scrollScrubAxis`: String, default "y"
      - `scrollScrubDistance`: Number, default 80
      - `motionOrigin`: String, default "center center"
      - `hoverEnabled`: Boolean, default false
      - `hoverEffect`: String, default "none"
      - `hoverDuration`: Number, default 240
      - `hoverIntensity`: Number, default 4
      - `continuousEnabled`: Boolean, default false
      - `continuousEffect`: String, default "none"
      - `continuousDuration`: Number, default 2400
      - `continuousIntensity`: Number, default 4
      - `statefulEnabled`: Boolean, default false
      - `statefulEffect`: String, default "none"
      - `statefulDuration`: Number, default 260
      - `statefulStagger`: Number, default 60
      - `transform.enabled`: Boolean, default false
      - `transform.translateX.value`: Number, default 0
      - `transform.translateX.unit`: String, default "px"
      - `transform.translateY.value`: Number, default 0
      - `transform.translateY.unit`: String, default "px"
      - `transform.scaleX`: Number, default 1
      - `transform.scaleY`: Number, default 1
      - `transform.rotate`: Number, default 0
      - `transform.rotateX`: Number, default 0
      - `transform.rotateY`: Number, default 0
      - `transform.skewX`: Number, default 0
      - `transform.skewY`: Number, default 0
      - `transform.perspective`: Number, default 0
      - `transform.originX`: String, default "center"
      - `transform.originY`: String, default "center"
      - `opacity`: Mixed
      - `transitionDuration`: Mixed
      - `transitionEasing`: String
      - `states`: Mixed
      - `hoverGroup`: Boolean
      - `flex_wrap`: String, one of nowrap | wrap | wrap-reverse, default "wrap"
      - `flex_wrap_mobile`: String, default ""
      - `width.value`: String, default ""
      - `width.unit`: String, default "px"
      - `width.mobile_value`: String, default ""
      - `width.mobile_unit`: String, default "px"
      - `min_width.value`: String, default ""
      - `min_width.unit`: String, default "px"
      - `min_width.mobile_value`: String, default ""
      - `min_width.mobile_unit`: String, default "px"
      - `max_width.value`: String, default ""
      - `max_width.unit`: String, default "px"
      - `max_width.mobile_value`: String, default ""
      - `max_width.mobile_unit`: String, default "px"
      - `height.value`: String, default ""
      - `height.unit`: String, default "px"
      - `height.mobile_value`: String, default ""
      - `height.mobile_unit`: String, default "px"
      - `min_height.value`: String, default ""
      - `min_height.unit`: String, default "px"
      - `min_height.mobile_value`: String, default ""
      - `min_height.mobile_unit`: String, default "px"
      - `max_height.value`: String, default ""
      - `max_height.unit`: String, default "px"
      - `max_height.mobile_value`: String, default ""
      - `max_height.mobile_unit`: String, default "px"
      - `object_fit`: String
      - `aspect_ratio.custom`: Boolean, default false
      - `aspect_ratio.ratio`: String, default ""
      - `margin_left.value`: String, default "0"
      - `margin_left.unit`: String, default "px"
      - `margin_left.mobile_value`: String, default ""
      - `margin_left.mobile_unit`: String, default "px"
      - `margin_right.value`: String, default "0"
      - `margin_right.unit`: String, default "px"
      - `margin_right.mobile_value`: String, default ""
      - `margin_right.mobile_unit`: String, default "px"
      - `margin_top.value`: String, default "0"
      - `margin_top.unit`: String, default "px"
      - `margin_top.mobile_value`: String, default ""
      - `margin_top.mobile_unit`: String, default "px"
      - `margin_bottom.value`: String, default "0"
      - `margin_bottom.unit`: String, default "px"
      - `margin_bottom.mobile_value`: String, default ""
      - `margin_bottom.mobile_unit`: String, default "px"
      - `padding_left.value`: String, default "0"
      - `padding_left.unit`: String, default "px"
      - `padding_left.mobile_value`: String, default ""
      - `padding_left.mobile_unit`: String, default "px"
      - `padding_right.value`: String, default "0"
      - `padding_right.unit`: String, default "px"
      - `padding_right.mobile_value`: String, default ""
      - `padding_right.mobile_unit`: String, default "px"
      - `padding_top.value`: String, default "0"
      - `padding_top.unit`: String, default "px"
      - `padding_top.mobile_value`: String, default ""
      - `padding_top.mobile_unit`: String, default "px"
      - `padding_bottom.value`: String, default "0"
      - `padding_bottom.unit`: String, default "px"
      - `padding_bottom.mobile_value`: String, default ""
      - `padding_bottom.mobile_unit`: String, default "px"
      - `border_left.style`: String, default "none"
      - `border_left.color`: String
      - `border_left.width.value`: String, default "0"
      - `border_left.width.unit`: String, default "px"
      - `border_right.style`: String, default "none"
      - `border_right.color`: String
      - `border_right.width.value`: String, default "0"
      - `border_right.width.unit`: String, default "px"
      - `border_top.style`: String, default "none"
      - `border_top.color`: String
      - `border_top.width.value`: String, default "0"
      - `border_top.width.unit`: String, default "px"
      - `border_bottom.style`: String, default "none"
      - `border_bottom.color`: String
      - `border_bottom.width.value`: String, default "0"
      - `border_bottom.width.unit`: String, default "px"
      - `border_top_left_radius.value`: String, default "0"
      - `border_top_left_radius.unit`: String, default "px"
      - `border_top_right_radius.value`: String, default "0"
      - `border_top_right_radius.unit`: String, default "px"
      - `border_bottom_left_radius.value`: String, default "0"
      - `border_bottom_left_radius.unit`: String, default "px"
      - `border_bottom_right_radius.value`: String, default "0"
      - `border_bottom_right_radius.unit`: String, default "px"
      - `border_radius.value`: String, default "0"
      - `border_radius.unit`: String, default "px"
      - `specific_border_radius`: Boolean, default false
      - `box_shadows`: Object[]
      - `backgroundColor`: String
      - `backgroundGradient.enabled`: Boolean, default false
      - `backgroundGradient.type`: String
      - `backgroundGradient.degrees`: Number
      - `backgroundGradient.radialShape`: String
      - `backgroundGradient.radialPosition`: String
      - `backgroundGradient.colors`: Object[]
      - `backgroundGradient.css`: String
      - `backgroundVideo`: String
      - `backgroundImage`: String
      - `backgroundSize`: String
      - `backgroundPosition`: String
      - `backgroundRepeat`: String
      - `showOnMobile`: Boolean, default true
      - `showOnDesktop`: Boolean, default true
      - `components`: Object[]
      - `sections`: Object[]
      - `_id`: ObjectId
    - `_id`: ObjectId
  - `ai_meta`: Mixed
  - `_id`: ObjectId
- `suitability_price_plans`: ObjectId[], → PricePlan - PricePlan ids.
- `isSuitable`: Boolean - Set per request, not stored: whether the signed-in user's price plans match the page's suitability plans.
- `archived`: Boolean, default false - Hidden from the site and the admin's page list without being deleted.
- `archivedAt`: Date - When the page was archived.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### BlogPost

An article on the site's blog.

- `title`: String, required - Title of blogpost.
- `url`: String, required - Generated from title, no need to set it manually.
- `static_url`: String - A fixed address kept when the post's url changes, so old links keep working.
- `header`: String - Short header of blogpost.
- `description`: String, required - Body text of blogpost.
- `medias`: Object[] - Attached media objects with ids.
  - `media`: ObjectId, → Media
  - `gcs_url`: String
  - `gcs_480_30_url`: String
  - `gcs_720_30_url`: String
  - `gcs_1080_30_url`: String
  - `duration`: Number
  - `thumbnail`: String
  - `vimeo_uri`: String
  - `vimeo_picture`: String
  - `vimeo_url`: String
  - `youtube_url`: String
  - `youtube_picture`: String
  - `_id`: ObjectId
- `published`: Boolean, default true - True if not set.
- `owner_id`: ObjectId, → User - User.id.
- `connected_account_owner_id`: ObjectId, → User - User.id.
- `collection_id`: ObjectId, → Collection - Collection, to which the blog post belongs.
- `selected`: Boolean, default false - False if not set.
- `custom_1`: String - Custom defined field 1.
- `custom_2`: String - Custom defined field 2.
- `custom_3`: String - Custom defined field 3.
- `about_page`: ObjectId, → AboutPage - Reference to AboutPage model, shown at the bottom of the post page.
- `suitability_price_plans`: ObjectId[], → PricePlan - A list of references to PricePlan model, marks post as suitable for users with those plans.
- `isSuitable`: Boolean - Set per request, not stored: whether the signed-in user's price plans match the post's suitability plans.
- `reference_id`: String - Id of the record the post was made from (an import or a clone).
- `wildcard_url`: Mixed - The wildcard route this post answers on, when it has one.
- `likes`: ObjectId[], → User - User ids.
- `views`: ObjectId[], → User - User ids.
- `total_views`: Number, default 0 - How many times the post was opened.
- `saves`: ObjectId[], → User - User ids.
- `times_showed`: Number, default 0 - How many times the post was shown in a list.
- `requiresLogin`: Boolean, default false - Only signed-in users can read the post.
- `requiresSubscription`: Boolean, default false - Only subscribers of the post's price plans can read it.
- `price_plan_ids`: String[] - A list of price plan id strings that grant access to this post.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Collection

A group or filter of items; the prefix of its name is its kind (product/, grouping/, service/, blogpost/...).

- `name`: String, required - Written "<kind>/<Name>": the prefix is where it shows - product/ (a store category), service/ (a service category), blogpost/, program-category/, donation-category/; filters: grouping/ (in a product category), calendar-filter/ (on the booking page). "service/Deep cleaning". A name without a prefix shows nowhere.
- `parent_collection`: ObjectId, → Collection - Collection.id of the parent collection.
- `picture`: ObjectId, → Media - Media.id.
- `about_page`: ObjectId, → AboutPage - Reference to AboutPage.
- `match_to_option`: Boolean, default false - Matches all products which have an option with match_to_collection true.
- `is_color`: Boolean, default false - Used for products with color options.
- `color`: String - Used to visually show the color on the page when is_color is true.
- `position`: Number - Order among collections of the same kind; lower first.
- `items`: ObjectId[] - Array<Product.id> deprecated.
- `thumbnail`: ObjectId, → Media - Media.id, shown on the store cards instead of picture.
- `_id`: ObjectId

### Comment

- `user`: ObjectId, required, → User - User.id.
- `connected_account_user`: ObjectId, → User - User.id.
- `commented_on`: ObjectId, required - Id of the record commented on (a post, product, service...).
- `comment`: String, required - Comment message.
- `likes`: ObjectId[], → User - User ids.
- `replies`: Object[] - Message.
  - `comment`: String, required
  - `user`: ObjectId, required, → User
  - `likes`: ObjectId[], → User
  - `createdAt`: Date
  - `isHidden`: Boolean, default false
  - `_id`: ObjectId
- `mentions`: ObjectId[], → User - User ids.
- `isHidden`: Boolean, default false - Hidden by a moderator; kept but not shown.
- `medias`: Object[] - Pictures attached to the comment.
  - `media`: ObjectId, → Media
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### ConnectedAccount

- `on_behalf_of`: ObjectId, required, → User - The profile that gives authority to other user to alter his account.
- `user_account`: ObjectId, required, → User - The account which will receive certain privileges over over the account of the authorizer.
- `status`: String, default "pending" - State of the connection (connected, expired...).
- `is_authorized_to.create_posts`: Boolean, default false
- `is_authorized_to.send_messages`: Boolean, default false
- `is_authorized_to.answer_delete_comments`: Boolean, default false
- `is_authorized_to.access_engagements`: Boolean, default false
- `is_authorized_to.access_boosted_posts`: Boolean, default false
- `is_authorized_to.access_analytics`: Boolean, default false
- `is_authorized_to.alter_profile_settings`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_products`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_services`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_blogposts`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_price_plans`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_programs`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_orders`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_bookings`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_subscriptions`: Boolean, default false
- `is_authorized_to.catalogue_access.alter_purchases`: Boolean, default false
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Media

An uploaded image, video or file.

- `file`: Buffer - (buffer) base64 image data.
- `file_path`: String - The bytes in Cloud Storage instead of `file` (utils/media-store.js): the object - named by the bytes' sha256, so identical pictures share one - and that hash.
- `alt`: String - Img alt (same as filename if not specified).
- `filename`: String - Name of the stored file.
- `filetype`: String - MIME type of the file.
- `vimeo_uri`: String - The video's Vimeo id, for videos hosted there.
- `vimeo_picture`: String - Thumbnail Vimeo made.
- `duration`: Number - Length of a video in seconds.
- `vimeo_url`: String - Link to the video on Vimeo.
- `youtube_url`: String - Link to the video on YouTube.
- `youtube_picture`: String - Thumbnail of the YouTube video.
- `thumbnail`: String - Small preview of the file.
- `gcs_url`: String - The file's address in cloud storage.
- `gcs_480_30_url`: String - The video transcoded to 480p.
- `gcs_720_30_url`: String - The video transcoded to 720p.
- `gcs_1080_30_url`: String - The video transcoded to 1080p.
- `picture_gcs_url`: String - The picture's address in cloud storage.
- `transcode_status`: String, default "not_started" - 'not_started' | 'pending' | 'error' | 'completed'.
- `owner_id`: ObjectId, → User - User id of owner.
- `sequence.status`: String
- `sequence.started_at`: Date
- `sequence.updated_at`: Date
- `sequence.step`: String
- `sequence.done`: Number
- `sequence.total`: Number
- `sequence.ext`: String
- `sequence.trim_start`: Number
- `sequence.trim_end`: Number
- `sequence.build_id`: String
- `sequence.previous_base`: String
- `sequence.frame_count`: Number
- `sequence.fps`: Number
- `sequence.width`: Number
- `sequence.height`: Number
- `sequence.desktop_path`: String
- `sequence.mobile_path`: String
- `sequence.portrait_path`: String
- `sequence.poster`: String
- `sequence.error`: String
- `source_url`: String - Site-clone real-asset reuse: the original URL this Media was downloaded from (asset-fetcher.js). Lets repeated/duplicate clone runs reuse the same stored asset instead of re-downloading it.
- `source_framing`: String - How a downloaded picture was prepared before it was stored (asset-fetcher.js FRAMING): a copy made before the frame its site baked in was taken off is not reused for one made after.
- `origin`: String - 'ai' for images the AI builder generated (validators.js). The site-readiness checklist counts the items still showing one, so people know which photos to replace with their own. Unset on uploads and on media created before it.
- `width`: Number - Displayed size of an image file (utils/image-size.js), so pages can give the <img> width/height and reserve its space before it loads. Set on save; older media by scripts/backfill-media-size.js.
- `height`: Number - Height of the picture in pixels.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### MyContact

The site's name and contact details.

- `zip_code`: String, required - Postal/ZIP code.
- `city`: String, required - The city where the business is located.
- `address`: String, required - The street address.
- `contact`: String - Html format.
- `email`: String, required - The public contact email address.
- `google_app`: String - Link to the business's app on Google Play.
- `workhours`: String - Opening hours as text.
- `logo`: ObjectId - Media.id.
- `site_name`: String, required - The business/site name shown publicly.
- `domain`: String, required - The site's own domain.
- `stock_domain`: String - The platform subdomain the site always answers on.
- `isMarket`: Boolean, required, default false - The site is a marketplace.
- `forbidden_collections`: Object[] - Array of {collection_id}.
  - `collection_id`: ObjectId, → Collection
  - `_id`: ObjectId
- `isInit`: Boolean, default false - The site was set up from a template.
- `template`: String, default "0000" - The template the site was made from.
- `lang`: String - 2-letter language code (e.g. "en", "fr", "de").
- `allowedComponents.services`: Boolean, default true
- `allowedComponents.products`: Boolean, default true
- `allowedComponents.blogposts`: Boolean, default true
- `allowedComponents.programs`: Boolean, default true
- `favicon`: ObjectId - Media.id of the browser tab icon.
- `cacheEnabled`: Boolean - Pages are cached for faster loading.
- `has_completed_startup_prompt`: Boolean, default true - The owner went through the first AI prompt.
- `gmb_location`: String - The Google Business Profile location linked to the site.
- `ga_property`: String - The Google Analytics property linked to the site.
- `site_generated_at`: Date - When the AI builder first built this site (a plan that made the homepage). Written once (runPlan); starts the admin's 15-minute launch offer.
- `admin_first_opened_at`: Date - When the owner first opened the admin; with admin_last_opened_at it tells "never opened it" from "opened it and left".
- `admin_last_opened_at`: Date - When the owner last opened the admin.
- `admin_in_app_browser`: Boolean - The owner last opened the admin inside an app's browser.
- `domain_suggestions`: Mixed - Domain names suggested to the owner, kept so they are not suggested again.
- `_id`: ObjectId

### ProfessionalAccount

- `user`: ObjectId, required, → User - Id of user, who has created the account.
- `show.services`: Boolean, default false
- `show.staff_members`: Boolean, default false
- `show.blogposts`: Boolean, default false
- `show.programs`: Boolean, default false
- `show.products`: Boolean, default false
- `show.events`: Boolean, default false
- `show.price_plans`: Boolean, default false
- `show.posts`: Boolean, default false
- `reviewed`: Boolean, default false - A moderator reviewed the request.
- `approved`: Boolean, default false - The account was approved as professional.
- `cover`: ObjectId, → Media - Media.id.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### SocialModeSettings

The switches for the site's social app features: feed, posts, groups, chat, marketplace.

- `social_mode`: Boolean, default false - The site runs as a social network (feed, profiles).
- `allow_products`: Boolean, default false - Users can sell products.
- `allow_services`: Boolean, default false - Users can offer services.
- `allow_services_stp`: Boolean, default false - Users can take service payments themselves.
- `allow_blogposts`: Boolean, default false - Users can write blog posts.
- `allow_programs`: Boolean, default false - Users can sell programs.
- `allow_programs_stp`: Boolean, default false - Users can take program payments themselves.
- `allow_posts`: Boolean, default false - Users can post to the feed.
- `allow_ai`: Boolean, default false - AI features are on for users.
- `allow_bites`: Boolean, default false - Short videos are on.
- `allow_long_videos`: Boolean, default false - Long videos are on.
- `allow_explore`: Boolean, default false - The explore page is on.
- `allow_online_payments`: Boolean, default false - Users can take online payments.
- `allow_price_plans`: Boolean, default false - Users can sell subscriptions.
- `allow_boosting_posts`: Boolean, default false - Users can pay to boost posts.
- `allow_single_ai`: Boolean, default false - Users get the single-chat AI.
- `merchant_agreement`: ObjectId, → AboutPage - AboutPage.id.
- `verification_popup`: ObjectId, → AboutPage - AboutPage.id.
- `commission`: Number - Platform commission on users' sales, in percent.
- `home_page`: String, default "home" - What opens first (feed, store, about page...).
- `navigation_pages.bites`: Boolean, default true
- `navigation_pages.long_videos`: Boolean, default true
- `navigation_pages.vouchers`: Boolean, default true
- `navigation_pages.store`: Boolean, default true
- `navigation_pages.programs`: Boolean, default true
- `navigation_pages.services`: Boolean, default true
- `navigation_pages.blogposts`: Boolean, default true
- `navigation_pages.subscription`: Boolean, default true
- `navigation_pages.playlists`: Boolean, default true
- `navigation_pages.partners`: Boolean, default true
- `navigation_pages.contacts`: Boolean, default true
- `navigation_pages.tracker`: Boolean, default true
- `navigation_pages.more`: Boolean, default true
- `navigation_pages.claims`: Boolean, default true
- `navigation_pages.miniapps`: Boolean, default false
- `navigation_pages.events`: Boolean, default false
- `navigation_pages.professional_pages`: Boolean, default false
- `allow_google_login`: Boolean, default true - Sign in with Google is on.
- `use_cdn_for_medias`: Boolean, default false - Pictures and videos load from cdn_for_medias.
- `cdn_for_medias`: String - CDN address for media.
- `use_cdn_for_microservices`: Boolean, default false - Microservices are called through cdn_for_microservices.
- `cdn_for_microservices`: String - CDN address for microservices.
- `cdn_for_sockets`: String - Address of the socket server.
- `paywall.store.has_paywall`: Boolean, default false
- `paywall.store.priceplans`: ObjectId[], → PricePlan
- `paywall.programs.has_paywall`: Boolean, default false
- `paywall.programs.priceplans`: ObjectId[], → PricePlan
- `paywall.services.has_paywall`: Boolean, default false
- `paywall.services.priceplans`: ObjectId[], → PricePlan
- `paywall.blogposts.has_paywall`: Boolean, default false
- `paywall.blogposts.priceplans`: ObjectId[], → PricePlan
- `paywall.subscription.has_paywall`: Boolean, default false
- `paywall.subscription.priceplans`: ObjectId[], → PricePlan
- `paywall.post.has_paywall`: Boolean, default false
- `paywall.post.priceplans`: ObjectId[], → PricePlan
- `paywall.groups.has_paywall`: Boolean, default false
- `paywall.groups.priceplans`: ObjectId[], → PricePlan
- `paywall.professional_pages.has_paywall`: Boolean, default false
- `paywall.professional_pages.priceplans`: ObjectId[], → PricePlan
- `allow_chat`: Boolean, default true - Users can message each other.
- `allow_in_app_notifications`: Boolean, default true - In-app notifications are on.
- `dashboard_pages.following`: Boolean, default true
- `dashboard_pages.recent`: Boolean, default true
- `dashboard_pages.threads`: Boolean, default true
- `dashboard_pages.long_videos`: Boolean, default true
- `dashboard_pages.groups`: Boolean, default true
- `dashboard_pages.about_pages`: Boolean, default true
- `dashboard_pages.mini_apps`: Boolean, default true
- `dashboard_pages.blogposts`: Boolean, default true
- `dashboard_pages.products`: Boolean, default true
- `dashboard_pages.services`: Boolean, default true
- `dashboard_pages.price_plans`: Boolean, default true
- `dashboard_pages.programs`: Boolean, default true
- `dashboard_pages.claims`: Boolean, default true
- `dashboard_pages.bites`: Boolean, default true
- `dashboard_pages.playlists`: Boolean, default true
- `dashboard_pages.partners`: Boolean, default true
- `dashboard_pages.contacts`: Boolean, default true
- `dashboard_pages.tracker`: Boolean, default true
- `dashboard_pages.vouchers`: Boolean, default true
- `dashboard_pages.explore`: Boolean, default true
- `feed_menus`: String, default "grid" - Grid, row.
- `allow_miniapps`: Boolean, default false - Mini apps are on.
- `about_pages.groups`: ObjectId, → AboutPage
- `user_groups`: Boolean, default true - Users can create groups.
- `allow_professional_pages`: Boolean, default false - Professional accounts get their own pages.
- `allow_professional_account_registration`: Boolean, default false - Users can apply for a professional account.
- `locations_map.enabled`: Boolean, default false
- `use_companion_bookings`: Boolean, default false - Bookings are handled by the companion app.
- `confirm_bookings_call`: Boolean, default false - The AI phone agent calls to confirm bookings.
- `require_professional_account.services`: Boolean, default false
- `require_professional_account.products`: Boolean, default false
- `require_professional_account.programs`: Boolean, default false
- `require_professional_account.blogposts`: Boolean, default false
- `require_professional_account.subscriptions`: Boolean, default false
- `hide_feed_menus`: Boolean, default false - Feed menus are hidden.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### Theme

The site's colours, fonts and app tabs.

- `primary`: String, default "#3880ff" - Primary color.
- `primary_darkmode`: String, default "#3880ff" - Primary colour in dark mode.
- `secondary`: String, default "#0cd1e8" - Secondary color.
- `tertiary`: String, default "#7044ff" - Tertiary color.
- `success`: String, default "#10dc60" - Success color.
- `warning`: String, default "#ffce00" - Warning color.
- `danger`: String, default "#f04141" - Danger color.
- `dark`: String, default "#222428" - Dark color.
- `dark_darkmode`: String, default "#222428" - Dark colour in dark mode.
- `medium`: String, default "#989aa2" - Medium color.
- `light`: String, default "#f4f5f8" - Light color.
- `light_darkmode`: String, default "#f4f5f8" - Light colour in dark mode.
- `lightContrast`: String, default "#000000" - Text colour on light backgrounds.
- `lightContrast_darkmode`: String, default "#f4f5f8" - The same in dark mode.
- `headerA`: String, default "#f4f5f8" - Header A color.
- `headerB`: String, default "#f4f5f8" - Header B color.
- `headerA_darkmode`: String, default "#f4f5f8" - Header gradient start in dark mode.
- `headerB_darkmode`: String, default "#f4f5f8" - Header gradient end in dark mode.
- `headerText`: String - Header text colour.
- `headerText_darkmode`: String - Header text colour in dark mode.
- `headerGradientDeg`: Number, default 0 - Angle of the header gradient, in degrees.
- `footerA`: String, default "#222428" - Footer A color.
- `footerB`: String, default "#222428" - Footer B color.
- `footerA_darkmode`: String, default "#222428" - Footer gradient start in dark mode.
- `footerB_darkmode`: String, default "#222428" - Footer gradient end in dark mode.
- `footerGradientDeg`: Number, default 0 - Angle of the footer gradient, in degrees.
- `footerText`: String - Footer text colour.
- `footerText_darkmode`: String - Footer text colour in dark mode.
- `headingFontFamily`: String, default "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif" - Heading Font-Family.
- `headingFontLink`: String, default "" - Stylesheet URL that loads the heading font; empty when the font needs no webfont.
- `headingFontWeight`: String, default "400" - Weight of heading text.
- `headingFontStyle`: String, default "normal" - Style of heading text (normal, italic).
- `bodyFontFamily`: String, default "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif" - Body Font-Family.
- `bodyFontStyle`: String, default "normal" - Style of body text.
- `bodyFontLink`: String, default "" - Stylesheet URL that loads the body font; empty when the font needs no webfont.
- `primary_contrast`: String, default "#3880ff" - Primary contrast color.
- `primary_contrast_darkmode`: String, default "#3880ff" - Text colour on the primary colour in dark mode.
- `headerMinHeight`: String, default "5rem" - Header min-height.
- `product.title`: String, default "right"
- `product.gallery`: String, default "left"
- `product.galleryType`: String, default "gallery"
- `product.options`: String, default "right"
- `product.infos`: String, default "right"
- `product.infosShow`: Boolean, default false
- `product.description`: String, default "left"
- `product.cartBtn`: String, default "default"
- `product.comments`: Boolean, default true
- `product.sku`: Boolean, default true
- `product.brand`: Boolean, default false
- `product.cardDesign`: String, default "item-card-design-1"
- `product.likes`: Boolean, default true
- `product.rating`: Boolean, default false
- `product.titleColor`: String
- `product.priceColor`: String
- `product.descriptionColor`: String
- `product.borderRadius`: String
- `product.titleFontSize`: String
- `product.descriptionFontSize`: String
- `product.priceFontSize`: String
- `product.titleFontWeight`: String
- `product.descriptionFontWeight`: String
- `product.priceFontWeight`: String
- `product.cardBorderRadius`: String
- `product.cardBorderWidth`: String
- `product.cardBorderColor`: String
- `product.cardBackgroundColor`: String
- `product.imageAspectRatio`: String
- `product.ratingList`: Boolean, default false
- `product.customCss`: String
- `product.scroll_next`: Boolean, default false
- `product.ratingBackgroundColor`: String
- `product.quantity_counter`: Object[]
  - `enabled`: Boolean, default false
  - `max_value`: Number
  - `min_value`: Number
  - `linked_inventory`: Boolean
  - `current_value`: Number
  - `product`: ObjectId, → Product
  - `last_updated`: Date
  - `_id`: ObjectId
- `product.view_counter`: Boolean, default false
- `product.contactInfo`: Boolean, default true
- `product.cartBanner`: Boolean, default false
- `product.navigation`: Boolean, default true
- `product.price`: String, default "top"
- `product.optionsColor`: String
- `product.optionsBackground`: String
- `product.optionsFontSize`: String
- `product.optionsFontWeight`: String
- `product.optionsColorSelected`: String
- `product.optionsBackgroundSelected`: String
- `product.viewMultiplier`: Number, default 1
- `product.cartColor`: String
- `product.cartBackground`: String
- `product.cartFontSize`: String
- `product.cartFontWeight`: String
- `product.ctaColor`: String
- `product.ctaBorderColor`: String
- `product.ctaFontSize`: String
- `product.ctaFontWeight`: String
- `product.selectOption`: Boolean, default false
- `product.skin`: String
- `product.mode`: String
- `product.accentColor`: String
- `product.fieldBackground`: String
- `product.imageRadius`: Number
- `product.titleFontFamily`: String
- `product.titleTransform`: String
- `product.priceFontFamily`: String
- `product.priceFontStyle`: String
- `product.buttonRadius`: Number
- `product.hairlineWidth`: Number
- `product.hairlineColor`: String
- `product.boxShadowColor`: String
- `product.boxShadowOffsetX`: Number
- `product.boxShadowOffsetY`: Number
- `product.boxShadowBlurRadius`: Number
- `product.boxShadowSpreadRadius`: Number
- `product.chipBackground`: String
- `product.chipBorderColor`: String
- `product.chipTextColor`: String
- `service.title`: String, default "left"
- `service.gallery`: String, default "left"
- `service.galleryType`: String, default "gallery"
- `service.options`: String, default "right"
- `service.infos`: String, default "right"
- `service.description`: String, default "left"
- `service.comments`: Boolean, default true
- `service.cardDesign`: String, default "item-card-design-1"
- `service.likes`: Boolean, default true
- `service.rating`: Boolean, default false
- `service.titleColor`: String
- `service.priceColor`: String
- `service.descriptionColor`: String
- `service.borderRadius`: String
- `service.titleFontSize`: String
- `service.descriptionFontSize`: String
- `service.priceFontSize`: String
- `service.titleFontWeight`: String
- `service.descriptionFontWeight`: String
- `service.priceFontWeight`: String
- `service.cardBorderRadius`: String
- `service.cardBorderWidth`: String
- `service.cardBorderColor`: String
- `service.cardBackgroundColor`: String
- `service.imageAspectRatio`: String
- `service.ratingList`: Boolean, default false
- `service.customCss`: String
- `service.calendarColor`: String
- `service.dateBackground`: String
- `service.dateTextColor`: String
- `service.skin`: String
- `service.mode`: String
- `service.accentColor`: String
- `service.fieldBackground`: String
- `service.imageRadius`: Number
- `service.buttonRadius`: Number
- `service.titleFontFamily`: String
- `service.titleTransform`: String
- `service.priceFontFamily`: String
- `service.priceFontStyle`: String
- `service.hairlineWidth`: Number
- `service.hairlineColor`: String
- `service.boxShadowColor`: String
- `service.boxShadowOffsetX`: Number
- `service.boxShadowOffsetY`: Number
- `service.boxShadowBlurRadius`: Number
- `service.boxShadowSpreadRadius`: Number
- `service.chipBackground`: String
- `service.chipBorderColor`: String
- `service.chipTextColor`: String
- `service.hideContactInfo`: Boolean
- `blogpost.title`: String, default "right"
- `blogpost.gallery`: String, default "left"
- `blogpost.galleryType`: String, default "gallery"
- `blogpost.description`: String, default "right"
- `blogpost.comments`: Boolean, default true
- `blogpost.cardDesign`: String, default "item-card-design-1"
- `blogpost.likes`: Boolean, default true
- `blogpost.titleColor`: String
- `blogpost.descriptionColor`: String
- `blogpost.borderRadius`: String
- `blogpost.titleFontSize`: String
- `blogpost.descriptionFontSize`: String
- `blogpost.titleFontWeight`: String
- `blogpost.descriptionFontWeight`: String
- `blogpost.cardBorderRadius`: String
- `blogpost.cardBorderWidth`: String
- `blogpost.cardBorderColor`: String
- `blogpost.cardBackgroundColor`: String
- `blogpost.imageAspectRatio`: String
- `blogpost.customCss`: String
- `blogpost.scroll_next`: Boolean, default false
- `blogpost.galleryPosition`: String, default "bottom"
- `blogpost.contactInfo`: Boolean, default true
- `blogpost.bodyFontSize`: String
- `blogpost.bodyFontWeight`: String
- `blogpost.bodyColor`: String
- `blogpost.skin`: String
- `blogpost.mode`: String
- `blogpost.accentColor`: String
- `blogpost.fieldBackground`: String
- `blogpost.imageRadius`: Number
- `blogpost.buttonRadius`: Number
- `blogpost.titleFontFamily`: String
- `blogpost.titleTransform`: String
- `blogpost.hairlineWidth`: Number
- `blogpost.hairlineColor`: String
- `blogpost.boxShadowColor`: String
- `blogpost.boxShadowOffsetX`: Number
- `blogpost.boxShadowOffsetY`: Number
- `blogpost.boxShadowBlurRadius`: Number
- `blogpost.boxShadowSpreadRadius`: Number
- `blogpost.chipBackground`: String
- `blogpost.chipBorderColor`: String
- `blogpost.chipTextColor`: String
- `blogpost.showDate`: Boolean, default false
- `blogpost.dateColor`: String
- `blogpost.dateFontSize`: Number
- `blogpost.dateFontWeight`: String
- `blogpost.dateFontFamily`: String
- `blogpost.dateFontStyle`: String
- `products.gridStyle`: String, default "column"
- `products.align`: String, default "left"
- `products.title`: String, default "bottom"
- `products.image`: String, default "right"
- `products.filters`: String, default "left"
- `products.description`: Boolean, default false
- `products.transparent`: Boolean, default false
- `products.price`: Boolean, default true
- `products.showFilters`: Boolean, default true
- `products.showBanner`: Boolean, default true
- `products.animation`: String, default "none"
- `products.animationDuration`: Number, default 0
- `products.animationDelay`: Number, default 0
- `products.titleColor`: String
- `products.priceColor`: String
- `products.descriptionColor`: String
- `products.borderRadius`: String
- `products.titleFontSize`: String
- `products.descriptionFontSize`: String
- `products.priceFontSize`: String
- `products.titleFontWeight`: String
- `products.descriptionFontWeight`: String
- `products.priceFontWeight`: String
- `products.cardBorderRadius`: String
- `products.cardBorderWidth`: String
- `products.cardBorderColor`: String
- `products.cardBackgroundColor`: String
- `products.imageAspectRatio`: String
- `products.customCss`: String
- `products.filtersBackgroundColor`: String
- `products.filtersTextColor`: String
- `products.filtersBorderRadius`: String
- `products.filtersCardDesign`: String, default "default"
- `products.boxShadowColor`: String
- `products.boxShadowOffsetX`: Number, default 0
- `products.boxShadowOffsetY`: Number, default 0
- `products.boxShadowBlurRadius`: String
- `products.boxShadowSpreadRadius`: String
- `products.hideOriginAddress`: Boolean, default false
- `products.categories.layout`: String, one of list | columns, default "list"
- `products.categories.showHeading`: Boolean, default true
- `products.categories.showSubtitle`: Boolean, default true
- `products.categories.showImage`: Boolean, default false
- `products.categories.imageSize`: String, default "50px"
- `products.categories.imageRadius`: String
- `products.categories.imageAspectRatio`: String, default "1/1"
- `products.categories.imageFit`: String, one of cover | contain, default "cover"
- `products.categories.imagePadding`: Number, default 0
- `products.categories.fallback`: String, one of initial | color | none, default "initial"
- `products.categories.showChevron`: Boolean, default true
- `products.categories.titleColor`: String
- `products.categories.titleFontSize`: String
- `products.categories.titleFontWeight`: String
- `products.categories.cardBackgroundColor`: String
- `products.categories.cardBorderRadius`: String
- `products.categories.cardBorderWidth`: String
- `products.categories.cardBorderColor`: String
- `products.categories.customCss`: String
- `products.categories.site.showImage`: Boolean, default true
- `products.categories.site.imageSize`: String
- `products.categories.site.imageAspectRatio`: String
- `products.categories.site.titleColor`: String
- `products.categories.site.titleFontSize`: String
- `products.categories.site.titleFontWeight`: String
- `products.categories.site.cardBackgroundColor`: String
- `products.categories.site.cardBorderRadius`: String
- `products.categories.site.cardBorderWidth`: String
- `products.categories.site.cardBorderColor`: String
- `products.categories.site.cardPadding`: String
- `products.categories.site.gap`: String
- `products.categories.site.align`: String, one of left | center | right
- `products.categories.site.titleTransform`: String, one of uppercase | lowercase | capitalize
- `products.hideRibbon`: Boolean, default false
- `products.hideCustomFields`: Boolean, default false
- `products.showLink`: Boolean, default false
- `products.linkLabel`: String
- `products.imageObjectFit`: String
- `products.imageRadius`: Number
- `products.cardPaddingX`: Number
- `products.cardPaddingY`: Number
- `products.titleTransform`: String
- `products.priceFontStyle`: String
- `products.fieldBackground`: String
- `products.showRating`: Boolean
- `products.gap`: Number
- `products.titleFontFamily`: String
- `products.priceFontFamily`: String
- `products.mode`: String
- `products.hairlineWidth`: Number
- `products.hairlineColor`: String
- `products.scrimGradient`: String
- `products.skin`: String
- `products.columns`: Number
- `products.columnsMobile`: Number
- `products.accentColor`: String
- `products.filtersSkin`: String
- `products.filtersAccentColor`: String
- `products.filtersHeadingFontFamily`: String
- `products.filtersHeadingTransform`: String
- `products.filtersBorderWidth`: Number
- `products.filtersBorderColor`: String
- `products.filtersPanelBackground`: String
- `products.filtersBoxShadowColor`: String
- `products.filtersBoxShadowOffsetX`: Number
- `products.filtersBoxShadowOffsetY`: Number
- `products.filtersBoxShadowBlurRadius`: Number
- `products.filtersBoxShadowSpreadRadius`: Number
- `products.showViews`: Boolean, default false
- `products.viewsColor`: String
- `services.gridStyle`: String, default "column"
- `services.align`: String, default "left"
- `services.title`: String, default "bottom"
- `services.image`: String, default "right"
- `services.filters`: String, default "left"
- `services.description`: Boolean, default false
- `services.transparent`: Boolean, default false
- `services.price`: Boolean, default true
- `services.showFilters`: Boolean, default true
- `services.showCategoryFilters`: Boolean, default true
- `services.showBanner`: Boolean, default true
- `services.animation`: String, default "none"
- `services.animationDuration`: Number, default 0
- `services.animationDelay`: Number, default 0
- `services.rating`: Boolean, default false
- `services.titleColor`: String
- `services.priceColor`: String
- `services.descriptionColor`: String
- `services.borderRadius`: String
- `services.titleFontSize`: String
- `services.descriptionFontSize`: String
- `services.priceFontSize`: String
- `services.titleFontWeight`: String
- `services.descriptionFontWeight`: String
- `services.priceFontWeight`: String
- `services.cardBorderRadius`: String
- `services.cardBorderWidth`: String
- `services.cardBorderColor`: String
- `services.cardBackgroundColor`: String
- `services.imageAspectRatio`: String
- `services.customCss`: String
- `services.filtersBackgroundColor`: String
- `services.filtersTextColor`: String
- `services.filtersBorderRadius`: String
- `services.boxShadowColor`: String
- `services.boxShadowOffsetX`: Number, default 0
- `services.boxShadowOffsetY`: Number, default 0
- `services.boxShadowBlurRadius`: String
- `services.boxShadowSpreadRadius`: String
- `services.showBreadCrumbs`: Boolean, default true
- `services.imagePadding`: Number, default 0
- `services.categories.layout`: String, one of list | columns, default "list"
- `services.categories.showHeading`: Boolean, default true
- `services.categories.showSubtitle`: Boolean, default true
- `services.categories.showImage`: Boolean, default false
- `services.categories.imageSize`: String, default "50px"
- `services.categories.imageRadius`: String
- `services.categories.imageAspectRatio`: String, default "1/1"
- `services.categories.imageFit`: String, one of cover | contain, default "cover"
- `services.categories.imagePadding`: Number, default 0
- `services.categories.fallback`: String, one of initial | color | none, default "initial"
- `services.categories.showChevron`: Boolean, default true
- `services.categories.titleColor`: String
- `services.categories.titleFontSize`: String
- `services.categories.titleFontWeight`: String
- `services.categories.cardBackgroundColor`: String
- `services.categories.cardBorderRadius`: String
- `services.categories.cardBorderWidth`: String
- `services.categories.cardBorderColor`: String
- `services.categories.customCss`: String
- `services.categories.site.showImage`: Boolean, default true
- `services.categories.site.imageSize`: String
- `services.categories.site.imageAspectRatio`: String
- `services.categories.site.titleColor`: String
- `services.categories.site.titleFontSize`: String
- `services.categories.site.titleFontWeight`: String
- `services.categories.site.cardBackgroundColor`: String
- `services.categories.site.cardBorderRadius`: String
- `services.categories.site.cardBorderWidth`: String
- `services.categories.site.cardBorderColor`: String
- `services.categories.site.cardPadding`: String
- `services.categories.site.gap`: String
- `services.categories.site.align`: String, one of left | center | right
- `services.categories.site.titleTransform`: String, one of uppercase | lowercase | capitalize
- `services.titleTransform`: String
- `services.priceFontStyle`: String
- `services.cardPaddingX`: Number
- `services.cardPaddingY`: Number
- `services.fieldBackground`: String
- `services.imageObjectFit`: String
- `services.imageRadius`: Number
- `services.accentColor`: String
- `services.gap`: Number
- `services.hideCustomFields`: Boolean, default false
- `services.showDuration`: Boolean, default false
- `services.durationLabel`: String
- `services.showLink`: Boolean, default false
- `services.linkLabel`: String
- `services.titleFontFamily`: String
- `services.priceFontFamily`: String
- `services.columns`: Number
- `services.columnsMobile`: Number
- `services.skin`: String
- `services.mode`: String
- `services.hairlineWidth`: Number
- `services.hairlineColor`: String
- `services.scrimGradient`: String
- `services.filtersSkin`: String
- `services.filtersAccentColor`: String
- `services.filtersHeadingFontFamily`: String
- `services.filtersHeadingTransform`: String
- `services.filtersBorderWidth`: Number
- `services.filtersBorderColor`: String
- `services.filtersPanelBackground`: String
- `services.filtersBoxShadowColor`: String
- `services.filtersBoxShadowOffsetX`: Number
- `services.filtersBoxShadowOffsetY`: Number
- `services.filtersBoxShadowBlurRadius`: Number
- `services.filtersBoxShadowSpreadRadius`: Number
- `services.hideCalendarDuration`: Boolean, default false
- `services.calendar`: Boolean
- `services.rowRuleWidth`: Number
- `services.rowRuleColor`: String
- `services.maxWidth`: Number
- `services.showViews`: Boolean, default false
- `services.viewsColor`: String
- `blogposts.gridStyle`: String, default "row"
- `blogposts.align`: String, default "left"
- `blogposts.title`: String, default "bottom"
- `blogposts.image`: String, default "right"
- `blogposts.filters`: String, default "left"
- `blogposts.description`: Boolean, default false
- `blogposts.showFilters`: Boolean, default true
- `blogposts.header`: Boolean, default true
- `blogposts.showBanner`: Boolean, default true
- `blogposts.animation`: String, default "none"
- `blogposts.animationDuration`: Number, default 0
- `blogposts.animationDelay`: Number, default 0
- `blogposts.titleColor`: String
- `blogposts.descriptionColor`: String
- `blogposts.borderRadius`: String
- `blogposts.titleFontSize`: String
- `blogposts.descriptionFontSize`: String
- `blogposts.titleFontWeight`: String
- `blogposts.descriptionFontWeight`: String
- `blogposts.cardBorderRadius`: String
- `blogposts.cardBorderWidth`: String
- `blogposts.cardBorderColor`: String
- `blogposts.cardBackgroundColor`: String
- `blogposts.imageAspectRatio`: String
- `blogposts.customCss`: String
- `blogposts.sort`: Number, default -1
- `blogposts.showBreadCrumbs`: Boolean, default true
- `blogposts.filtersBackgroundColor`: String
- `blogposts.filtersTextColor`: String
- `blogposts.filtersBorderRadius`: String
- `blogposts.boxShadowColor`: String
- `blogposts.boxShadowOffsetX`: Number, default 0
- `blogposts.boxShadowOffsetY`: Number, default 0
- `blogposts.boxShadowBlurRadius`: String
- `blogposts.boxShadowSpreadRadius`: String
- `blogposts.imagePadding`: Number, default 0
- `blogposts.categories.layout`: String, one of list | columns, default "list"
- `blogposts.categories.showHeading`: Boolean, default true
- `blogposts.categories.showSubtitle`: Boolean, default true
- `blogposts.categories.showImage`: Boolean, default false
- `blogposts.categories.imageSize`: String, default "50px"
- `blogposts.categories.imageRadius`: String
- `blogposts.categories.imageAspectRatio`: String, default "1/1"
- `blogposts.categories.imageFit`: String, one of cover | contain, default "cover"
- `blogposts.categories.imagePadding`: Number, default 0
- `blogposts.categories.fallback`: String, one of initial | color | none, default "initial"
- `blogposts.categories.showChevron`: Boolean, default true
- `blogposts.categories.titleColor`: String
- `blogposts.categories.titleFontSize`: String
- `blogposts.categories.titleFontWeight`: String
- `blogposts.categories.cardBackgroundColor`: String
- `blogposts.categories.cardBorderRadius`: String
- `blogposts.categories.cardBorderWidth`: String
- `blogposts.categories.cardBorderColor`: String
- `blogposts.categories.customCss`: String
- `blogposts.categories.site.showImage`: Boolean, default true
- `blogposts.categories.site.imageSize`: String
- `blogposts.categories.site.imageAspectRatio`: String
- `blogposts.categories.site.titleColor`: String
- `blogposts.categories.site.titleFontSize`: String
- `blogposts.categories.site.titleFontWeight`: String
- `blogposts.categories.site.cardBackgroundColor`: String
- `blogposts.categories.site.cardBorderRadius`: String
- `blogposts.categories.site.cardBorderWidth`: String
- `blogposts.categories.site.cardBorderColor`: String
- `blogposts.categories.site.cardPadding`: String
- `blogposts.categories.site.gap`: String
- `blogposts.categories.site.align`: String, one of left | center | right
- `blogposts.categories.site.titleTransform`: String, one of uppercase | lowercase | capitalize
- `blogposts.titleTransform`: String
- `blogposts.cardPaddingX`: Number
- `blogposts.cardPaddingY`: Number
- `blogposts.fieldBackground`: String
- `blogposts.imageObjectFit`: String
- `blogposts.imageRadius`: Number
- `blogposts.accentColor`: String
- `blogposts.gap`: Number
- `blogposts.hideCustomFields`: Boolean, default false
- `blogposts.hideImage`: Boolean, default false
- `blogposts.showDate`: Boolean, default false
- `blogposts.dateColor`: String
- `blogposts.dateFontSize`: String
- `blogposts.dateFontWeight`: String
- `blogposts.dateFontFamily`: String
- `blogposts.dateFontStyle`: String
- `blogposts.hideLink`: Boolean, default false
- `blogposts.linkLabel`: String
- `blogposts.titleFontFamily`: String
- `blogposts.columns`: Number
- `blogposts.columnsMobile`: Number
- `blogposts.skin`: String
- `blogposts.mode`: String
- `blogposts.hairlineWidth`: Number
- `blogposts.hairlineColor`: String
- `blogposts.scrimGradient`: String
- `blogposts.filtersSkin`: String
- `blogposts.filtersAccentColor`: String
- `blogposts.filtersHeadingFontFamily`: String
- `blogposts.filtersHeadingTransform`: String
- `blogposts.filtersBorderWidth`: Number
- `blogposts.filtersBorderColor`: String
- `blogposts.filtersPanelBackground`: String
- `blogposts.filtersBoxShadowColor`: String
- `blogposts.filtersBoxShadowOffsetX`: Number
- `blogposts.filtersBoxShadowOffsetY`: Number
- `blogposts.filtersBoxShadowBlurRadius`: Number
- `blogposts.filtersBoxShadowSpreadRadius`: Number
- `blogposts.rowRuleWidth`: Number
- `blogposts.rowRuleColor`: String
- `blogposts.maxWidth`: Number
- `blogposts.hideCategory`: Boolean, default false
- `blogposts.showViews`: Boolean, default false
- `blogposts.viewsColor`: String
- `videos.gridStyle`: String, default "column"
- `videos.align`: String, default "center"
- `videos.title`: String, default "bottom"
- `videos.video`: String, default "right"
- `videos.filters`: String, default "left"
- `videos.showTitle`: Boolean, default true
- `videos.showFilters`: Boolean, default true
- `videos.showBanner`: Boolean, default true
- `videos.animation`: String, default "none"
- `videos.animationDuration`: Number, default 0
- `videos.animationDelay`: Number, default 0
- `videos.showBreadCrumbs`: Boolean, default true
- `program.cardDesign`: String, default "item-card-design-1"
- `program.comments`: Boolean, default true
- `program.likes`: Boolean, default true
- `program.rating`: Boolean, default false
- `program.titleColor`: String
- `program.descriptionColor`: String
- `program.borderRadius`: String
- `program.titleFontSize`: String
- `program.descriptionFontSize`: String
- `program.titleFontWeight`: String
- `program.descriptionFontWeight`: String
- `program.cardBorderRadius`: String
- `program.cardBorderWidth`: String
- `program.cardBorderColor`: String
- `program.cardBackgroundColor`: String
- `program.imageAspectRatio`: String
- `program.ratingList`: Boolean, default false
- `program.customCss`: String
- `program.showBreadCrumbs`: Boolean, default true
- `professional_account.cardDesign`: String, default "professional-account-design-1"
- `professional_account.likes`: Boolean, default true
- `professional_account.titleColor`: String
- `professional_account.priceColor`: String
- `professional_account.descriptionColor`: String
- `professional_account.borderRadius`: String
- `professional_account.titleFontSize`: String
- `professional_account.descriptionFontSize`: String
- `professional_account.priceFontSize`: String
- `professional_account.titleFontWeight`: String
- `professional_account.descriptionFontWeight`: String
- `professional_account.priceFontWeight`: String
- `professional_account.cardBorderRadius`: String
- `professional_account.cardBorderWidth`: String
- `professional_account.cardBorderColor`: String
- `professional_account.cardBackgroundColor`: String
- `professional_account.imageAspectRatio`: String
- `professional_account.ratingList`: Boolean, default false
- `professional_account.customCss`: String
- `personal_account.cardDesign`: String, default "account-design-1"
- `footer.columns`: Object[]
  - `type`: String, default "contacts"
  - `title`: String, default "Give us a call"
  - `title_href`: String, default "contacts"
  - `custom_text`: String, default "<p><a href=\"tel: +359 123321321\">tel: +359 123321321</a></p>"
  - `social_medias`: Mixed[]
  - `medias`: Object[]
    - `media`: String
    - `vimeo_uri`: String
    - `vimeo_picture`: String
    - `vimeo_url`: String
    - `youtube_url`: String
    - `_id`: ObjectId
  - `_id`: ObjectId
- `footer.about_page`: ObjectId, → AboutPage
- `footer.customCss`: String
- `header.twoRows`: Boolean, default false
- `header.sidenav`: Boolean, default false
- `header.sticky`: Boolean, default true
- `header.justifyLinks`: String, default "end"
- `header.justifyLinksMobile`: String
- `header.linkFontSize`: String, default "1.0rem"
- `header.linkFontWeight`: String, default "400"
- `header.linkFontFamily`: String
- `header.linkTextTransform`: String
- `header.linkLetterSpacing`: String
- `header.barBorderWidth`: Number
- `header.barBorderColor`: String
- `header.barFloating`: Boolean, default false
- `header.barBorderRadius`: Number
- `header.barShadow`: String
- `header.logoSize`: String, default "140px"
- `header.logoSizeMobile`: String
- `header.row1Height`: String
- `header.row2Height`: String
- `header.bannerHeight`: String
- `header.contentMaxWidth`: String
- `header.justifyLogo`: String, default "start"
- `header.userAndCartPosition`: String, default "top"
- `header.linkMargin`: String, default "0px"
- `header.about_page`: ObjectId, → AboutPage
- `header.about_page_position`: String
- `header.showSearch`: Boolean, default true
- `header.smartSearch.enabled`: Boolean, default false
- `header.smartSearch.placeholder`: String, default ""
- `header.smartSearch.kinds`: String[]
- `header.smartSearch.collections`: String[]
- `header.smartSearch.items`: Object[]
  - `kind`: String
  - `ref_id`: String
  - `title`: String
- `header.smartSearch.showKindFilter`: Boolean, default true
- `header.smartSearch.showPriceFilter`: Boolean, default false
- `header.smartSearch.showDateFilter`: Boolean, default false
- `header.smartSearch.showSort`: Boolean, default true
- `header.smartSearch.dateMode`: String, one of created | updated | availability, default "created"
- `header.smartSearch.layout`: String, one of grid | list, default "grid"
- `header.smartSearch.columns`: Number, default 3
- `header.smartSearch.perPage`: Number, default 12
- `header.smartSearch.instant`: Boolean, default true
- `header.smartSearch.showImages`: Boolean, default true
- `header.smartSearch.showPrices`: Boolean, default true
- `header.smartSearch.showInitial`: Boolean, default false
- `header.smartSearch.showAnswer`: Boolean, default false
- `header.showLogIn`: Boolean, default true
- `header.showActionButton`: Boolean, default false
- `header.actionButton.title`: String
- `header.actionButton.url`: String
- `header.actionButton.fill`: String
- `header.actionButton.color`: String
- `header.actionButton.class`: String, default "btn btn-primary"
- `header.actionButton.customColor`: String
- `header.actionButton.textColor`: String
- `header.actionButton.fontSize`: Number
- `header.actionButton.borderRadius`: String
- `header.actionButton.position`: String
- `header.showCart`: Boolean, default true
- `header.cart_position`: String
- `header.login_position`: String
- `header.search_position`: String
- `header.login_icon`: Boolean, default false
- `header.login_icon_only`: Boolean, default false
- `header.login_icon_class`: String
- `header.login_in_app`: Boolean, default false
- `header.cart_row`: String
- `header.login_row`: String
- `header.search_row`: String
- `header.pinned_links`: Object[]
  - `title`: String, required
  - `link`: String, required
  - `icon`: String, required
  - `_id`: ObjectId
- `header.customCss`: String
- `header.logoPosition`: String, default "top"
- `header.firstrow_links`: Object[]
  - `title`: String
  - `link`: String
  - `icon`: String
  - `_id`: ObjectId
- `header.firstrow_links_justify`: String, default "start"
- `header.firstrow_links_spread`: String
- `header.showBanner`: Boolean, default false
- `header.banner.items`: Object[]
  - `title`: String
  - `link`: String
  - `icon`: String
  - `img`: ObjectId, → Media
  - `_id`: ObjectId
- `header.banner.fontSize`: String, default "1.0rem"
- `header.banner.fontWeight`: String, default "400"
- `header.banner.textColor`: String
- `header.banner.backgroundColor`: String
- `header.banner.justifyContent`: String, default "start"
- `header.banner.motion`: String, one of  | scroll | rotate, default ""
- `header.banner.speed`: String, one of  | slow | fast, default ""
- `header.banner.speedLevel`: Number
- `header.banner.animation`: String, one of  | flip | zoom | spring, default ""
- `header.banner.direction`: String, one of  | right, default ""
- `header.banner.repeat`: Boolean, default false
- `header.banner.iconGap`: Number
- `header.banner.itemGap`: Number
- `header.isFullWidth`: Boolean, default true
- `header.app_user_position`: String, one of top | bottom, default "bottom"
- `header.logoMediaMobile`: ObjectId, → Media
- `header.sidenavIconBorderRadius`: String
- `header.sidenavIconBorderWidth`: String
- `header.sidenavIconColor`: String
- `header.sidenavIcon`: String
- `header.sidenavIconSize`: String
- `header.sidenavIconMedia`: ObjectId, → Media
- `header.menuIconPosition`: String
- `header.logoPositionMobile`: String
- `header.search_position_mobile`: String
- `header.login_position_mobile`: String
- `header.cart_position_mobile`: String
- `header.button_position_mobile`: String
- `header.sidenavIconAnimation`: String
- `header.sidenavIconClose`: String
- `header.sidenavIconMediaClose`: ObjectId, → Media
- `header.elements_order.logo.value`: Number
- `header.elements_order.logo.mobile_value`: Number
- `header.elements_order.nav.value`: Number
- `header.elements_order.nav.mobile_value`: Number
- `header.elements_order.firstrow.value`: Number
- `header.elements_order.firstrow.mobile_value`: Number
- `header.elements_order.search.value`: Number
- `header.elements_order.search.mobile_value`: Number
- `header.elements_order.login.value`: Number
- `header.elements_order.login.mobile_value`: Number
- `header.elements_order.cart.value`: Number
- `header.elements_order.cart.mobile_value`: Number
- `header.elements_order.button.value`: Number
- `header.elements_order.button.mobile_value`: Number
- `header.elements_order.menuicon.value`: Number
- `header.elements_order.menuicon.mobile_value`: Number
- `header.elements_style.nav.background`: String
- `header.elements_style.nav.color`: String
- `header.elements_style.nav.border_color`: String
- `header.elements_style.nav.border_width`: Number
- `header.elements_style.nav.border_radius`: Number
- `header.elements_style.nav.font_size`: Number
- `header.elements_style.nav.border_top_width`: Number
- `header.elements_style.nav.border_right_width`: Number
- `header.elements_style.nav.border_bottom_width`: Number
- `header.elements_style.nav.border_left_width`: Number
- `header.elements_style.nav_active.background`: String
- `header.elements_style.nav_active.color`: String
- `header.elements_style.nav_active.border_color`: String
- `header.elements_style.nav_active.border_width`: Number
- `header.elements_style.nav_active.border_radius`: Number
- `header.elements_style.nav_active.font_size`: Number
- `header.elements_style.nav_active.border_top_width`: Number
- `header.elements_style.nav_active.border_right_width`: Number
- `header.elements_style.nav_active.border_bottom_width`: Number
- `header.elements_style.nav_active.border_left_width`: Number
- `header.elements_style.firstrow.background`: String
- `header.elements_style.firstrow.color`: String
- `header.elements_style.firstrow.border_color`: String
- `header.elements_style.firstrow.border_width`: Number
- `header.elements_style.firstrow.border_radius`: Number
- `header.elements_style.firstrow.font_size`: Number
- `header.elements_style.firstrow.border_top_width`: Number
- `header.elements_style.firstrow.border_right_width`: Number
- `header.elements_style.firstrow.border_bottom_width`: Number
- `header.elements_style.firstrow.border_left_width`: Number
- `header.elements_style.search.background`: String
- `header.elements_style.search.color`: String
- `header.elements_style.search.border_color`: String
- `header.elements_style.search.border_width`: Number
- `header.elements_style.search.border_radius`: Number
- `header.elements_style.search.font_size`: Number
- `header.elements_style.search.border_top_width`: Number
- `header.elements_style.search.border_right_width`: Number
- `header.elements_style.search.border_bottom_width`: Number
- `header.elements_style.search.border_left_width`: Number
- `header.elements_style.login.background`: String
- `header.elements_style.login.color`: String
- `header.elements_style.login.border_color`: String
- `header.elements_style.login.border_width`: Number
- `header.elements_style.login.border_radius`: Number
- `header.elements_style.login.font_size`: Number
- `header.elements_style.login.border_top_width`: Number
- `header.elements_style.login.border_right_width`: Number
- `header.elements_style.login.border_bottom_width`: Number
- `header.elements_style.login.border_left_width`: Number
- `header.elements_style.cart.background`: String
- `header.elements_style.cart.color`: String
- `header.elements_style.cart.border_color`: String
- `header.elements_style.cart.border_width`: Number
- `header.elements_style.cart.border_radius`: Number
- `header.elements_style.cart.font_size`: Number
- `header.elements_style.cart.border_top_width`: Number
- `header.elements_style.cart.border_right_width`: Number
- `header.elements_style.cart.border_bottom_width`: Number
- `header.elements_style.cart.border_left_width`: Number
- `header.elements_spacing.logo.margin_top`: Number
- `header.elements_spacing.logo.margin_top_unit`: String
- `header.elements_spacing.logo.mobile_margin_top`: Number
- `header.elements_spacing.logo.mobile_margin_top_unit`: String
- `header.elements_spacing.logo.margin_right`: Number
- `header.elements_spacing.logo.margin_right_unit`: String
- `header.elements_spacing.logo.mobile_margin_right`: Number
- `header.elements_spacing.logo.mobile_margin_right_unit`: String
- `header.elements_spacing.logo.margin_bottom`: Number
- `header.elements_spacing.logo.margin_bottom_unit`: String
- `header.elements_spacing.logo.mobile_margin_bottom`: Number
- `header.elements_spacing.logo.mobile_margin_bottom_unit`: String
- `header.elements_spacing.logo.margin_left`: Number
- `header.elements_spacing.logo.margin_left_unit`: String
- `header.elements_spacing.logo.mobile_margin_left`: Number
- `header.elements_spacing.logo.mobile_margin_left_unit`: String
- `header.elements_spacing.nav.margin_top`: Number
- `header.elements_spacing.nav.margin_top_unit`: String
- `header.elements_spacing.nav.mobile_margin_top`: Number
- `header.elements_spacing.nav.mobile_margin_top_unit`: String
- `header.elements_spacing.nav.padding_top`: Number
- `header.elements_spacing.nav.padding_top_unit`: String
- `header.elements_spacing.nav.mobile_padding_top`: Number
- `header.elements_spacing.nav.mobile_padding_top_unit`: String
- `header.elements_spacing.nav.margin_right`: Number
- `header.elements_spacing.nav.margin_right_unit`: String
- `header.elements_spacing.nav.mobile_margin_right`: Number
- `header.elements_spacing.nav.mobile_margin_right_unit`: String
- `header.elements_spacing.nav.padding_right`: Number
- `header.elements_spacing.nav.padding_right_unit`: String
- `header.elements_spacing.nav.mobile_padding_right`: Number
- `header.elements_spacing.nav.mobile_padding_right_unit`: String
- `header.elements_spacing.nav.margin_bottom`: Number
- `header.elements_spacing.nav.margin_bottom_unit`: String
- `header.elements_spacing.nav.mobile_margin_bottom`: Number
- `header.elements_spacing.nav.mobile_margin_bottom_unit`: String
- `header.elements_spacing.nav.padding_bottom`: Number
- `header.elements_spacing.nav.padding_bottom_unit`: String
- `header.elements_spacing.nav.mobile_padding_bottom`: Number
- `header.elements_spacing.nav.mobile_padding_bottom_unit`: String
- `header.elements_spacing.nav.margin_left`: Number
- `header.elements_spacing.nav.margin_left_unit`: String
- `header.elements_spacing.nav.mobile_margin_left`: Number
- `header.elements_spacing.nav.mobile_margin_left_unit`: String
- `header.elements_spacing.nav.padding_left`: Number
- `header.elements_spacing.nav.padding_left_unit`: String
- `header.elements_spacing.nav.mobile_padding_left`: Number
- `header.elements_spacing.nav.mobile_padding_left_unit`: String
- `header.elements_spacing.firstrow.margin_top`: Number
- `header.elements_spacing.firstrow.margin_top_unit`: String
- `header.elements_spacing.firstrow.mobile_margin_top`: Number
- `header.elements_spacing.firstrow.mobile_margin_top_unit`: String
- `header.elements_spacing.firstrow.padding_top`: Number
- `header.elements_spacing.firstrow.padding_top_unit`: String
- `header.elements_spacing.firstrow.mobile_padding_top`: Number
- `header.elements_spacing.firstrow.mobile_padding_top_unit`: String
- `header.elements_spacing.firstrow.margin_right`: Number
- `header.elements_spacing.firstrow.margin_right_unit`: String
- `header.elements_spacing.firstrow.mobile_margin_right`: Number
- `header.elements_spacing.firstrow.mobile_margin_right_unit`: String
- `header.elements_spacing.firstrow.padding_right`: Number
- `header.elements_spacing.firstrow.padding_right_unit`: String
- `header.elements_spacing.firstrow.mobile_padding_right`: Number
- `header.elements_spacing.firstrow.mobile_padding_right_unit`: String
- `header.elements_spacing.firstrow.margin_bottom`: Number
- `header.elements_spacing.firstrow.margin_bottom_unit`: String
- `header.elements_spacing.firstrow.mobile_margin_bottom`: Number
- `header.elements_spacing.firstrow.mobile_margin_bottom_unit`: String
- `header.elements_spacing.firstrow.padding_bottom`: Number
- `header.elements_spacing.firstrow.padding_bottom_unit`: String
- `header.elements_spacing.firstrow.mobile_padding_bottom`: Number
- `header.elements_spacing.firstrow.mobile_padding_bottom_unit`: String
- `header.elements_spacing.firstrow.margin_left`: Number
- `header.elements_spacing.firstrow.margin_left_unit`: String
- `header.elements_spacing.firstrow.mobile_margin_left`: Number
- `header.elements_spacing.firstrow.mobile_margin_left_unit`: String
- `header.elements_spacing.firstrow.padding_left`: Number
- `header.elements_spacing.firstrow.padding_left_unit`: String
- `header.elements_spacing.firstrow.mobile_padding_left`: Number
- `header.elements_spacing.firstrow.mobile_padding_left_unit`: String
- `header.elements_spacing.search.margin_top`: Number
- `header.elements_spacing.search.margin_top_unit`: String
- `header.elements_spacing.search.mobile_margin_top`: Number
- `header.elements_spacing.search.mobile_margin_top_unit`: String
- `header.elements_spacing.search.padding_top`: Number
- `header.elements_spacing.search.padding_top_unit`: String
- `header.elements_spacing.search.mobile_padding_top`: Number
- `header.elements_spacing.search.mobile_padding_top_unit`: String
- `header.elements_spacing.search.margin_right`: Number
- `header.elements_spacing.search.margin_right_unit`: String
- `header.elements_spacing.search.mobile_margin_right`: Number
- `header.elements_spacing.search.mobile_margin_right_unit`: String
- `header.elements_spacing.search.padding_right`: Number
- `header.elements_spacing.search.padding_right_unit`: String
- `header.elements_spacing.search.mobile_padding_right`: Number
- `header.elements_spacing.search.mobile_padding_right_unit`: String
- `header.elements_spacing.search.margin_bottom`: Number
- `header.elements_spacing.search.margin_bottom_unit`: String
- `header.elements_spacing.search.mobile_margin_bottom`: Number
- `header.elements_spacing.search.mobile_margin_bottom_unit`: String
- `header.elements_spacing.search.padding_bottom`: Number
- `header.elements_spacing.search.padding_bottom_unit`: String
- `header.elements_spacing.search.mobile_padding_bottom`: Number
- `header.elements_spacing.search.mobile_padding_bottom_unit`: String
- `header.elements_spacing.search.margin_left`: Number
- `header.elements_spacing.search.margin_left_unit`: String
- `header.elements_spacing.search.mobile_margin_left`: Number
- `header.elements_spacing.search.mobile_margin_left_unit`: String
- `header.elements_spacing.search.padding_left`: Number
- `header.elements_spacing.search.padding_left_unit`: String
- `header.elements_spacing.search.mobile_padding_left`: Number
- `header.elements_spacing.search.mobile_padding_left_unit`: String
- `header.elements_spacing.login.margin_top`: Number
- `header.elements_spacing.login.margin_top_unit`: String
- `header.elements_spacing.login.mobile_margin_top`: Number
- `header.elements_spacing.login.mobile_margin_top_unit`: String
- `header.elements_spacing.login.padding_top`: Number
- `header.elements_spacing.login.padding_top_unit`: String
- `header.elements_spacing.login.mobile_padding_top`: Number
- `header.elements_spacing.login.mobile_padding_top_unit`: String
- `header.elements_spacing.login.margin_right`: Number
- `header.elements_spacing.login.margin_right_unit`: String
- `header.elements_spacing.login.mobile_margin_right`: Number
- `header.elements_spacing.login.mobile_margin_right_unit`: String
- `header.elements_spacing.login.padding_right`: Number
- `header.elements_spacing.login.padding_right_unit`: String
- `header.elements_spacing.login.mobile_padding_right`: Number
- `header.elements_spacing.login.mobile_padding_right_unit`: String
- `header.elements_spacing.login.margin_bottom`: Number
- `header.elements_spacing.login.margin_bottom_unit`: String
- `header.elements_spacing.login.mobile_margin_bottom`: Number
- `header.elements_spacing.login.mobile_margin_bottom_unit`: String
- `header.elements_spacing.login.padding_bottom`: Number
- `header.elements_spacing.login.padding_bottom_unit`: String
- `header.elements_spacing.login.mobile_padding_bottom`: Number
- `header.elements_spacing.login.mobile_padding_bottom_unit`: String
- `header.elements_spacing.login.margin_left`: Number
- `header.elements_spacing.login.margin_left_unit`: String
- `header.elements_spacing.login.mobile_margin_left`: Number
- `header.elements_spacing.login.mobile_margin_left_unit`: String
- `header.elements_spacing.login.padding_left`: Number
- `header.elements_spacing.login.padding_left_unit`: String
- `header.elements_spacing.login.mobile_padding_left`: Number
- `header.elements_spacing.login.mobile_padding_left_unit`: String
- `header.elements_spacing.cart.margin_top`: Number
- `header.elements_spacing.cart.margin_top_unit`: String
- `header.elements_spacing.cart.mobile_margin_top`: Number
- `header.elements_spacing.cart.mobile_margin_top_unit`: String
- `header.elements_spacing.cart.padding_top`: Number
- `header.elements_spacing.cart.padding_top_unit`: String
- `header.elements_spacing.cart.mobile_padding_top`: Number
- `header.elements_spacing.cart.mobile_padding_top_unit`: String
- `header.elements_spacing.cart.margin_right`: Number
- `header.elements_spacing.cart.margin_right_unit`: String
- `header.elements_spacing.cart.mobile_margin_right`: Number
- `header.elements_spacing.cart.mobile_margin_right_unit`: String
- `header.elements_spacing.cart.padding_right`: Number
- `header.elements_spacing.cart.padding_right_unit`: String
- `header.elements_spacing.cart.mobile_padding_right`: Number
- `header.elements_spacing.cart.mobile_padding_right_unit`: String
- `header.elements_spacing.cart.margin_bottom`: Number
- `header.elements_spacing.cart.margin_bottom_unit`: String
- `header.elements_spacing.cart.mobile_margin_bottom`: Number
- `header.elements_spacing.cart.mobile_margin_bottom_unit`: String
- `header.elements_spacing.cart.padding_bottom`: Number
- `header.elements_spacing.cart.padding_bottom_unit`: String
- `header.elements_spacing.cart.mobile_padding_bottom`: Number
- `header.elements_spacing.cart.mobile_padding_bottom_unit`: String
- `header.elements_spacing.cart.margin_left`: Number
- `header.elements_spacing.cart.margin_left_unit`: String
- `header.elements_spacing.cart.mobile_margin_left`: Number
- `header.elements_spacing.cart.mobile_margin_left_unit`: String
- `header.elements_spacing.cart.padding_left`: Number
- `header.elements_spacing.cart.padding_left_unit`: String
- `header.elements_spacing.cart.mobile_padding_left`: Number
- `header.elements_spacing.cart.mobile_padding_left_unit`: String
- `header.elements_spacing.button.margin_top`: Number
- `header.elements_spacing.button.margin_top_unit`: String
- `header.elements_spacing.button.mobile_margin_top`: Number
- `header.elements_spacing.button.mobile_margin_top_unit`: String
- `header.elements_spacing.button.padding_top`: Number
- `header.elements_spacing.button.padding_top_unit`: String
- `header.elements_spacing.button.mobile_padding_top`: Number
- `header.elements_spacing.button.mobile_padding_top_unit`: String
- `header.elements_spacing.button.margin_right`: Number
- `header.elements_spacing.button.margin_right_unit`: String
- `header.elements_spacing.button.mobile_margin_right`: Number
- `header.elements_spacing.button.mobile_margin_right_unit`: String
- `header.elements_spacing.button.padding_right`: Number
- `header.elements_spacing.button.padding_right_unit`: String
- `header.elements_spacing.button.mobile_padding_right`: Number
- `header.elements_spacing.button.mobile_padding_right_unit`: String
- `header.elements_spacing.button.margin_bottom`: Number
- `header.elements_spacing.button.margin_bottom_unit`: String
- `header.elements_spacing.button.mobile_margin_bottom`: Number
- `header.elements_spacing.button.mobile_margin_bottom_unit`: String
- `header.elements_spacing.button.padding_bottom`: Number
- `header.elements_spacing.button.padding_bottom_unit`: String
- `header.elements_spacing.button.mobile_padding_bottom`: Number
- `header.elements_spacing.button.mobile_padding_bottom_unit`: String
- `header.elements_spacing.button.margin_left`: Number
- `header.elements_spacing.button.margin_left_unit`: String
- `header.elements_spacing.button.mobile_margin_left`: Number
- `header.elements_spacing.button.mobile_margin_left_unit`: String
- `header.elements_spacing.button.padding_left`: Number
- `header.elements_spacing.button.padding_left_unit`: String
- `header.elements_spacing.button.mobile_padding_left`: Number
- `header.elements_spacing.button.mobile_padding_left_unit`: String
- `header.elements_spacing.menuicon.margin_top`: Number
- `header.elements_spacing.menuicon.margin_top_unit`: String
- `header.elements_spacing.menuicon.mobile_margin_top`: Number
- `header.elements_spacing.menuicon.mobile_margin_top_unit`: String
- `header.elements_spacing.menuicon.padding_top`: Number
- `header.elements_spacing.menuicon.padding_top_unit`: String
- `header.elements_spacing.menuicon.mobile_padding_top`: Number
- `header.elements_spacing.menuicon.mobile_padding_top_unit`: String
- `header.elements_spacing.menuicon.margin_right`: Number
- `header.elements_spacing.menuicon.margin_right_unit`: String
- `header.elements_spacing.menuicon.mobile_margin_right`: Number
- `header.elements_spacing.menuicon.mobile_margin_right_unit`: String
- `header.elements_spacing.menuicon.padding_right`: Number
- `header.elements_spacing.menuicon.padding_right_unit`: String
- `header.elements_spacing.menuicon.mobile_padding_right`: Number
- `header.elements_spacing.menuicon.mobile_padding_right_unit`: String
- `header.elements_spacing.menuicon.margin_bottom`: Number
- `header.elements_spacing.menuicon.margin_bottom_unit`: String
- `header.elements_spacing.menuicon.mobile_margin_bottom`: Number
- `header.elements_spacing.menuicon.mobile_margin_bottom_unit`: String
- `header.elements_spacing.menuicon.padding_bottom`: Number
- `header.elements_spacing.menuicon.padding_bottom_unit`: String
- `header.elements_spacing.menuicon.mobile_padding_bottom`: Number
- `header.elements_spacing.menuicon.mobile_padding_bottom_unit`: String
- `header.elements_spacing.menuicon.margin_left`: Number
- `header.elements_spacing.menuicon.margin_left_unit`: String
- `header.elements_spacing.menuicon.mobile_margin_left`: Number
- `header.elements_spacing.menuicon.mobile_margin_left_unit`: String
- `header.elements_spacing.menuicon.padding_left`: Number
- `header.elements_spacing.menuicon.padding_left_unit`: String
- `header.elements_spacing.menuicon.mobile_padding_left`: Number
- `header.elements_spacing.menuicon.mobile_padding_left_unit`: String
- `header.elements_spacing.row1.margin_top`: Number
- `header.elements_spacing.row1.margin_top_unit`: String
- `header.elements_spacing.row1.mobile_margin_top`: Number
- `header.elements_spacing.row1.mobile_margin_top_unit`: String
- `header.elements_spacing.row1.padding_top`: Number
- `header.elements_spacing.row1.padding_top_unit`: String
- `header.elements_spacing.row1.mobile_padding_top`: Number
- `header.elements_spacing.row1.mobile_padding_top_unit`: String
- `header.elements_spacing.row1.margin_right`: Number
- `header.elements_spacing.row1.margin_right_unit`: String
- `header.elements_spacing.row1.mobile_margin_right`: Number
- `header.elements_spacing.row1.mobile_margin_right_unit`: String
- `header.elements_spacing.row1.padding_right`: Number
- `header.elements_spacing.row1.padding_right_unit`: String
- `header.elements_spacing.row1.mobile_padding_right`: Number
- `header.elements_spacing.row1.mobile_padding_right_unit`: String
- `header.elements_spacing.row1.margin_bottom`: Number
- `header.elements_spacing.row1.margin_bottom_unit`: String
- `header.elements_spacing.row1.mobile_margin_bottom`: Number
- `header.elements_spacing.row1.mobile_margin_bottom_unit`: String
- `header.elements_spacing.row1.padding_bottom`: Number
- `header.elements_spacing.row1.padding_bottom_unit`: String
- `header.elements_spacing.row1.mobile_padding_bottom`: Number
- `header.elements_spacing.row1.mobile_padding_bottom_unit`: String
- `header.elements_spacing.row1.margin_left`: Number
- `header.elements_spacing.row1.margin_left_unit`: String
- `header.elements_spacing.row1.mobile_margin_left`: Number
- `header.elements_spacing.row1.mobile_margin_left_unit`: String
- `header.elements_spacing.row1.padding_left`: Number
- `header.elements_spacing.row1.padding_left_unit`: String
- `header.elements_spacing.row1.mobile_padding_left`: Number
- `header.elements_spacing.row1.mobile_padding_left_unit`: String
- `header.elements_spacing.row2.margin_top`: Number
- `header.elements_spacing.row2.margin_top_unit`: String
- `header.elements_spacing.row2.mobile_margin_top`: Number
- `header.elements_spacing.row2.mobile_margin_top_unit`: String
- `header.elements_spacing.row2.padding_top`: Number
- `header.elements_spacing.row2.padding_top_unit`: String
- `header.elements_spacing.row2.mobile_padding_top`: Number
- `header.elements_spacing.row2.mobile_padding_top_unit`: String
- `header.elements_spacing.row2.margin_right`: Number
- `header.elements_spacing.row2.margin_right_unit`: String
- `header.elements_spacing.row2.mobile_margin_right`: Number
- `header.elements_spacing.row2.mobile_margin_right_unit`: String
- `header.elements_spacing.row2.padding_right`: Number
- `header.elements_spacing.row2.padding_right_unit`: String
- `header.elements_spacing.row2.mobile_padding_right`: Number
- `header.elements_spacing.row2.mobile_padding_right_unit`: String
- `header.elements_spacing.row2.margin_bottom`: Number
- `header.elements_spacing.row2.margin_bottom_unit`: String
- `header.elements_spacing.row2.mobile_margin_bottom`: Number
- `header.elements_spacing.row2.mobile_margin_bottom_unit`: String
- `header.elements_spacing.row2.padding_bottom`: Number
- `header.elements_spacing.row2.padding_bottom_unit`: String
- `header.elements_spacing.row2.mobile_padding_bottom`: Number
- `header.elements_spacing.row2.mobile_padding_bottom_unit`: String
- `header.elements_spacing.row2.margin_left`: Number
- `header.elements_spacing.row2.margin_left_unit`: String
- `header.elements_spacing.row2.mobile_margin_left`: Number
- `header.elements_spacing.row2.mobile_margin_left_unit`: String
- `header.elements_spacing.row2.padding_left`: Number
- `header.elements_spacing.row2.padding_left_unit`: String
- `header.elements_spacing.row2.mobile_padding_left`: Number
- `header.elements_spacing.row2.mobile_padding_left_unit`: String
- `header.elements_spacing.banner.margin_top`: Number
- `header.elements_spacing.banner.margin_top_unit`: String
- `header.elements_spacing.banner.mobile_margin_top`: Number
- `header.elements_spacing.banner.mobile_margin_top_unit`: String
- `header.elements_spacing.banner.padding_top`: Number
- `header.elements_spacing.banner.padding_top_unit`: String
- `header.elements_spacing.banner.mobile_padding_top`: Number
- `header.elements_spacing.banner.mobile_padding_top_unit`: String
- `header.elements_spacing.banner.margin_right`: Number
- `header.elements_spacing.banner.margin_right_unit`: String
- `header.elements_spacing.banner.mobile_margin_right`: Number
- `header.elements_spacing.banner.mobile_margin_right_unit`: String
- `header.elements_spacing.banner.padding_right`: Number
- `header.elements_spacing.banner.padding_right_unit`: String
- `header.elements_spacing.banner.mobile_padding_right`: Number
- `header.elements_spacing.banner.mobile_padding_right_unit`: String
- `header.elements_spacing.banner.margin_bottom`: Number
- `header.elements_spacing.banner.margin_bottom_unit`: String
- `header.elements_spacing.banner.mobile_margin_bottom`: Number
- `header.elements_spacing.banner.mobile_margin_bottom_unit`: String
- `header.elements_spacing.banner.padding_bottom`: Number
- `header.elements_spacing.banner.padding_bottom_unit`: String
- `header.elements_spacing.banner.mobile_padding_bottom`: Number
- `header.elements_spacing.banner.mobile_padding_bottom_unit`: String
- `header.elements_spacing.banner.margin_left`: Number
- `header.elements_spacing.banner.margin_left_unit`: String
- `header.elements_spacing.banner.mobile_margin_left`: Number
- `header.elements_spacing.banner.mobile_margin_left_unit`: String
- `header.elements_spacing.banner.padding_left`: Number
- `header.elements_spacing.banner.padding_left_unit`: String
- `header.elements_spacing.banner.mobile_padding_left`: Number
- `header.elements_spacing.banner.mobile_padding_left_unit`: String
- `header.nav_links_spacing`: Object[]
  - `nav`: String
  - `margin_top`: Number
  - `margin_top_unit`: String
  - `mobile_margin_top`: Number
  - `mobile_margin_top_unit`: String
  - `padding_top`: Number
  - `padding_top_unit`: String
  - `mobile_padding_top`: Number
  - `mobile_padding_top_unit`: String
  - `margin_right`: Number
  - `margin_right_unit`: String
  - `mobile_margin_right`: Number
  - `mobile_margin_right_unit`: String
  - `padding_right`: Number
  - `padding_right_unit`: String
  - `mobile_padding_right`: Number
  - `mobile_padding_right_unit`: String
  - `margin_bottom`: Number
  - `margin_bottom_unit`: String
  - `mobile_margin_bottom`: Number
  - `mobile_margin_bottom_unit`: String
  - `padding_bottom`: Number
  - `padding_bottom_unit`: String
  - `mobile_padding_bottom`: Number
  - `mobile_padding_bottom_unit`: String
  - `margin_left`: Number
  - `margin_left_unit`: String
  - `mobile_margin_left`: Number
  - `mobile_margin_left_unit`: String
  - `padding_left`: Number
  - `padding_left_unit`: String
  - `mobile_padding_left`: Number
  - `mobile_padding_left_unit`: String
  - `_id`: ObjectId
- `header.searchInputColor`: String, default "#fff"
- `header.searchInputBackground`: String, default "#dcdcdc"
- `header.searchInputPosition`: String, default "bottom"
- `header.searchExpanded`: Boolean, default false
- `header.showCartTotal`: Boolean, default false
- `header.cartTotalPosition`: String, one of  | left, default ""
- `header.cartTotalGap`: Number
- `header.sidemenuBackground`: String
- `header.sidemenuText`: String
- `header.sidemenuPanelBackground`: String
- `header.sidemenuPanelText`: String
- `header.sidemenuFontSize`: Number
- `header.sidemenuFontWeight`: String
- `header.sidemenuRowGap`: Number
- `header.sidemenuIconGap`: Number
- `header.sidemenuGroupGap`: Number
- `header.sidemenuGroupFontFamily`: String
- `header.sidemenuGroupFontSize`: Number
- `header.sidemenuGroupTextTransform`: String
- `header.sidemenuGroupColor`: String
- `header.sidemenuGroupFontWeight`: String
- `header.dropdownRadius`: Number
- `header.dropdownFontFamily`: String
- `header.dropdownFontSize`: Number
- `header.dropdownItemGap`: Number
- `header.dropdownPaddingX`: Number
- `header.dropdownPaddingY`: Number
- `header.searchInputMaxWidth`: Number
- `header.searchInputBorderRadius`: String
- `header.bar_menus`: Object[]
  - `nav`: String
  - `position`: String
  - `value`: Number
  - `mobile_value`: Number
  - `hideIcon`: Boolean, default false
  - `hideTitle`: Boolean, default false
  - `font_size`: Number
  - `_id`: ObjectId
- `partners.gridStyle`: String, default "row"
- `partners.align`: String, default "left"
- `partners.name`: String, default "right"
- `partners.image`: String, default "left"
- `partners.description`: String, default "right"
- `partners.title`: String, default "bottom"
- `partners.showSearch`: Boolean, default true
- `partners.showCategories`: Boolean, default true
- `partners.showMap`: Boolean, default true
- `partners.perPage`: Number, default 9
- `partners.sort`: String, default "name:1"
- `contacts.map`: Boolean, default true
- `contacts.partners`: Boolean, default true
- `price_plan.title`: String, default "top"
- `price_plan.description`: String, default "top"
- `price_plan.plan_features_style`: String, default "0"
- `price_plan.rating`: Boolean, default false
- `price_plan.ratingList`: Boolean, default false
- `price_plan.image`: Boolean, default false
- `price_plan.about_page`: ObjectId, → AboutPage
- `price_plan.header`: ObjectId, → AboutPage
- `backgroundGradient.enabled`: Boolean, default false
- `backgroundGradient.degrees`: Number
- `backgroundGradient.colors`: Object[]
  - `color`: String
  - `percentage`: Number
  - `_id`: ObjectId
- `backgroundGradient.css`: String
- `backgroundImage`: String, default "" - Background picture.
- `backgroundVideo`: String, default "" - Background video.
- `backgroundAttachment`: String, default "fixed" - Whether the background scrolls or stays fixed.
- `backgroundOpacity`: Number, default 1 - Opacity of the background picture or video.
- `transparentCard`: Boolean, default false - Cards are see-through.
- `cardColor`: String - Opacity of cards, from 0 to 1.
- `cardColor_color`: String - Card colour.
- `cardColor_color_darkmode`: String - Card colour in dark mode.
- `showMorePages`: Boolean, default true - Shows the More pages menu.
- `allow_darkmode`: Boolean, default false - Allows site/app to switch between light and dark mode, default value is false.
- `use_darkmode_on_site`: Boolean, default false - Allows the site to switch between light and dark mode, default value is false.
- `programs.rating`: Boolean, default false
- `programs.titleColor`: String
- `programs.descriptionColor`: String
- `programs.borderRadius`: String
- `programs.titleFontSize`: String
- `programs.descriptionFontSize`: String
- `programs.titleFontWeight`: String
- `programs.descriptionFontWeight`: String
- `programs.cardBorderRadius`: String
- `programs.cardBorderWidth`: String
- `programs.cardBorderColor`: String
- `programs.cardBackgroundColor`: String
- `programs.imageAspectRatio`: String
- `programs.customCss`: String
- `programs.sort`: Number, default -1
- `programs.showBreadCrumbs`: Boolean, default true
- `programs.filtersBackgroundColor`: String
- `programs.filtersTextColor`: String
- `programs.filtersBorderRadius`: String
- `programs.boxShadowColor`: String
- `programs.boxShadowOffsetX`: Number, default 0
- `programs.boxShadowOffsetY`: Number, default 0
- `programs.boxShadowBlurRadius`: String
- `programs.boxShadowSpreadRadius`: String
- `programs.imagePadding`: Number, default 0
- `programs.categories.layout`: String, one of list | columns, default "list"
- `programs.categories.showHeading`: Boolean, default true
- `programs.categories.showSubtitle`: Boolean, default true
- `programs.categories.showImage`: Boolean, default false
- `programs.categories.imageSize`: String, default "50px"
- `programs.categories.imageRadius`: String
- `programs.categories.imageAspectRatio`: String, default "1/1"
- `programs.categories.imageFit`: String, one of cover | contain, default "cover"
- `programs.categories.imagePadding`: Number, default 0
- `programs.categories.fallback`: String, one of initial | color | none, default "initial"
- `programs.categories.showChevron`: Boolean, default true
- `programs.categories.titleColor`: String
- `programs.categories.titleFontSize`: String
- `programs.categories.titleFontWeight`: String
- `programs.categories.cardBackgroundColor`: String
- `programs.categories.cardBorderRadius`: String
- `programs.categories.cardBorderWidth`: String
- `programs.categories.cardBorderColor`: String
- `programs.categories.customCss`: String
- `programs.categories.site.showImage`: Boolean, default true
- `programs.categories.site.imageSize`: String
- `programs.categories.site.imageAspectRatio`: String
- `programs.categories.site.titleColor`: String
- `programs.categories.site.titleFontSize`: String
- `programs.categories.site.titleFontWeight`: String
- `programs.categories.site.cardBackgroundColor`: String
- `programs.categories.site.cardBorderRadius`: String
- `programs.categories.site.cardBorderWidth`: String
- `programs.categories.site.cardBorderColor`: String
- `programs.categories.site.cardPadding`: String
- `programs.categories.site.gap`: String
- `programs.categories.site.align`: String, one of left | center | right
- `programs.categories.site.titleTransform`: String, one of uppercase | lowercase | capitalize
- `programs.showViews`: Boolean, default false
- `programs.viewsColor`: String
- `headerA_secondary`: String, default "#f4f5f8" - Secondary header gradient start.
- `headerB_secondary`: String, default "#f4f5f8" - Secondary header gradient end.
- `headerA_secondary_darkmode`: String, default "#f4f5f8" - The same in dark mode.
- `headerB_secondary_darkmode`: String, default "#f4f5f8" - The same in dark mode.
- `headerText_secondary`: String - Secondary header text colour.
- `headerText_secondary_darkmode`: String - The same in dark mode.
- `tabs.allow_custom_tabs_color`: Boolean, default false
- `tabs.background`: String
- `tabs.background_checked`: String
- `tabs.color`: String
- `tabs.color_checked`: String
- `tabs.indicator_color`: String
- `tabs.hide_text`: Boolean, default false
- `tabs.hide_home`: Boolean, default false
- `tabs.button_spacing_vertical`: Number, default 0
- `tabs.button_spacing_horizontal`: Number, default 0
- `tabs.button_border_radius`: Number, default 0
- `tabs.navigations.home.icon`: String
- `tabs.navigations.home.img`: ObjectId, → Media
- `tabs.navigations.explore.icon`: String
- `tabs.navigations.explore.img`: ObjectId, → Media
- `tabs.navigations.bites.icon`: String
- `tabs.navigations.bites.img`: ObjectId, → Media
- `tabs.navigations.videos.icon`: String
- `tabs.navigations.videos.img`: ObjectId, → Media
- `tabs.navigations.groups.icon`: String
- `tabs.navigations.groups.img`: ObjectId, → Media
- `tabs.navigations.vouchers.icon`: String
- `tabs.navigations.vouchers.img`: ObjectId, → Media
- `tabs.navigations.store.icon`: String
- `tabs.navigations.store.img`: ObjectId, → Media
- `tabs.navigations.programs.icon`: String
- `tabs.navigations.programs.img`: ObjectId, → Media
- `tabs.navigations.services.icon`: String
- `tabs.navigations.services.img`: ObjectId, → Media
- `tabs.navigations.blogposts.icon`: String
- `tabs.navigations.blogposts.img`: ObjectId, → Media
- `tabs.navigations.subscriptions.icon`: String
- `tabs.navigations.subscriptions.img`: ObjectId, → Media
- `tabs.navigations.events.icon`: String
- `tabs.navigations.events.img`: ObjectId, → Media
- `tabs.navigations.playlists.icon`: String
- `tabs.navigations.playlists.img`: ObjectId, → Media
- `tabs.navigations.user.icon`: String
- `tabs.navigations.user.img`: ObjectId, → Media
- `tabs.navigations.partners.icon`: String
- `tabs.navigations.partners.img`: ObjectId, → Media
- `tabs.navigations.contacts.icon`: String
- `tabs.navigations.contacts.img`: ObjectId, → Media
- `tabs.navigations.tracker.icon`: String
- `tabs.navigations.tracker.img`: ObjectId, → Media
- `tabs.navigations.mini_apps.icon`: String
- `tabs.navigations.mini_apps.img`: ObjectId, → Media
- `tabs.navigations.more.icon`: String
- `tabs.navigations.more.img`: ObjectId, → Media
- `tabs.navigations.claims.icon`: String
- `tabs.navigations.claims.img`: ObjectId, → Media
- `tabs.navigations.professional_pages.icon`: String
- `tabs.navigations.professional_pages.img`: ObjectId, → Media
- `tabs.navigations.bookings.icon`: String
- `tabs.navigations.bookings.img`: ObjectId, → Media
- `customDropdown_background`: String, default "#fff" - Background of custom dropdown menus.
- `customDropdown_text`: String, default "#212529" - Text colour of custom dropdown menus.
- `products_partial.showCart`: Boolean, default false
- `products_partial.swiper.enabled`: Boolean, default false
- `products_partial.swiper.loop`: Boolean, default false
- `products_partial.swiper.showControls`: Boolean, default false
- `products_partial.brand`: Boolean, default true
- `breadCrumbs_backgroundColor`: String, default "#e8ebf0" - Breadcrumbs background.
- `breadCrumbs_textColor`: String, default "#97a0b0" - Breadcrumbs text colour.
- `breadCrumbs_darkmode_backgroundColor`: String, default "#e8ebf0" - Breadcrumbs background in dark mode.
- `breadCrumbs_darkmode_textColor`: String, default "#97a0b0" - Breadcrumbs text colour in dark mode.
- `cardColor_secondary`: String, default "#757c8d" - Secondary card colour.
- `cardColor_secondary_darkmode`: String, default "#757c8d" - Secondary card colour in dark mode.
- `show_inapp_message`: Boolean, default true - Shows the in-app message banner.
- `groups.participants`: Boolean, default true
- `groups.description`: Boolean, default false
- `service_categories.gridStyle`: String, default "row"
- `service_categories.titleFontSize`: String
- `service_categories.titleFontWeight`: String
- `service_categories.cardBorderRadius`: String
- `service_categories.cardBorderWidth`: String
- `service_categories.cardBorderColor`: String
- `service_categories.cardBackgroundColor`: String
- `service_categories.imageAspectRatio`: String
- `service_categories.customCss`: String
- `service_categories.cardPadding`: Number
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### User

A person with an account on the site - customer, staff member or admin.

- `name`: String - Display name.
- `email`: String, required - Email, used to sign in.
- `avatar`: ObjectId - Media.id of the profile picture.
- `social_avatar`: String - Profile picture from a social sign-in.
- `isAdmin`: Boolean, default false - Can use the admin.
- `isStaff`: Boolean, default false - A staff member who can be booked.
- `owner_id`: ObjectId - User.id of the admin who added this user.
- `organization_name`: String - Company name.
- `firstname`: String - First name.
- `lastname`: String - Last name.
- `phone_number`: String - Phone number.
- `address`: String - Address.
- `city`: String - City.
- `state`: String - State or region.
- `country`: String - Country.
- `zip_code`: String - Postal code.
- `tax_identification_number`: String - Tax number.
- `notes`: String - Notes kept on the user.
- `isConfirmed`: Boolean, default false - The email was confirmed.
- `number_of_sales`: Number, default 0 - How many sales the user made (marketplace).
- `stripe_id`: String - The user's id in Stripe.
- `paypal_id`: String - The user's PayPal id.
- `access_level`: Number - Admin permission level; 0 is full access.
- `can_edit.site`: Boolean, default true
- `can_edit.crm`: Boolean, default true
- `can_edit.store`: Boolean, default true
- `can_edit.payments`: Boolean, default true
- `can_edit.staff`: Boolean, default true
- `validation_code`: String - Code sent to confirm the email.
- `price_plans`: ObjectId[], → PricePlan - PricePlan ids.
- `emotion`: String - Positive, neutral, negative.
- `political_spectrum`: String - Far left, left, far right, right, middle.
- `language`: Mixed - Multiple objects inside - key: value - example - "EN": 5 (5 being the weight);.
- `interests`: Mixed - Multiple objects inside - key: value - example - "hobby": 5 (5 being the weight);.
- `app_category`: Mixed - Multiple objects inside - key: value - example - "hobby": 5 (5 being the weight);.
- `user_profile`: Mixed - Multiple objects inside - key: value - example - "intelligent": 5 (5 being the weight);.
- `user_economics`: String - Low, middle, high.
- `user_education`: String - Low, middle, high.
- `marital_status`: String - Single, married.
- `age`: String - 0-18, 18-25, 25-30, 30-35, 35-45, 45-60.
- `sex`: String - Male - female.
- `attractiveness`: String - Low, medium, high.
- `following`: ObjectId[], → User - User ids.
- `followers`: ObjectId[], → User - User ids.
- `handle`: String - Unique @handle.
- `saved_posts`: ObjectId[], → Post - Post ids.
- `blocked_users`: ObjectId[], → User - User ids.
- `blocked_by`: ObjectId[], → User - User ids.
- `bio`: String - About the user.
- `wallet`: Number, default 0 - Balance in the user's wallet.
- `ip_location.city`: String
- `ip_location.continent_name`: String
- `ip_location.country_name`: String
- `ip_location.country_subdivision`: String
- `ip_location.location_latitude`: Number
- `ip_location.location_longitude`: Number
- `ip_location.last_updated`: Date
- `ip_location.ip_address`: String
- `ip_location.zip_code`: String
- `ip_location.dialing_code`: String
- `location`: Embedded - The user's chosen location.
  - `type`: String, one of Point
  - `coordinates`: Number[]
  - `_id`: ObjectId
- `checkout_recovery_at`: Date - When we last emailed them about a Premium checkout they left (utils/checkout-recovery).
- `search_history`: String[] - What the user searched for.
- `isRestricted`: Boolean, default false - Restricted by a moderator.
- `isMonetized`: Boolean, default false - Earns from their content.
- `monetization_request.isRequested`: Boolean, default false
- `monetization_request.requested_on`: Date
- `sentFollowersEmail`: Date - When the followers summary email was last sent.
- `isShadowbanned`: Boolean, default false - Their content is hidden from others without telling them.
- `custom_url`: Object[] - Custom addresses for their profile.
  - `heading`: String
  - `url`: String
  - `_id`: ObjectId
- `isWhitelisted`: Boolean, default false - Skips moderation.
- `isReviewedWhitelist`: Boolean, default false - The whitelist request was reviewed.
- `advertiser_id`: String - Id as an advertiser.
- `selected_events`: String[] - Events the user follows.
- `profile_feed_style`: String, default "list" - How their profile feed looks (grid, list).
- `hidden_users`: ObjectId[], → User - User ids whose posts are hidden from this user's feed.
- `isVerified`: Boolean, default false - Shows the verified badge.
- `saved_products`: ObjectId[], → Product - Product ids the user saved.
- `saved_programs`: ObjectId[], → Program - Program ids the user saved.
- `saved_blogposts`: ObjectId[], → Blogpots - BlogPost ids the user saved.
- `saved_services`: ObjectId[], → Service - Service ids the user saved.
- `last_used_miniapps`: ObjectId[], → MiniApp - MiniApp ids.
- `has_disabled_seen`: Boolean, default false - Read receipts are off.
- `other_address`: Object[] - Other saved addresses.
  - `firstname`: String
  - `lastname`: String
  - `email`: String
  - `phone_number`: String
  - `address`: String
  - `city`: String
  - `state`: String
  - `country`: String
  - `zip_code`: String
  - `_id`: ObjectId
- `is_disabled`: Boolean, default false - The account is disabled.
- `delete_date`: Date - When the account will be deleted.
- `trial_price_plans`: Object[] - Price plans the user is trying, and until when.
  - `end_date`: Date
  - `start_date`: Date
  - `price_plan`: ObjectId, → PricePlan
  - `_id`: ObjectId
- `lastActivity`: Date - When the user was last active.
- `attached_dynamic_models`: Object[] - Records of custom models attached to the user.
  - `model`: ObjectId, → DynamicModel
  - `document`: ObjectId
  - `_id`: ObjectId
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date

### UserEngagementNotification

- `type`: String - Liked_post, commented, liked_comment, replied_to, mentioned, sent_message, search, followed, profile_visit, system, group_request_received, group_request_accepted, activity_boost.
- `title`: String, required - The notification's heading.
- `body`: String - The notification's text.
- `owner_id`: ObjectId, → User - User.id.
- `from`: ObjectId, → User - User.id.
- `post`: ObjectId, → Post - Post.id.
- `group`: ObjectId, → Group - Group.id.
- `sendToAll`: Boolean, default false - Goes to every user.
- `comment`: ObjectId, → Comment - Comment.id.
- `is_received`: Boolean, default false - Delivered to the user.
- `is_seen`: Boolean, default false - The user saw it.
- `url`: String - Where tapping it leads.
- `image`: String - Picture shown with it.
- `service`: ObjectId, → Service - Service.id.
- `product`: ObjectId, → Product - Product.id.
- `blogpost`: ObjectId, → BlogPost - BlogPost.id.
- `program`: ObjectId, → Program - Program.id.
- `booking`: ObjectId, → Booking - Booking.id.
- `_id`: ObjectId
- `updatedAt`: Date
- `createdAt`: Date
