User Manual
Complete guide for managing website content
GAC Caribbean — User Manual
For: Content managers and administrators System: Admin Panel (at
/admin) Skill level required: No technical experience needed
Setting Up a New Instance
If you are setting up a new dealer website (a separate instance for a different country or territory), an onboarding guide is available to help you collect all the information the development team will need.
👉 Open the New Instance Onboarding Guide (opens in a new tab)
The guide walks through everything required: dealership identity, contact details, branding, vehicle catalog, page content, and the go-live checklist. It also includes a Download (.pdf) button to export a fillable version you can complete offline and send to the team.
Table of Contents
- Getting Started
- Admin Panel Overview
- Site Configuration
- Navigation
- Home Page Banners
- Vehicle Catalog
- Vehicles
- Articles (News & Publications)
- Exterior Colors
- Interior Colors
- About Us
- Warranty Page
- Tips & Common Tasks
- Sync
- Troubleshooting
- Transactional Emails
- GDPR & Cookie Consent
- Analytics
- Application Architecture (Developer Reference)
1. Getting Started
Accessing the Admin Panel
The Admin Panel is the control centre for all website content. To access it:
- Open your web browser
- Navigate to your website address followed by
/adminExample:https://gac.sx/admin - You will be redirected to the login page automatically
Logging In
Login page

- Enter your Email address
- Enter your Password
- Click Sign In
If you do not have login credentials, contact your system administrator to have an account created for you in Auth0.
Resetting Your Password
If you have forgotten your password:
- Click "Forgot password?" on the login page
- Enter your email address and click "Send Reset Link"
- Check your inbox for a password reset email
- Follow the link in the email to set a new password
Signing Out
Click Sign out in the top-right corner of the admin panel (in the top bar, next to your name). It is visible on every admin page.
2. Admin Panel Overview
Once logged in, you will see the Admin Panel. It has two main areas:
Admin panel layout
Key concepts
| Term | What it means |
|---|---|
| Save Changes | The button that makes your edits go live on the website |
| Unsaved changes | A small indicator that appears when you have edited something but not yet saved |
| Table view | A list of items (articles, vehicles, colors) with action buttons |
| Form view | A page of fields you fill in to create or edit an item |
The Save Changes button
Every editable page has a Save Changes button. Changes only go live after you click it.
Save Changes button
The Save Changes button appears at the bottom of every editable section. Changes only go live after clicking it.
There is no "Draft" step. Clicking Save Changes publishes your edits immediately.
3. Site Configuration
What it controls: Contact details, currency, SEO settings, site name, and maintenance mode.
How to open it
- Click "Site Config" in the left sidebar under Settings
Fields explained
Localisation
| Field | What to enter | Example |
|---|---|---|
| Currency | The currency used for all vehicle prices across the site | $ — USD |
Changing this setting affects every place a price is displayed — the vehicle model hero banner and any price labels on the site. The available currencies are:
| Symbol | Code | Region |
|---|---|---|
| $ | USD | United States Dollar |
| € | EUR | Euro |
| £ | GBP | British Pound |
| NAf. | ANG | Netherlands Antillean Guilder (Sint Maarten) |
| Afl. | AWG | Aruban Florin |
| TT$ | TTD | Trinidad and Tobago Dollar |
| Bds$ | BBD | Barbadian Dollar |
| J$ | JMD | Jamaican Dollar |
| CA$ | CAD | Canadian Dollar |
| A$ | AUD | Australian Dollar |
| G$ | GYD | Guyanese Dollar |
If you need a currency not in this list, ask your developer to add it to
src/lib/currencies.ts— all other parts of the site pick it up automatically.
Contact Information
| Field | What to enter | Example |
|---|---|---|
| Contact Telephone | Your dealership phone number | +1 721 555 0100 |
| Contact Email | Your main contact email address | [email protected] |
| Contact Address | Full street address for the map and footer | 123 Airport Rd, Simpson Bay, Sint Maarten |
| Contact Latitude | GPS latitude coordinate | 18.0335 |
| Contact Longitude | GPS longitude coordinate | -63.1198 |
| Contact Marker Color | Hex color code for the map pin | #BE8751 |
What is a hex color code? It is a
#followed by 6 characters (letters A–F and numbers 0–9). You can find hex codes at htmlcolorcodes.com.
Site Identity
| Field | What to enter | Example |
|---|---|---|
| Site Name | Short website name, used in browser tab | GAC Caribbean |
| Company Name | Full company display name | GAC Caribbean Dealers |
| Site URL | The full website address (must start with https://) | https://gac.sx |
| Favicon | Browser tab icon — upload a PNG, ICO, or SVG. Max 512 KB. | (upload) |
| Site Description | 1–2 sentence description for Google | Official GAC dealer in Sint Maarten. |
| Site Keywords | Comma-separated search terms | GAC, SUV, Sint Maarten, car dealer |
Maintenance Mode
Maintenance Mode toggle
Global WhatsApp Button
Controls the floating WhatsApp button shown across all public pages. See Section 3b for full instructions.
How to update Site Configuration
- Click into any field and type the new value
- Click Save Changes
3a. Cache Refresh
The Refresh Content Cache panel sits at the top of the Site Config page. Use it whenever uploaded images, logos, or other media are not appearing on the live website.
Cache Refresh panel
When to use it
| Situation | Action needed |
|---|---|
| You uploaded a new image but it is not showing on the website | Click Refresh Cache |
| You saved changes but the old content is still appearing after 30 seconds | Click Refresh Cache |
| You updated contact details and the footer still shows the old number | Click Refresh Cache |
How to refresh the cache
- Click Site Config in the left sidebar
- Find the Refresh Content Cache panel at the top of the page
- Click the Refresh Cache button
- Wait for the spinner to finish — this usually takes 5–15 seconds
- A green confirmation message shows how many pages were refreshed (e.g.
Cache cleared and 12/12 pages pre-warmed) - Reload the live website — the updated content should now appear
Note: The cache refreshes automatically when you click Save Changes on most pages. You only need to manually refresh if changes are not appearing after saving, or after uploading assets directly through Sanity Studio.
3b. Global WhatsApp Button
What it controls: A floating green WhatsApp button that appears in the bottom-right corner of every public page (except vehicle model pages). Visitors can tap it to open a WhatsApp conversation with a pre-filled message.
Global WhatsApp Button config
Fields explained
| Field | What to enter | Example |
|---|---|---|
| Enable Button | Toggle ON to show the button sitewide. OFF hides it completely. | (toggle) |
| WhatsApp Number | The phone number visitors will message. International format with country code. Leave blank to use the number in Contact Telephone. | +17215550100 |
| Pre-filled Message | The text that is automatically typed in the visitor's WhatsApp chat when they tap the button. | Hi, I was browsing your GAC website and had a question. |
Number format tip: Do not use spaces, dashes, or brackets in the number — use digits only with a
+country code prefix, e.g.+17215550100not+1 (721) 555-0100.
Enabling the button
- Open Site Config from the left sidebar
- Scroll down to the Global WhatsApp Button section
- Click the Disabled button — it turns green and reads Enabled
- Optionally enter a custom WhatsApp number (leave blank to use the Contact Telephone number)
- Optionally enter a custom pre-filled message (leave blank for the default message)
- Click Save Changes
Disabling the button
- Open Site Config
- Scroll to Global WhatsApp Button
- Click the Enabled button — it turns grey and reads Disabled
- Click Save Changes
Where the button appears
| Page | Button shown? |
|---|---|
| Home page | ✅ Yes |
| News / articles | ✅ Yes |
| Contact page | ✅ Yes |
| About Us, Warranty, Spec Sheets | ✅ Yes |
Vehicle model pages (e.g. /models/tiggo-9) | ❌ No — these pages have their own vehicle-specific WhatsApp button |
Admin panel (/admin/…) | ❌ No |
The vehicle-specific WhatsApp button on each model page is separate and is not affected by this setting. It uses the vehicle model name in its message and is always active regardless of the global toggle.
3c. Favicon
What it controls: The small icon shown in the browser tab, browser bookmarks, and on mobile home screens when a visitor saves the site.
How to upload a favicon
- Open Site Config from the left sidebar
- Scroll to the Site Identity section
- Click Upload next to the Favicon field
- Select a PNG, ICO, or SVG file from your computer
- The image must be 512 KB or smaller — if it is larger, the upload will be blocked with an error message
- A 32 × 32 px preview appears immediately
- Click Save Changes — the new favicon becomes active within a few seconds
Replacing or removing a favicon
- Replace: Click Replace next to the current favicon preview and select a new file
- Remove: Click Remove to clear it — the site falls back to its built-in default icon
Best practice
| Recommendation | Details |
|---|---|
| Preferred size | 32 × 32 px or 48 × 48 px |
| Preferred format | PNG or ICO for broad browser support; SVG for modern browsers |
| Max file size | 512 KB (enforced — larger files are rejected before upload) |
| Background | Use a transparent background (PNG) so the icon looks clean on any browser toolbar colour |
Tip: If you have a square logo, export it at 32 × 32 px as a PNG with a transparent background.
3d. Custom Price Display Format
What it controls: How vehicle prices appear in the price label on vehicle model pages and the home page slider. By default the site shows Starting from $45,000 using the selected currency symbol. When Custom Price Format is enabled you can replace the currency portion with your own prefix and suffix text.
How to enable it
- Open Site Config from the left sidebar
- Scroll to the Localisation section
- Click the Disabled button next to Custom Price Format — it turns green and reads Enabled
- Two new fields appear: Prefix and Suffix
- Fill in your desired text (see examples below)
- Check the Preview row to see exactly how a price of 45,000 will look
- Click Save Changes
Fields explained
| Field | What to enter | Example |
|---|---|---|
| Custom Price Format | Toggle — enables or disables the custom format | (toggle) |
| Prefix | Text placed immediately before the number | From $ or Starting at NAf. |
| Suffix | Text placed immediately after the number | USD or ANG |
How the label is built
The price label always starts with Starting from or Only (controlled per vehicle in the Catalog), followed by the formatted price:
Starting from {Prefix}{number}{Suffix}
Example with Prefix = $ and Suffix = USD:
Starting from $45,000 USD
Example with Prefix = NAf. and Suffix = `` (empty):
Starting from NAf. 45,000
Example with Prefix = `` (empty) and Suffix = ANG:
Starting from 45,000 ANG
Tip: When this setting is off, prices use the standard currency symbol and placement set by the Currency field above (e.g.
Starting from $45,000for USD). Turn it on only when you need a format the currency registry does not produce by default.
Disabling the custom format
- Click the Enabled button next to Custom Price Format — it turns grey and reads Disabled
- Click Save Changes — prices revert to the standard currency symbol formatting
4. Navigation
What it controls: The top navigation menu links visible on every page of the website.
How to open it
- Click "Navigation" in the left sidebar under Settings
The navigation editor
You will see a list of your current nav items. Each row shows the link label and its URL.
Desktop
ModelsAbout GACServiceTechnologyContactMobile

Adding a new nav item
- Click "Add Nav Item" at the bottom of the list
- Fill in the fields (see table below)
- Click Save
Editing a nav item
- Click "Edit" on the row you want to change
- Update the fields in the dialog that opens
- Click Save
Removing a nav item
- Click the ✕ button on the right of the item
- Click Save Changes to confirm
Reordering nav items
Click the ↑ or ↓ arrows on the left of each row to move it up or down. Click Save Changes when done.
Nav item fields explained
| Field | What to enter | Example |
|---|---|---|
| Label | The text shown in the navigation bar | About GAC |
| URL / Path | Internal path or full external URL | /about-us or https://cheryinternational.com |
| Scroll Target ID | Optional — scroll to a section ID on the page | models |
| Link Target | Same tab for internal links; New tab for external | New tab |
| Show children on mobile | Toggle to show sub-links in the mobile menu | (toggle) |
| Show children on desktop | Toggle to show sub-links on desktop hover | (toggle) |
Adding child links
Each nav item can have sub-links that appear in mobile dropdowns and the desktop hover bar:
- Click Edit on the parent nav item
- In the dialog, scroll to the Children section
- Click "Add Child" and fill in the same fields
- Click Save
5. Home Page Banners
What it controls: The large hero images and videos that rotate on the home page, plus the main CTA (Call-to-Action) image.
How to open it
- Click "Home Page Banners" in the left sidebar under Settings
The banner list
You will see a list of existing banners and an Add Banner button:
Desktop — 1920 × 1080 px / resolution 150 dpi

Mobile — 1000 x 1667 px / resolution 72 dpi

Adding a new banner
- Click "Add Banner"
- A dialog opens — fill in the fields (see table below)
- Click Save
- Click Save Changes on the main page to publish
Editing an existing banner
- Click "Edit" on the banner row
- Update the fields in the dialog
- Click Save, then Save Changes
Removing a banner
- Click the ✕ button on the banner row
- Click Save Changes to confirm
Reordering banners
Banners display in the order shown in the list. Click the ↑ or ↓ arrows to move a banner, then click Save Changes.
Banner fields explained
Required fields
| Field | What to enter |
|---|---|
| Type | Choose image for a photo or video for a video clip |
| Title | The large heading shown on the banner (e.g. Tiggo 9) |
Image banner fields
| Field | What to enter |
|---|---|
| Image | Upload the main banner photo (desktop version) |
| Mobile Image | Upload a cropped version for phone screens (recommended) |
| Alt Text | Short image description for accessibility (e.g. GAC Tiggo 9 in white) |
| Model | Internal model name used for logo display (e.g. tiggo-9) |
Video banner fields
| Field | What to enter |
|---|---|
| Video URL | The URL of the hosted video file |
| Poster Image | The thumbnail shown before the video loads |
| Autoplay | Toggle ON for the video to start automatically |
| Loop | Toggle ON to loop continuously |
| Muted | Keep ON — browsers block autoplay with sound |
| Duration (ms) | How long to show this slide (e.g. 6000 = 6 seconds) |
Optional styling fields
| Field | What to enter |
|---|---|
| Description | Subtitle text shown below the title |
| Title Location (Desktop) | Where the title appears on desktop: bottom-left, center, etc. |
| Mobile Title Location | Where the title appears on mobile |
| Hide Title on Desktop | Toggle ON to hide the title text on large screens |
| Link URL | Where the button takes the visitor (e.g. /models/tiggo-9) |
| Link Label | Text on the button (e.g. Discover More) |
CTA Image
At the bottom of the Banners page there is a CTA Image section. This is the decorative photo shown in the Call-to-Action section on the home page. Click Replace image to upload a new one, then click Save Changes.
6. Vehicle Catalog
What it controls: Which vehicles appear on the website, in what order, and at what price.
Important: A vehicle must first be created in the Vehicles section before it can be added to the catalog.
How to open it
- Click "Catalog" in the left sidebar under Settings
The catalog list
You will see a list of vehicles currently in the catalog, each showing the vehicle name and its price.
Catalog list
Adding a vehicle to the catalog
- Click "Add Vehicle"
- In the dialog, select the vehicle from the dropdown
- Enter the Price (optional — leave empty to hide the price on the website)
- Click Save, then Save Changes
Setting or updating a price
- Click "Edit" on the vehicle row
- Update the price field (numbers only — no currency symbol or commas)
- Click Save, then Save Changes
The currency symbol shown next to the price (e.g.
$,NAf.,€) is controlled by the Currency setting in Site Config, not here.
Removing a vehicle from the catalog
- Click the ✕ button on the vehicle row
- Click Save Changes
Removing a vehicle from the catalog does not delete the vehicle. It only removes it from the website listing. You can re-add it at any time.
Reordering the catalog
The vehicles display on the website in the same order as this list. Click the ↑ or ↓ arrows to reorder, then click Save Changes.
Series grouping follows catalog order. The series tabs in the home page vehicle slider and the series sections in the mobile navigation menu are ordered by the first vehicle of each series that appears in this catalog list. For example, if the first Tiggo model appears before the first Himla model, the Tiggo series tab will appear first. To change the series order, move vehicles in the catalog so the desired series appears first.
7. Vehicles
What it controls: Full detail pages for each vehicle model — images, specs, performance data, interior, exterior gallery, banners, colors, and spec sheet downloads.
How to open it
- Click "Vehicles" in the left sidebar under Content
- You will see a table of all existing vehicles
The vehicles table
Vehicles table
| Name | Type | Series | Last Updated | Actions | |
|---|---|---|---|---|---|
🖼 | Tiggo 9 | SUV | Tiggo | 2 days ago | ✏ 🗑 |
🖼 | Tiggo 8 Pro | SUV | Tiggo | 1 week ago | ✏ 🗑 |
🖼 | Arrizo 6 | Sedan | Arrizo | 3 weeks ago | ✏ 🗑 |
Creating a new vehicle
- Click "New Vehicle" in the top-right of the page
- A tabbed form opens — fill in the fields across all tabs
- Click Save Vehicle when finished
- Then go to the Catalog section to add the vehicle to the website listing
Editing an existing vehicle
- Click the ✏ (edit) button on the vehicle row
- The tabbed form opens with the existing data loaded
- Edit the desired fields
- Click Save Vehicle
Deleting a vehicle
⚠️ Warning: Deleting a vehicle is permanent and cannot be undone. First remove it from the Catalog, then delete it here.
- Click the 🗑 (delete) button on the vehicle row
- Confirm the deletion in the dialog that appears
Duplicating a vehicle
Use this when you need to create a new vehicle that is similar to an existing one — for example, adding a new trim level or annual refresh that shares most of the same content.
Duplicate vehicle — row button and confirm dialog
Copy button on vehicle row
Confirmation dialog (opens after clicking Copy)
How to duplicate a vehicle:
- In the Vehicles table, find the vehicle you want to copy
- Click the ⧉ (copy) button on the right side of the row
- A confirmation dialog appears — read the message and click Create Copy
- The new vehicle appears at the top of the table with a modified slug (e.g.
tiggo-9-copy-07) - Click ✏ Edit on the new vehicle to rename it and update any fields that differ
- Once ready, go to the Catalog section to add it to the website listing
After duplicating: The copied vehicle is not visible on the website until you add it to the Catalog (Section 6). The slug is automatically set to avoid conflicts — update it in the Basics tab if needed (do this before adding to catalog, since the slug becomes the URL).
Vehicle form tabs
The vehicle form is split into tabs. Click each tab name to switch between sections.
Vehicle form tabs
Tab 1 — Basics
Identity and core images.
| Field | Required | What to enter | Example |
|---|---|---|---|
| Name | ✅ | Official model name | Tiggo 9 |
| Slug | ✅ | Auto-generated. Becomes the URL (/models/tiggo-9). Do not edit. | tiggo-9 |
| Type | ✅ | Vehicle body style — select from list | SUV |
| Series | No | Marketing family name (used to group models) | Tiggo |
| Cover Image | ✅ | Main listing photo shown in the home page slider | (upload) |
| Slider Image | No | Alternative home page image. Falls back to Cover Image if empty. | (upload) |
| Spec Sheet | No | Upload a PDF spec sheet. Appears as a downloadable link. | (PDF upload) |
| Brochure | No | Upload a PDF brochure. | (PDF upload) |
PDF tip: Only
Tab 2 — Banners
Hero images and videos shown at the top of this vehicle's detail page. Works the same as Home Page Banners.
- Click "Add Banner" to add a new hero slide
- Fill in the fields (same as Home Page Banners — see Section 5)
- Use the ↑↓ buttons to reorder banners
- Click ✕ to remove a banner
Tab 3 — Performance
Data displayed in the Performance section of the vehicle page.
Appearance text
| Field | What to enter | Example |
|---|---|---|
| Eyebrow | Small label above the title | PERFORMANCE |
| Title | Section heading | Power Meets Precision |
| Image | Performance section background photo | (upload) |
Performance figures
| Field | What to enter | Example |
|---|---|---|
| Max Power (kW) | Peak engine power | 180 |
| Max Output Torque (N·m) | Peak torque output | 390 |
| Max Input Torque (N·m) | Input torque figure | 310 |
| 0–100 km/h (seconds) | Acceleration time | 7.5 |
| Transmission | Gearbox description | 8AT TRANSMISSION |
| Engine | Engine description | 2.0T GDI EFFICIENT ENGINE |
Drive Modes
Select which driving modes are available for this vehicle. Each mode appears as a labelled button — click to toggle it on (highlighted) or off. Only the selected modes are shown in the Drive Modes panel on the live vehicle page.
Drive Modes — toggle selector
Click a mode to toggle it on (gold border) or off. Only enabled modes show on the vehicle page.
| Mode | Icon | When to enable |
|---|---|---|
| ECO | 🌿 Leaf | All standard models |
| NORMAL | 🚗 Car | All models |
| SPORT | ⚡ Gauge | All standard models |
| SNOW | ❄ Snowflake | AWD / winter-ready models |
| MUD | 💧 Water | Off-road capable models |
| OFF-ROAD | ⛰ Mountain | Off-road capable models |
Tip: For most models enable ECO, NORMAL, and SPORT. Add SNOW, MUD, and OFF-ROAD only for AWD or off-road variants (e.g. Tiggo 8, Tiggo 9).
Tab 4 — Design
Side-profile image with interactive hotspot callouts and dimension information.
Appearance text
| Field | What to enter | Example |
|---|---|---|
| Eyebrow | Small label | EXTERIOR DESIGN |
| Title | Section heading | Crafted to Impress |
| Subtitle | Supporting headline | Bold lines. Refined character. |
| Body | Paragraph text | The Tiggo 9 combines… |
Main Design Image
Upload the side-profile image of the vehicle. Once uploaded, you can place hotspots directly on it by clicking the image — a numbered pin is placed at the exact point you click.
Adding a design hotspot
- Upload the design image first
- Click anywhere on the image to place a new hotspot at that position
- An edit dialog opens automatically — fill in:
- Title — e.g.
Panoramic Sunroof - Description — text shown when the hotspot is clicked
- Image — optional close-up photo of the feature
- Title — e.g.
- Click Save
- Existing hotspots appear as numbered blue pins on the image — click Edit or ✕ to change or remove them
What you see is what visitors see. The editor image uses the same crop and zoom as the live vehicle page, so the pin positions you place here match exactly where they appear on the website.
Removing all hotspots at once
If you need to clear all hotspots and start fresh, click the Clear all button (shown in red next to "Add Hotspot" when at least one hotspot exists). A confirmation dialog will ask you to confirm before removing them all. Click Save Vehicle afterward to apply the change.
Dimensions (all measurements in millimetres)
| Field | Description |
|---|---|
| Length | Total vehicle length |
| Width | Total width (excluding mirrors) |
| Height | Total height |
| Wheelbase | Distance between front and rear axles |
| Front Track | Width between front wheels |
| Rear Track | Width between rear wheels |
| Ground Clearance | Height from ground to chassis |
| Boot Capacity | Luggage space in litres |
Tab 5 — Interior & Safety
Appearance / Description Block
This controls the large text overlay that appears on the interior section of the vehicle page — the eyebrow label, the main heading, and an optional subtitle.
Interior & Safety — Appearance / Description Block
| Field | Required | What to enter | Example |
|---|---|---|---|
| Eyebrow Text | No | Short label shown above the main title | LUXURIOUS DESIGN |
| Title | No | Main heading in the interior section | INTELLIGENT CABIN |
| Subtitle | No | Supporting line below the title | Comfort meets innovation |
| Eyebrow CSS Class | No | Advanced — leave blank unless instructed by your developer | (leave empty) |
| Title CSS Class | No | Advanced — leave blank unless instructed by your developer | (leave empty) |
If you leave these fields empty, the vehicle page will use built-in fallback text.
Interior Image & Features
| Field | What to enter |
|---|---|
| Image | Main interior photo |
| Features | List of interior highlights — each has a Label (e.g. Seats) and a Value (e.g. Nappa Leather, Ventilated) |
| Interior Slider | A gallery of interior images that visitors can swipe through on the vehicle page |
Adding an interior feature:
- Click "Add Feature"
- Enter the Label and Value
- Repeat for each feature
Adding interior slider images:
- Click "Add Slide"
- Upload an image for that slide
- Optionally fill in Alt Text (image description for accessibility) and Title (caption displayed on the slide)
- Repeat for each slide
- Use the ↑↓ arrows to reorder slides
- Click ✕ to remove a slide
Safety
Safety Image: Upload the image for the Safety section of the vehicle page.
Safety Features: A text area for listing safety features.
Tab 6 — Colors
Assign which paint and interior trim options are available for this vehicle.
Exterior Colors
- Click "Add Exterior Color"
- Select from the dropdown (colors must already exist — see Section 9)
- Click ✕ next to a color to remove it
Interior Colors
Same process as exterior colors.
If a color you need does not appear in the dropdown, go to Exterior Colors or Interior Colors to create it first.
7a. International Dealers
The International Dealers section powers the public GAC International page (/dealers) — a directory of authorised GAC dealers across the region. Each dealer has its own card with contact details and a View catalog button that opens that dealer's vehicles and prices. Prices can be pulled automatically from the dealer's own website (their Sanity project) or entered by hand.
Note: This section only appears when the international dealer network is enabled for your site (
NEXT_PUBLIC_GAC_INTERNATIONAL_ENABLED=true). If you do not see International Dealers in the sidebar, contact your system administrator.
How to open it
Click International Dealers under the Content section in the sidebar.
The International Dealers page: map style, directory settings and the dealer list
The page has four parts, top to bottom:
| Part | What it controls |
|---|---|
| Map Style on /dealers | Which kind of map the public page uses |
| Dealer Directory Settings | Search, alphabet jump, grouping, card layout and how catalogs open — separately for desktop and mobile |
| Dealer list | Every dealer, with their catalog status and Edit / Delete actions |
| Add Dealer | Opens the dealer form to create a new dealer |
What visitors see
The public page opens with a hero showing the total number of dealers and countries, followed by the Dealer Directory.
Public dealer page: hero with dealer and country counts, then the directory
Each dealer is a card:
A dealer card with country, name, address, contact links and the View catalog button
| Card element | Where it comes from |
|---|---|
| Country label and dealer name | Country and Dealer Name fields |
| Red country outline (bottom-right) | Drawn automatically from the Country field. Recognised: every Caribbean island nation and territory, Guyana, Suriname, French Guiana, Central America, Mexico, Colombia and Venezuela. Common spellings work (e.g. Trinidad & Tobago, St. Maarten, Curaçao); an unrecognised country simply shows no outline |
| Logo | Logo upload |
| Address line | Address and City |
| Phone and Visit website links | Phone and Website URL |
| Short text | Description |
| View catalog button | The dealer's catalog (synced or manual — see below). Hidden when the dealer has no vehicles to show |
Clicking View catalog opens the dealer's vehicles. Each tile shows the vehicle image and name from this site, and the price in that dealer's currency and format. Clicking a tile opens the vehicle's model page on this site.
A dealer's catalog opened as an overlay, prices in the dealer's own currency
Map style
Map style options
| Option | Description |
|---|---|
| Interactive | Full Mapbox map — zoom, pan, and clickable markers. Needs a Mapbox token in Site Configuration |
| Flat (Branded) | Stylised dark panel with projected markers. No Mapbox, no attribution |
| Static Image | Flat Mapbox snapshot with clickable markers. No zoom or pan |
Click an option to select it — the choice saves immediately.
Note: The map block on the public page is currently switched off in the site code, so this setting has no visible effect until the development team re-enables it. Dealers without coordinates are still listed in the directory.
Dealer directory settings
Dealer directory settings
Use the Desktop / Mobile tabs at the top to set each device size separately. Every change saves immediately.
| Setting | What it does |
|---|---|
| Alphabet Jump | Shows an A–Z letter bar above the directory. Visitors click a letter to jump to countries starting with it |
| Search Field | Free-text search by dealer name, country, or city |
| Group by Letter | Adds a letter heading between groups of countries. Off shows one flat list |
| Card Layout — Grid | Cards in columns, up to three per row on desktop |
| Card Layout — Rows | Full-width cards, one per row |
| Catalog Display — Inline | The catalog expands at the bottom of the dealer card |
| Catalog Display — Sheet | Inline on desktop; on mobile a sheet slides up from the bottom |
| Catalog Display — Overlay | A centered dialog over the page on all devices |
The dealer list
The dealer list
| Column | Meaning |
|---|---|
| Dealer | Logo (or a globe placeholder) and name |
| Country / City | Location fields |
| Contact | Phone and website when set |
| Catalog | Synced · 5 vehicles · 1h ago when the catalog was pulled from the dealer's site, Manual · 3 vehicles when entered by hand, or — when the dealer has no catalog yet |
| Actions | Pencil opens the dealer for editing; the red bin deletes the dealer after a confirmation |
Deleting a dealer cannot be undone.
Adding or editing a dealer
Click Add Dealer, or the pencil on an existing row. The same form is used for both.
The Edit Dealer form
| Field | Required | Notes |
|---|---|---|
| Dealer Name | Yes | Shown on the card and in the catalog title |
| Slug | Yes | URL segment for the dealer's model pages (see below). Fills in automatically from the name; edit if needed. Lowercase letters, digits and dashes, unique per dealer. Changing it changes the dealer's page URLs |
| Inquiry Email | No | Receives vehicle inquiries sent from this dealer's model pages. Blank = the site's sales address |
| Country | Yes | Shown as the red label above the name. Used for the country filter and alphabet grouping — spell it the same way for every dealer in that country |
| City, Address | No | Shown on the card |
| Latitude, Longitude | No | Map marker position. Fill both or neither. Type them in, or fill in the address fields and click Get from address to look them up |
| Phone, Website URL | No | Become clickable links on the card. Use the full URL including https:// |
| No | Number for the WhatsApp button on this dealer's model pages. Blank = use Phone | |
| Description | No | Short text under the contact details |
| Logo | No | PNG, JPG, WebP or SVG, max 512 KB. Click Upload logo, or Remove to clear it |
Click Save Changes (or Add Dealer) to store the dealer. Cancel discards everything, including any unsaved catalog edits.
Tip: After Get from address finds a location, the result is shown under the buttons. If it picks the wrong spot, adjust the address and try again, or type the coordinates manually.
The dealer's catalog
The Catalog block at the bottom of the form decides which vehicles and prices appear behind the card's View catalog button. Use the Synced / Manual toggle in the top-right of the block to pick the source:
- Synced — prices and price format are pulled from the dealer's own website (their Sanity project). Best when the dealer runs a GAC site built on this same platform.
- Manual — you pick vehicles from this site and type the prices yourself.
Both sets of data are kept. Switching from Manual back to Synced (or the other way) does not delete what you entered in the other mode — it only changes which one the public page uses.
Vehicle names and images always come from this site's own Vehicles, matched by the vehicle's slug (for example aion-es). The dealer only supplies prices.
Synced mode
Catalog block in Synced mode after a successful pull
| Field | What to enter |
|---|---|
| Project ID | The dealer's Sanity project ID — an 8-character code such as ae2a1npc. The dealer can find it at sanity.io/manage under their project |
| Dataset | Usually production. Leave blank to use production |
| API Token | A Viewer (read-only) token from the dealer's project: sanity.io/manage → their project → API → Tokens → Add API token, permissions Viewer. Paste it once; after saving, the field shows Saved •••• and the token is never displayed again. Leave it blank on later edits to keep the saved token, or paste a new one to replace it |
Pulling the catalog
- Enter Project ID, Dataset and API Token, then click Save Changes (a new dealer must be saved once before it can pull).
- Reopen the dealer and click Pull catalog. The button first saves any changes to the three fields above, then connects to the dealer's project.
- When it finishes, the status line shows when it synced, how many vehicles are shown, and the dealer's currency and format, e.g.
Synced 1h ago · 5/5 vehicles shown · GYD · "$ # GYD" · + Duty Free.
What gets copied from the dealer's site:
- Every vehicle in their Catalog, with its price, secondary price, "Starting from" flag and duty-label flag
- Their Currency, Custom Price Format (prefix / suffix) and Secondary Price settings from their Site Configuration
Under the status line each pulled vehicle is listed with this site's image, its name, and the price exactly as it will appear on the card.
| Row element | Meaning |
|---|---|
| Eye icon | Click to hide this vehicle from the dealer's public catalog. Hidden rows are dimmed. Click again to show it. Hidden choices survive future pulls |
| not on this site badge | The dealer sells a vehicle whose slug does not exist in this site's Vehicles. It is kept in the list but never shown publicly. Add the vehicle to this site (with the same slug) and it appears automatically |
Second price after · | The dealer's secondary price, shown when they have secondary prices enabled |
Click Save Changes after hiding or showing vehicles — the eye toggles are stored with the dealer.
Note: Pulling replaces the previous synced prices with whatever the dealer's site holds right now. It never changes anything on the dealer's site — the token is read-only.
Manual mode
Click Manual in the toggle. The block changes to a price-format editor and a vehicle table.
Catalog block in Manual mode: price format, Add Vehicle and the vehicle table
Price format works exactly like Site Configuration → Localisation (see 3d. Custom Price Display Format), but applies only to this dealer:
Manual price format fields
| Field | What it does |
|---|---|
| Currency | Currency symbol and number formatting for this dealer's prices |
| Custom Price Format | When Enabled, prices are built as Prefix + amount + Suffix instead of the default symbol placement. A Preview row shows the result |
| Secondary Price | When Enabled, each vehicle gets a second price shown under the main one. Name is its label, Prefix / Suffix wrap the number, and Display Mode matches the price-pill option. A Preview appears once a prefix or suffix is set |
Adding vehicles
Click Add Vehicle to open the picker. It lists every vehicle on this site; type in the search box to filter by name, type or series. Click Add on a vehicle to append it to the table. Vehicles already in the table show an In catalog badge.
The Add Vehicle picker
The vehicle table
Manual vehicle table with prices entered
| Column | How to use it |
|---|---|
| # | Display order on the card |
| Vehicle / Type / Series | From this site's vehicle record |
| Price — click to edit | Hover the row and click the pencil (or the Not set text) to type a price. Press Enter or the green tick to confirm, Esc or ✕ to cancel. The value shows formatted with the dealer's currency |
| Secondary price column | Only shown when Secondary Price is enabled above. The checkbox shows or hides the secondary price for that vehicle; click the amount to edit it |
| Starting? | From shows the price as From $25,990; Only shows the plain amount |
| Actions (on hover) | Arrows move the vehicle up or down; the red bin removes it from this dealer's catalog (the vehicle itself is untouched) |
Nothing in Manual mode is stored until you click Save Changes at the bottom of the form.
Dealer-specific model pages
Every vehicle page can be opened in a dealer's context by adding the dealer's slug after the model:
/models/aion-es → the normal page, this site's price and contacts
/models/aion-es/gac-guyana → the same page as GAC Guyana's visitors see it
Every tile in a dealer's catalog links to that dealer's page automatically, as long as the dealer has a Slug saved. This applies whether the catalog is synced, manual, or falling back to the site catalog. Dealers created before slugs existed link to the normal model page until you open them and click Save Changes once. On a dealer page:
| Element | Comes from |
|---|---|
| Price pill | The dealer's price for that vehicle, in the dealer's currency and format. If the dealer does not list the vehicle, no price is shown |
| WhatsApp button | The dealer's WhatsApp number, or Phone when WhatsApp is blank. Hidden when the dealer has neither |
| Request information form | Sends to the dealer's Inquiry Email (site CC addresses still receive a copy). Falls back to the site sales address when the dealer has no email. The subject line includes the dealer name |
| Everything else | Unchanged — banners, specs, gallery and text are this site's |
An unknown dealer slug shows the standard page not found.
How prices appear on the card
- Main price: From $25,990 when Starting from is on, otherwise $25,990
- Secondary price: a lighter second line under the main price when secondary prices are enabled for the dealer and ticked for that vehicle
- Formatting follows the dealer's own currency and prefix / suffix — not this site's
Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
| Pull catalog is greyed out | Project ID or token is empty, or the dealer has not been saved yet | Fill in both fields, Save Changes, reopen the dealer |
| Configure the dealer's Sanity project ID and API token first | The saved dealer has no token | Paste the token and save, then pull |
| Sanity rejected the token for project … | Token is wrong, expired, or belongs to another project | Ask the dealer for a new Viewer token for that project |
| Project … / dataset … not found | Typo in Project ID or Dataset | Check the values at sanity.io/manage |
| No catalog document in … | The dealer's site has never saved its Catalog | Ask the dealer to open Admin → Catalog on their site and save once |
| A vehicle shows not on this site | Slug does not exist in this site's Vehicles | Create the vehicle here with the same slug |
| Card shows this site's own catalog instead of the dealer's | The dealer has no synced or manual vehicles to show | Pull the catalog or add vehicles manually. Until then the card falls back to the main catalog |
| Card still shows old prices | Page cache | Use Cache Refresh (see 3a) or wait a minute |
| View catalog button missing on the card | The dealer's active mode has no visible vehicles and the main catalog is empty | Show at least one vehicle |
Tip: Keep one dealer on Synced and one on Manual in mind as examples: the list's Catalog column tells you at a glance which mode each dealer uses and how fresh its data is.
8. Articles (News & Publications)
What it controls: The news section of the website. Each article can be categorised as News or a Publication.
How to open it
- Click "Articles" in the left sidebar under Content
The articles table
Articles table
| Title | Type | Date | ★ | ||
|---|---|---|---|---|---|
🖼 | GAC Wins Award 2025 | News | Jun 15 2025 | ★ | ✏ |
🖼 | New Model Launch | News | May 02 2025 | ☆ | ✏ |
🖼 | Annual Report 2024 | Pub. | Jan 10 2025 | ☆ | ✏ |
Creating a new article
- Click "New Article"
- Fill in all required fields (marked ✅ below)
- Write the content using the rich text editor
- Click Save Article
Editing an article
- Click the ✏ (edit) button on the article row
- Make your changes
- Click Save Article
Deleting an article
- Open the article by clicking ✏
- Scroll to the bottom and click Delete Article
- Confirm the deletion
Article fields explained
| Field | Required | What to enter | Example |
|---|---|---|---|
| Title | ✅ | Article headline | GAC Wins Regional SUV Award 2025 |
| Slug | ✅ | Auto-generated from title. Becomes the URL. Do not edit after publishing. | gac-wins-regional-suv-award-2025 |
| Type | ✅ | News or Publication | News |
| Category | No | Topic tag for filtering | Awards |
| Summary | No | 1–2 sentence preview shown on article cards | GAC Caribbean has been recognized… |
| Published At | No | Date and time of publication | 2025-06-15 |
| Featured | No | Toggle ON to highlight this article prominently | (toggle) |
| Image | No | Cover photo for the article card and header | (upload) |
Writing article content
The Content field uses a rich text editor with a toolbar:
Rich text editor
Toolbar guide:
| Button | Action |
|---|---|
| B | Bold text |
| I | Italic text |
| ¶ | Normal paragraph |
| H2 | Heading 2 |
| H3 | Heading 3 |
| • | Bullet list |
| 1. | Numbered list |
| ↩ | Undo |
| ↪ | Redo |
Toggling "Featured"
Click the star (☆/★) icon in the articles table to toggle featured status directly without opening the article.
8a. Lead Pages
Lead Pages are campaign landing pages at /lp/{slug} — for example /lp/test-drive-week. Each page has its own hero banners, text sections and a custom form. Every submission is stored as a lead and emailed to the addresses configured on that page. Create as many pages as you have campaigns.
How to open it
Click Lead Pages under the Content section in the sidebar.
The Lead Pages list
| Column | Meaning |
|---|---|
| Page | Click the title to edit |
| URL | Public address; opens in a new tab |
| Status | Published (live) or Draft (visitors see page not found). Click to switch |
| Leads | Red N leads → button; opens the leads list for that page |
| Last lead | When the most recent lead arrived |
| Actions | Leads · Share · Edit · Duplicate (copies everything as a new draft) · Delete |
New Lead Page creates a draft with a starter form (name, email, phone, message) and opens the editor.
Sharing a page
Click the QR icon on a row to open the share dialog.
Share dialog with QR code and public link
- QR code in the house style (GAC badge in the centre). Download QR (PNG, 2400px) saves a print-ready 2400 px version — flyers, showroom stands, event banners.
- Public link with a one‑click Copy button for ads, social posts and emails.
- A yellow note warns when the page is still a draft; publish it before printing anything.
Quick start — launch a campaign in six steps
- Lead Pages → New Lead Page. A draft opens with a starter form (name, email, phone, message).
- Settings tab: give it a title and check the slug — this becomes the public address, e.g.
/lp/test-drive-week. Add the consent wording. - Content tab: add one or two hero banners and a text section that explains the offer.
- Form tab: adjust the fields. Add a Vehicle picker if the campaign is about a model, a Date for bookings, a Checkbox marked as consent. Watch the live preview.
- Delivery tab: add the recipient address(es). Turn on the confirmation email and write a short message if you want visitors to get an acknowledgement.
- Save Changes, switch Published on in Settings, save again, and open the URL from the header to check it. Share the link in your ads, posts and emails.
Duplicate a finished page for the next campaign instead of starting from scratch — everything is copied as a new draft with a -copy slug.
The editor
The editor has four tabs. The header shows the public address, the Published/Draft badge and a red Leads → button that opens this page's leads. Nothing is stored until you click Save Changes in the top-right; the header shows Unsaved changes while edits are pending, and the browser warns if you try to leave without saving. If the server rejects a save (for example a slug already in use), the message appears in the header and the editor jumps to the tab that needs fixing.
Content tab
Content tab: hero banners and text sections
- Hero banners work exactly like Home Page Banners: add, edit, reorder, remove, image or video, call‑to‑action. Up to 12. A page with no banners simply starts with the first text section.
- Text sections appear between the banners and the form, in order. Each has an eyebrow (small red label), heading, a rich-text body (the same editor as About Us: paragraphs, headings, bold, italic, lists), an optional image on the left or right, and a light or dark background.
Form tab
Form tab with the live preview
Top box: the form heading, intro line, submit button label, success heading and message, and an optional redirect URL (when set, the visitor is sent there after submitting instead of seeing the success message).
Fields table: pick a type from the dropdown and click Add field. Each row shows the label, its machine key (used as the column name in emails and CSV), type, a click‑to‑toggle Required / Optional pill and a Width dropdown (Full, 1/2, 1/3, 1/4 of the row on desktop; every field is full width on phones). Arrows reorder; the pencil opens the field editor; the bin removes it. Up to 30 fields.
| Field type | Use it for |
|---|---|
| Short text | Names, short answers |
| Long text | Comments, messages |
| Validated address. The first Email field is also used as reply‑to and for the confirmation email | |
| Phone | Validated phone number |
| Number | Amounts, quantities |
| Dropdown / Multiple choice | One answer from a list of options you type (one per line) |
| Checkbox | Yes/no. Mark one checkbox as the consent checkbox: its wording comes from Settings → Consent text and the answer is stored on every lead |
| Date | A calendar date, e.g. preferred test‑drive day |
| Vehicle picker | A dropdown of this site's catalog vehicles, always up to date |
| File upload | Images and/or PDF, 1–10 MB per file. Files are attached to the lead email when small enough, otherwise linked |
The field editor
The Live preview on the right renders the real form as visitors will see it. It validates when you press its button but never sends.
Delivery tab
Delivery tab
| Setting | What it does |
|---|---|
| Recipients | Every lead is emailed here. Type an address and press Enter to add a chip. At least one is required |
| CC | Optional copies |
| Subject prefix | Subject line becomes Prefix · Page title · visitor name or email |
| Confirmation email | When enabled, the visitor receives your subject and message at the address they entered in the first Email field |
Settings tab
Settings tab
- Slug — the public address
/lp/{slug}. Lowercase letters, digits and dashes; must be unique. Changing it changes the URL, so avoid changing it once a campaign is running. Leads stay attached to the page. - Published — the on/off switch for visitors.
- SEO title / description — what Google and link previews show.
- Consent text — the sentence next to the consent checkbox.
- Delete this page — takes the page offline. Leads already collected are kept.
What visitors see
The public form
Required fields are marked with a red asterisk; problems are shown under the field. After a successful submission the visitor sees the success message (or is redirected).
Success message
Behind the scenes:
- The answers are checked on the server against the field list — required fields, email/phone/number/date formats, dropdown options, file type and size. Nothing the visitor sends can change where the email goes.
- The lead is saved first, with any uploaded files.
- The lead email goes to the recipients (and CC). The confirmation email goes to the visitor when enabled.
- The email result is recorded on the lead (
sent, orfailedwith the reason), so a delivery problem never loses a lead. - Hidden spam traps and a per‑visitor rate limit run silently. Suspicious submissions are dropped without an error.
What the lead email contains
The lead email
- Subject:
{Subject prefix} · {Page title} · {visitor name or email}, e.g. New lead · Test Drive Week · Ana Example. - Body: page title, submission time, then every answer as a label/value row in form order. Uploaded files appear as links; when the files are small (under 5 MB together) they are also attached.
- Reply‑to: the visitor's email address, so replying from your inbox goes straight to them.
- CC addresses receive an identical copy.
- The confirmation email to the visitor carries your subject and message exactly as typed in the Delivery tab.
Leads
Click the red N leads → button in the list (or the inbox icon under Actions), or Leads → in the editor header.
Leads list
- Search matches any answer; the date pickers filter by submission day. 50 leads per page.
- Email status pill:
sent,failed(hover for the reason),pending,skipped. - Verified pill: Verified means the submission passed the invisible form protection check; Legacy marks leads stored before the check existed; Check off only appears on development sites.
- Click a row (or the eye icon) to open the detail dialog: every answer, file links, consent, locale, referrer, verification, and both email statuses. Delete lead sits at the bottom of the dialog.
Lead detail
- Export CSV downloads every lead for the page. Columns follow the form's field order (plus any field that existed on older leads), then Consent and Email status. Opens directly in Excel.
- Delete removes a lead permanently.
Campaign recipes
| Campaign | Suggested fields | Delivery |
|---|---|---|
| Test‑drive week | Full name*, Email*, Phone*, Vehicle picker*, Preferred date, Dropdown "Preferred showroom", Consent checkbox* | Sales inbox; confirmation on: "We will call within one business day to confirm your slot." |
| Trade‑in valuation | Full name*, Email*, Phone, Short text "Current vehicle (make, model, year)", Number "Mileage", File upload "Photos" (images, 10 MB), Consent | Sales manager + CC showroom; confirmation on |
| Launch event RSVP | Full name*, Email*, Number "Guests", Multiple choice "Session" (Morning / Afternoon), Consent* | Marketing inbox; confirmation on with the event address; Redirect to an event page after submit |
| Brochure download | Email*, Vehicle picker, Consent* | Marketing inbox; confirmation on with the brochure link in the message |
* = required.
CSV export columns
Export gives one row per lead:
Submitted at · one column per form field, in the form's current order, headed by the field label · any field that existed on older leads but was later removed · Consent (Yes / No) · Email status (sent / failed / pending / skipped) · Verification (Verified / Legacy / Check disabled).
File fields contain the file link. Times are in UTC (ISO 8601). The file opens directly in Excel and Google Sheets.
Limits
| Limit | Value |
|---|---|
| Fields per form | 30 |
| Banners per page | 12 |
| Text sections | no fixed limit |
| Options per dropdown / multiple choice | no fixed limit |
| Single file | 1–10 MB (set per field, default 5) |
| All files in one submission | 20 MB |
| Text answer length | 2,000 characters |
| Submissions per visitor | 10 per 10 minutes, then the visitor is asked to try later |
| Leads shown per page in the admin | 50 |
Privacy and data
- Every lead stores the answers, files, the language the visitor used, the referring page, and the consent answer.
- Consent wording is yours to set per page (Settings → Consent text). Make sure it matches your privacy policy and keep the consent checkbox required for marketing follow‑up.
- Uploaded files are stored with the site's media and are reachable by anyone who has the exact link (the link is only in the lead and the email). Delete the lead to remove the reference; ask the development team to purge the file itself if required.
- Deleting a page keeps its leads; deleting a lead is permanent.
- Leads never leave this site's own database except by email and by CSV export.
Before you publish — checklist
- Slug is short, lowercase and final
- At least one recipient in Delivery, and it is monitored
- Consent checkbox present and required; consent text approved
- Form tested in the live preview: every required field makes sense
- Banners have alt text; text sections read well on mobile
- SEO title and description filled in
- A test submission from your own phone arrived by email and shows in Leads
- Redirect URL (if used) opens the right page
FAQ
Can visitors see other people's leads? No. Leads are only visible in the admin panel.
Can I edit a page that is already live? Yes. Changes apply the moment you save. Consider unpublishing first for large rework.
Can two pages share a form? Not directly — duplicate the page and adjust.
What happens if the recipient address bounces? The provider reports the failure and the lead shows failed with the reason. Fix the address and follow up manually.
Can I translate a page? UI labels (Send, error messages, "optional") follow the visitor's language automatically. Your own headings and texts are shown as typed. Create one page per language if needed, e.g. /lp/test-drive-week and /lp/semaine-essai.
Does a page appear in Google? Published pages are listed in the sitemap and can be indexed. Unpublish when the campaign ends.
Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
| Save says Add at least one recipient email | Delivery tab has no recipients | Add an address, save again |
| Save says Slug … is already used | Another page has that slug | Change the slug in Settings |
| Page shows not found | Page is a Draft, or the slug in the link is wrong | Check the Status column and the URL |
| Lead has status failed | The mail provider rejected the send (bad address, provider outage) | Fix the recipient, then follow up manually — the lead and its answers are safe |
| Visitor says a file was rejected | Wrong type or over the size limit | Check the field's accepted files and max MB in the field editor |
| Vehicle picker is empty | The catalog has no vehicles | Add vehicles in Catalog |
Note: Leads are not included in Sync to other projects. Uploaded files are stored with the site's media and reachable by link.
9. Exterior Colors
What it controls: The available exterior paint color options that can be assigned to vehicle models.
How to open it
- Click "Exterior Colors" in the left sidebar under Colors
The colors table
Colors table
| Swatch | Name | Hex Code | Actions |
|---|---|---|---|
| Pearl White | #F5F5F0 | Edit ✕ | |
| Midnight Black | #1A1A1A | Edit ✕ | |
| Azure Blue | #1E4D8C | Edit ✕ |
Adding a new color
- Click "Add Color"
- Fill in:
- Name (required) — Color name shown on the website (e.g.
Pearl White) - Hex Code (required) — 6-character color code starting with
#(e.g.#FFFFFF)
- Name (required) — Color name shown on the website (e.g.
- Click Save
Finding a hex code: Use htmlcolorcodes.com to pick a color and copy the code. Or search online for the color name + "hex code".
Editing a color
- Click "Edit" on the color row
- Update the Name or Hex Code in the dialog
- Click Save
Changes to a color name or swatch will update everywhere it appears across all vehicle pages.
Deleting a color
- Click ✕ on the color row
- Confirm the deletion
⚠️ First remove this color from all vehicles that use it, otherwise it will disappear from those vehicle pages.
10. Interior Colors
What it controls: The available interior color and trim options for vehicle models.
The process is identical to Section 9 — Exterior Colors:
- Click "Interior Colors" in the left sidebar
- Click "Add Color" to create a new option
- Enter the Name (e.g.
Black Leather) and Hex Code (e.g.#1A1A1A) - Click Save
Interior colors are assigned to vehicles in the Colors tab of the vehicle form.
11. About Us
What it controls: The content of the About GAC page on the website — main image and body text.
How to open it
- Click "About Us" in the left sidebar under Settings
Editing the content
The About Us page has two sections:
Content (Rich Text)
Edit the page text using the rich text editor. The toolbar works the same as the Article editor — see Section 8 for the toolbar guide.
Desktop layout

Mobile layout

- Click the upload area (or "Replace image") to upload a new photo
- Click ✕ on the image to remove it
Click Save Changes when finished.
12. Warranty Page
What it controls: All content on the warranty page — the hero banner, the warranty coverage cards, and the partner logos.
How to open it
- Click "Warranty Page" in the left sidebar under Settings
Hero Section
| Field | Type | Description |
|---|---|---|
| Hero Heading | Text | Main heading in the banner, e.g. We've got you covered |
| Hero Subheading | Text | Supporting text below the heading |
| Hero Background Image | Image | Upload a background image for the banner |
Leave the background image empty for a plain-color background.
Warranty Items
Each entry produces one coverage card on the page.
Adding a new warranty type:
- Click "Add Warranty Item"
- Fill in the fields:
| Field | Description |
|---|---|
| Duration / Coverage | Bold coverage line at the top of the card, e.g. 7-Year Unlimited KM |
| Card Title | Warranty type name, e.g. New Vehicle Warranty |
| Image | Card illustration image (upload) |
| Description | Paragraph explaining what is covered |
| Fine Print / Note | Small-print text below the description (optional) |
| T&C Link Label | Text for the T&C link, e.g. View Terms & Conditions (leave blank to hide) |
| T&C Link URL | URL to the T&C document |
- Click Save, then Save Changes
Editing a warranty item:
- Click "Edit" on the item row
- Update the fields
- Click Save, then Save Changes
Removing a warranty item:
- Click ✕ on the item row
- Click Save Changes
Reordering warranty items:
Click the ↑ or ↓ buttons to move items up or down, then click Save Changes.
Our Partners
Each entry produces one partner logo tile in the grid.
Adding a partner logo:
- Click "Add Partner"
- Fill in:
| Field | Description |
|---|---|
| Partner Name | Accessible label and alt text for the logo |
| Website URL | URL the logo links to (opens in a new tab) |
| Logo Image | Upload the partner logo |
- Click Save, then Save Changes
Removing a partner:
- Click ✕ on the partner row
- Click Save Changes
12a. Translations
The website can be shown in English, French, and Spanish. English is the master copy: it is what you type on every other page of the admin panel. French and Spanish are overlays — you fill in only the words you want changed, and anything you leave blank automatically shows the English text instead.
That fallback is the single most important rule on this page:
A blank field is not an error. It means "show the English words here." You can translate the site a little at a time and the public website never breaks or shows an empty space.
Step 1 — Turn the languages on
Nothing you translate appears to visitors until the language is enabled in Site Config.
- Click Site Config in the left sidebar
- Scroll to the Localisation group
- Click Français and/or Español so they turn green
- Choose a Default Language — this is what a first-time visitor sees before they pick anything
- Click Save Changes
Site Config — Localisation
Enabled Languages
Languages visitors can choose on the site. English is always on.
Español is off here → the language never appears on the public site, even if it has translations.
Default Language
Shown to first-time visitors before they pick a language.
| Setting | What it does |
|---|---|
| Enabled Languages | Which languages appear in the globe menu on the public site. English is always on and cannot be switched off. |
| Default Language | The language shown to a visitor who has never chosen one. Must be one of the enabled languages. |
Note: If only English is enabled, the globe menu is hidden from the website completely.
Step 2 — Open the Translations page
Click Translations in the left sidebar, under Settings. The page is split into six sections, each covering a different part of the website.
Translations page — the six sections
Translations
Manage French and Spanish copy for the site. Blank fields fall back to the English content automatically.
Navigation
Open in StudioHome Page
Open in StudioWarranty Page
Open in StudioAbout Us
Open in StudioArticles
Open in StudioVehicles
Open in Studio| Section | What you translate |
|---|---|
| Navigation | Menu labels in the header, including dropdown items |
| Home Page | Banner titles, descriptions, alt text, and CTA labels — plus each Why GAC item's label, title, body, and bullet points |
| Warranty Page | Hero heading and subheading, warranty cards, partner names |
| About Us | The main body text |
| Articles | Headline, summary, and body of each news article |
| Vehicles | Banner, design, exterior, performance, interior, safety feature, and contact text for each vehicle |
Each section also has an Open in Studio ↗ link in its top-right corner. You only need it for the rare cases noted further down — the admin panel handles everyday translating.
Step 3 — How the side-by-side editor works
Navigation, Home Page, and Warranty all use the same side-by-side layout: an English column you cannot edit, next to a Français column and an Español column.
Side-by-side editor — English never changes
English
Français
Español
Grey italic text is a preview, not a saved value. About GAC has no Spanish, and Contact Us has neither — visitors in those languages see the English words instead.
| Column | Meaning |
|---|---|
| English | Read-only. This is your original text, shown so you know what you are translating. To change it, edit the original page (Navigation, Home Page, Warranty Page). |
| Français | Type the French wording here |
| Español | Type the Spanish wording here |
Things to know:
- The grey placeholder text inside an empty box is a preview of the English fallback, not a saved value
- The bar at the bottom shows "You have unsaved changes" until you click Save Changes
- Rows are matched to the English item behind the scenes. If you rename or reorder items on the original page, the translations stay attached correctly
- On the Navigation section, dropdown children are indented under their parent menu item
Warning: If you clear every field for one language and save, that language's translation is deleted and the site falls back to English everywhere for it. A confirmation box appears first — read it before clicking OK.
Navigation, Home Page, and Warranty
These three are edited directly on the Translations page — no dialog, no extra clicks.
| Section | Fields per row |
|---|---|
| Navigation | Menu label (plus a label for each dropdown child) |
| Home Page | Banners: Title, Description, Alt Text, CTA Label — one group per banner. Why GAC: Label, Title, Body, Bullets — one group per item. |
| Warranty Page | Hero Heading, Hero Subheading, then Duration / Coverage, Card Title, Description, Fine Print / Note, and T&C Link Label for each warranty card, plus Partner Name for each partner |
Each section has its own Save Changes button. Saving one does not save the others.
Note: The Why GAC Body and Bullets fields are plain text boxes, not a formatting toolbar. Separate body paragraphs with a blank line, and put one bullet per line. Bold, italic, and list formatting from the English version is not carried over — use Open in Studio ↗ for a translation that needs formatting.
Articles and Vehicles
These have too many fields for a flat list, so each one gets a row in a table and opens in a dialog.
Articles & Vehicles — translation status
Title
Published
FR
ES
- Find the article or vehicle in the table (vehicles have a search box — search by name or series)
- Read the FR and ES pills: green Translated means a translation exists, grey Missing means it does not
- Click Edit translations
- Fill in the French and Spanish columns
- Click Save Changes
Note: "Translated" only means something has been filled in — not that every field is done. A vehicle with one translated banner still shows the green pill.
Inside the vehicle dialog, the fields are grouped into collapsible sections: Banners, Design, Exterior, Performance, Interior, Safety Features, Contact. Click a heading to open it. Sections the vehicle has no English content for are hidden, so a shorter dialog simply means a shorter vehicle. Each Safety Feature has its own English/French/Spanish description panels, since safety descriptions use rich text rather than plain fields.
The article dialog has a Title and Summary box per language, then the article body underneath in the same rich-text editor described below.
Translating rich text (About Us, article bodies, and Safety Features)
Long-form text uses a different editor with a formatting toolbar.
About Us, article bodies & Safety Features — rich text
Links and images are not carried over by this editor — text blocks only. Use Open in Studio for translations that contain them.
- Read the English (reference) panel — it is read-only, purely so you can see what you are working from
- Type the translation into the French and Spanish panels below it
- Use the toolbar for bold, italic, headings, and lists (Safety Feature descriptions omit headings — bold, italic, and lists only)
- Click Save Changes
Warning: This editor handles text only. Links and images in the English version are not copied across and cannot be added here. If the text you are translating contains a link or an inline image, use Open in Studio ↗ for that piece instead.
What visitors see
Once a language is enabled, a globe icon appears in the website header.
What the visitor sees

- Clicking it opens the language list, with a tick beside the current language
- The choice is remembered for one year, so returning visitors stay in their language
- On mobile, the same list appears inside the hamburger menu
- Any text you have not translated shows in English — the page never comes up blank
Worked example — translating one menu item
- Go to Site Config → Localisation and turn on Français, then Save Changes
- Go to Translations
- In the Navigation section, find the row where the English column reads Models
- Type
Modèlesin the Français box - Click Save Changes — the bar turns green and reads Changes saved
- Open the public website, click the globe, choose Français
- The menu now reads Modèles. Every other menu item is still English, because you have not translated those yet — exactly as intended
Troubleshooting
| Problem | Cause and fix |
|---|---|
| The globe icon is missing from the website | Only English is enabled. Turn on French or Spanish in Site Config → Localisation → Enabled Languages. |
| I switched language but the text is still English | That field has not been translated yet. A blank field always falls back to English. Check the box is filled in and saved. |
| I typed a translation but nothing changed | You did not click Save Changes for that section. Each section saves separately. |
| I saved but the website still shows the old wording | Wait about 30 seconds and reload. If it persists, run a cache refresh — see 3a. Cache Refresh. |
| My French translations vanished | A save with every field emptied deletes that language's translation. Re-enter the text and save again. |
| A link or image disappeared from my translated article | The rich text editor does not carry links or images over. Use Open in Studio ↗ for that article. |
| A vehicle section is missing from the dialog | The vehicle has no English content for that section. Add it on the Vehicles page first, then translate it. |
13. Tips & Common Tasks
How to upload an image
Every image field works the same way:
- Click the upload area or "Click to upload image" button
- Either:
- Click "Browse files" and select a file from your computer, or
- Drag and drop the image file onto the upload area
- Wait for the upload to complete (a progress bar is shown)
- After uploading, the image preview is displayed
Image upload field
- Click ✕ to remove the image
- Click "Replace image" to swap it with a different file
- Accepted formats: JPG, PNG, WEBP, GIF
How to generate a slug
The Slug is the URL-friendly version of a title (e.g. the slug for "Tiggo 9" is tiggo-9).
- Slugs are auto-generated when you enter a title — you do not need to type them
- Click "Generate" next to the slug field if it does not auto-fill
- Do not edit slugs after a page is live — changing a slug changes the URL, which breaks existing links and bookmarks
Title and Slug fields
How to find a hex color code
A hex color code is a # followed by 6 characters, e.g. #BE8751.
- Go to htmlcolorcodes.com and use the color picker
- Or search online:
pearl white hex code
How to quickly check what is on the website
The Dashboard (click "Dashboard" in the sidebar) shows:
- Total article count and featured article count
- Total vehicle count
- Color counts
- Recent articles and vehicles
- Login activity for the last 7 days
14. Sync
The Sync page lets you copy all published content from this project (the source) to one or more other Sanity projects (destinations). This is useful for keeping a staging site, a regional copy, or any connected project up to date without manual exports or developer involvement.
Where to find it
Click Sync under the Tools section in the sidebar.
What you see on the page
Sync page
abc123 / productionSource card — shows the project ID and dataset this admin panel is connected to, the total number of published documents, and a breakdown by content type.
Destination cards — one card per connected destination. Each card shows:
| Element | What it means |
|---|---|
| Project name / ID | The destination project and dataset |
| In sync badge | All documents exist in the destination and their content matches the source |
| Partial badge | Some documents are missing or one or more documents exist in both but have different content |
| Out of sync badge | No documents have been synced yet |
| X / Y documents synced | How many destination documents exist out of the total source documents |
| Whitelist tags | When shown, only those specific content types are synced to this destination |
| Schema Objects table | Per-type breakdown — Dest count / Source count, with a tick (identical), a red -N (missing), or an orange N ~ (content changed) |
Syncing content
Sync a single destination
- Find the destination card you want to update
- Click Sync Now
- A progress indicator appears below the button showing the current phase (e.g. Checking assets…, Uploading assets 3/12, Writing documents 45/142)
- When complete, the button area shows how many documents were synced (e.g. 142 synced) or lists any errors
Sync all destinations at once
Click the Sync All button in the top-right of the page. This runs a sync to every configured destination in sequence and shows a summary when done.
What gets synced
- All published documents (drafts are never synced)
- Images and files — any image or file assets referenced by your documents are copied to the destination project first, before the documents are written
- Content types in the Whitelist (if configured for a destination) — when a whitelist is set, only those types are synced; all others are skipped for that destination
The following internal types are always excluded:
- Analytics events
- System documents (
system.group,system.retention) - Raw asset records (
sanity.imageAsset,sanity.fileAsset) — assets are re-uploaded rather than copied as raw records
Reading the progress bar
While a sync is running, a small progress bar appears under the Sync Now button:
Sync progress bar
The sync happens in two phases:
- Assets — images and files are uploaded to the destination (skipped if already present)
- Documents — all content documents are written to the destination
After syncing
- The destination card badges and counts refresh automatically after each sync without needing a full page reload
- If the sync shows errors, an error log expands below the button listing the affected document IDs and the reason each failed
- Only documents that are new or have changed content are written — if everything is already identical, the sync completes instantly with nothing written
Errors
| Error | Likely cause | What to do |
|---|---|---|
| Source credentials not configured | Environment variables for the source project are missing | Contact your system administrator |
| No SANITY_DEST_TARGETS configured | No destinations have been set up | Contact your system administrator |
| A specific document ID error | The document has an invalid field or references a type not in the destination schema | Contact your system administrator with the error log |
Note: The Sync page is a Tools feature intended for administrators. Content managers do not need to use it during normal day-to-day work.
14a. Form Protection
Every public form — contact, call‑back, service request, test drive, model inquiry, lead pages, dealer onboarding — and the chat assistant are protected by an invisible proof‑of‑work check. There is nothing for visitors to click or solve: while they type, their browser quietly performs a small computation and attaches the result to the submission. The server verifies it in a fraction of a millisecond.
Why it works: a human submits one form; a spam script tries to submit thousands. The check costs a second on a phone once, but the price doubles with every extra submission from the same connection within ten minutes, so automated floods grind to a halt while real visitors never notice.
What visitors may see:
| Message | Meaning | What to tell them |
|---|---|---|
| We couldn't verify your browser. Please enable JavaScript or contact us by phone. | JavaScript is disabled, the browser is very old, or a privacy extension blocked the check | Enable JavaScript or try another browser; take the enquiry by phone |
| The send button shows a spinner a little longer than usual | Their connection submitted several forms recently, so the check is deliberately slower | Wait a few seconds; it completes on its own |
Nothing changes in the admin panel. Rejected attempts are recorded in the server logs, not in Sanity.
Developer note:
POW_SECRETmust be set in production (openssl rand -hex 32); without it protected endpoints refuse all submissions.POW_BASE_BITStunes the base difficulty (default 16).POW_DISABLED=trueswitches the check off in development only.
15. Troubleshooting
The Save Changes button is greyed out
There are no unsaved changes — your content is already up to date.
An error message appears after clicking Save Changes
| Error | Cause | Fix |
|---|---|---|
Required field missing | A required field is empty | Fill in all required fields (marked with *) |
Image upload failed | Network issue during upload | Check your internet connection and try again |
Save failed | The server could not be reached | Refresh the page and try again; contact your admin if the issue persists |
My changes are not showing on the website
- Make sure you clicked Save Changes (not just edited the form)
- Vehicle and content pages are cached for fast loading. After saving, the cache is automatically cleared — changes typically appear within a few seconds.
- Hard-refresh your browser:
Ctrl + Shift + R(Windows) orCmd + Shift + R(Mac) - If the change still does not appear after 30 seconds, contact your system administrator — the automatic cache update (webhook) may not be configured correctly.
I cannot log in
- Check that Caps Lock is off
- Click "Forgot password?" on the login page to reset your password
- Contact your system administrator if the issue persists
A color I created is not appearing in the vehicle color dropdown
Colors must be created and saved before they appear in the vehicle form dropdowns. Go to Exterior Colors or Interior Colors, create the color, then return to the vehicle form.
I accidentally deleted something
Contact your system administrator as soon as possible. Sanity keeps a history of all content — deleted items can often be recovered within a short period.
16. Transactional Emails
The website sends automated emails in response to visitor actions — contact form submissions, service requests, vehicle inquiries, and dealer onboarding submissions. This section describes each email, who receives it, and what information it contains.
All emails share the same visual style: a blue header, gold-accented section titles, and a light footer. The active email provider (Resend, SMTP, or Mailgun) is configured in the server environment and is transparent to the templates — the emails look and behave the same regardless of provider.
Note: Email delivery requires the
EMAIL_PROVIDERenvironment variable and the corresponding API key to be configured by your system administrator.
Contact Form Email
Sent when a visitor submits the Contact Us form found on the main contact page.
Received by: The contact email address configured in CONTACT_EMAIL, with copies sent to the admin email (ADMIN_EMAIL) and any sales CC addresses (NEXT_PUBLIC_SALES_EMAIL_CCS).
Reply-to: Automatically set to the visitor's email address — replying to the email opens a reply directly to the visitor.
| Field | Description |
|---|---|
| Name | Visitor's full name |
| Visitor's email address | |
| Telephone | Visitor's phone number |
| Message | The message submitted by the visitor |
Contact form email — received by admin
Service Request Email
Sent when a visitor submits the Service Request form.
Received by: The service department email address configured in NEXT_PUBLIC_SERVICE_EMAIL, with a copy sent to the admin email (ADMIN_EMAIL).
Reply-to: Automatically set to the visitor's email address.
| Field | Description |
|---|---|
| Name | Customer's full name |
| Customer's email address | |
| Telephone | Customer's phone number |
| Make | Vehicle make (e.g. GAC) |
| Model | Vehicle model name |
| Year | Vehicle model year |
| VIN | Vehicle identification number |
| License Plate | Vehicle registration plate |
| Mileage | Current odometer reading |
| Additional Information | Any extra notes from the customer (optional — section is hidden when empty) |
Service request email — received by service department
Model Inquiry Email
Sent when a visitor submits the contact form on a vehicle model page (e.g. the Tiggo 9 page).
Received by: The contact email address (CONTACT_EMAIL), with copies to the admin email and any sales CC addresses.
Reply-to: Automatically set to the visitor's email address.
This email includes a Vehicle of Interest section at the bottom containing the vehicle's hero image, model name, price (if pricing is enabled), and direct links to the model page and spec sheet PDF.
| Field | Description |
|---|---|
| Name | Visitor's full name |
| Visitor's email address | |
| Telephone | Visitor's phone number |
| Message | The visitor's inquiry message |
| Vehicle image | Hero image of the model (from Sanity) |
| Model name | Name of the vehicle model |
| Price | Starting price (only shown if pricing is enabled) |
| Model page link | Link to the vehicle page on the website |
| Spec sheet link | Link to the spec sheet PDF (if uploaded in Sanity) |
Model inquiry email — received by admin (includes vehicle card)
Model Inquiry Confirmation Email
Sent automatically to the visitor immediately after they submit a model inquiry. This confirms their submission was received and gives them a reference of what they sent.
Received by: The visitor who submitted the form (their email address from the form).
This email is sent in addition to the admin notification — both emails are sent at the same time when the form is submitted.
| Field | Description |
|---|---|
| Personalised greeting | Addresses the visitor by their first name |
| Submission recap | A copy of the contact details and message they submitted |
| Vehicle card | Same vehicle card as the admin email (image, name, price, links) |
Model inquiry confirmation — sent to the visitor who submitted the form
17. GDPR & Cookie Consent
Manage cookie consent banner settings for the site. Changes stored in Sanity and take effect on the next page load for new visitors.
Admin location: Admin Panel → Settings → GDPR & Cookies (/admin/gdpr)
Consent Banner
| Setting | Description |
|---|---|
| Cookie Banner Active | Toggle to show or hide the consent banner for all new visitors. When off, no consent is requested and no consent record is stored. |
| Policy Version | Version string (e.g. 1.0, 1.1). Bumping this re-prompts every visitor to accept or reject cookies — use when your policy materially changes. |
| Privacy Policy URL | URL shown in the banner's policy link. Default: /privacy-policy. |
Company name shown in the banner is pulled from Site Config → Company Name — update it there.
GDPR & Cookie Consent — admin page
Cookie Categories
Controls which optional categories appear in the Cookie Preferences modal.
| Category | Configurable | Notes |
|---|---|---|
| Strictly Necessary | No (always on) | Session, security, load balancing |
| Functional / Preferences | No (always shown) | Language, theme, form autofill |
| Analytics & Performance | Yes | Google Analytics, page view tracking |
| Marketing & Advertising | Yes | Remarketing, ad targeting |
Toggle Analytics and Marketing on or off from the admin panel. The other two categories are always present in the modal.
Turning off a category in the admin hides it from the modal entirely — visitors can no longer opt in to that category.
How Consent Works
- First visit — banner appears at the bottom of the screen with three equal-weight buttons: Reject All, Cookie Settings, Accept All.
- Cookie Settings — opens the preferences modal where visitors can toggle individual categories.
- Consent stored — choice is saved to
localStorage(gac-consent) and a first-party session cookie (gac-consent-given). - Version mismatch — if the stored consent version differs from the current policy version, the banner reappears and the visitor must consent again.
- Google Analytics — only loads after the visitor consents to the Analytics category.
Privacy Policy Page
A full privacy policy page lives at /privacy-policy. It includes:
- Detailed explanation of all cookie categories and what they track
- A cookie table listing specific cookies set by the site
- An inline Cookie Settings button that opens the preferences modal directly from the page
The page content is hardcoded in src/app/privacy-policy/PrivacyPolicySections.tsx. Update that file to reflect any changes to your actual cookie or data processing practices.
Cookie consent banner — shown to visitors on first visit
18. Analytics
What it controls: Visitor traffic, page engagement, device and country breakdown, and model-specific interaction data collected from the live website.
How to open it
- Click "Analytics" in the left sidebar under Tools
18a. Dashboard
The dashboard header shows the total event count and date range for the current view. Use the date range selector (top-right) to switch between the last 7, 30, 60, or 90 days.
KPI cards
Four summary cards appear at the top of the page:
| Card | What it shows |
|---|---|
| Unique Visitors | Number of distinct browser sessions in the selected period |
| Total Pageviews | Total number of page loads recorded |
| Bounce Rate | Percentage of sessions that viewed only one page before leaving |
| Events / Visitor | Average number of page loads per session (e.g. 2.5) |
Charts
| Chart | What it shows |
|---|---|
| Time Series | Line graph of event volume across each day in the selected range |
| Model Engagement | Grouped bar chart comparing Visits, Spec Sheet Downloads, Form Submissions, and WhatsApp clicks across the top vehicle models |
Data tables
The lower half of the dashboard shows breakdowns across multiple dimensions:
| Table | Columns |
|---|---|
| Top Pages | Page path · Visitors · Pageviews |
| Top Referrers | Source domain · Visitors · Pageviews |
| Countries | Country name · Visitor count · Percentage |
| Devices | Device type · Visitor count · Percentage |
| Browsers | Browser name · Visitor count · Percentage |
| Top Model Visits | Model name · Visit count |
| Spec Sheet Downloads | Model name · Download count |
| Form Submissions | Model name · Submission count |
| WhatsApp Redirects by Model | Model name · Click count |
Each row shows a horizontal bar for quick visual comparison.
18b. Data Source Toggle
The File / Sanity / Both toggle at the top of the analytics page controls where event data is read from.
| Option | What it reads |
|---|---|
| File | Local NDJSON archive files only (events stored on the server filesystem) |
| Sanity | Sanity monthly archive documents only |
| Both (default) | Merges data from both sources and removes any duplicates |
When to change it: Leave it on Both for normal use — this gives the most complete picture. Switch to File or Sanity only when you want to verify one source in isolation (e.g. after a migration).
18c. Data Retention
The Data Retention panel appears at the bottom of the analytics page. It helps you manage storage by archiving old events to files and removing them from Sanity, keeping usage below Sanity's 10,000-document limit.
Usage indicator
A colour-coded bar shows how many analytics event documents are currently stored in Sanity:
| Bar colour | Usage level |
|---|---|
| Green | Below 75 % — comfortable headroom |
| Amber | 75–89 % — consider archiving soon |
| Red | 90 % or above — archive and prune urgently |
Cutoff setting
The Cutoff field sets how many days of recent events to keep. Events older than this threshold are the ones archived or pruned.
- Accepted range: 1–365 days
- The default is set by the
ANALYTICS_RETAIN_DAYSserver environment variable (ask your system administrator) - Automatic run: Archive + prune runs automatically every Sunday at 03:00 — you only need to trigger it manually if you want to run it outside that schedule
Action buttons
| Button | What it does |
|---|---|
| Archive to Files | Writes events older than the cutoff to monthly NDJSON files on the server. Events remain in Sanity — this is a backup step only. |
| Prune from Sanity | Permanently deletes events older than the cutoff from Sanity. Does not create a backup. Run Archive to Files first if you want to keep the data. |
Recommended sequence: Click Archive to Files first, verify the result message, then click Prune from Sanity to free up document quota.
Archive files list
Below the action buttons, every existing archive file is listed:
| Column | Description |
|---|---|
| Filename | Monthly file name in analytics-YYYY-MM.ndjson format |
| Size | File size (shown in B, KB, or MB) |
| Download | Click the download icon to save the raw NDJSON file to your computer |
Legacy migration (one-time)
If a banner appears saying "Legacy per-event docs in Sanity", the account still has old-style individual event records that predate the current monthly archive structure. Two buttons are shown:
| Button | What it does |
|---|---|
| Consolidate to Monthly Docs | Groups the legacy events into monthly Sanity documents (same structure as new events). Deletes the individual records after consolidation. Keeps data in Sanity in the new format. |
| Copy to Local Files | Writes all legacy Sanity events to NDJSON files and clears them from Sanity entirely. Best if you want to move off Sanity storage completely. |
Run either migration once — the banner disappears when no legacy records remain.
19. Application Architecture (Developer Reference)
Audience: This section is for developers building or extending the site. Content managers do not need to read it.
The application follows a strict layered architecture. Each layer has one responsibility. All new features must follow the same pattern.
19a. Layer Overview
┌─────────────────────────────────────────────────────────┐
│ UI Layer (src/components/, src/app/**/page.tsx) │
│ React components — renders data, fires user events │
├─────────────────────────────────────────────────────────┤
│ Page / Server Component Layer (src/app/**/page.tsx) │
│ Fetches data server-side, passes props to components │
├─────────────────────────────────────────────────────────┤
│ API Routes (src/app/api/**/route.ts) │
│ REST endpoints for mutations and client-initiated sends │
├─────────────────────────────────────────────────────────┤
│ Service Layer (src/lib/) │
│ email/, sanity/, auth/, templates, currencies, … │
├─────────────────────────────────────────────────────────┤
│ Data Layer (Sanity CMS, Auth0, Email providers) │
│ Sanity GROQ queries, IEmailProvider, IAuthProvider │
└─────────────────────────────────────────────────────────┘
| Layer | Location | Responsibility |
|---|---|---|
| UI | src/components/ | Renders HTML, handles local state and user input. No direct Sanity or email calls. |
| Page / Server Component | src/app/**/page.tsx | Runs server-side. Calls sanityFetch / service functions. Passes data as props. |
| API Route | src/app/api/**/route.ts | Handles POST / PATCH / DELETE from the browser. Validates input, calls service layer, returns JSON. |
| Service | src/lib/ | Business logic: email sending, Sanity reads/writes, auth, template rendering. No HTTP concerns. |
| Data | Sanity / Auth0 / Email provider | External systems. Accessed only through service abstractions (IEmailProvider, IAuthProvider). |
19b. Example — Contact Form Submission
A user fills in the contact form and clicks Send Message.
Step 1 — UI Component (src/components/forms/contact-form.tsx)
The component fires a fetch to the mail API. It does not know or supply the recipient address — it passes audience: 'sales' so the server resolves who receives it.
const response = await fetch("/api/mail/send", {
method: "POST",
body: JSON.stringify({
audience: 'sales', // recipient resolved server-side
subject: "Message from Alice",
template: "contact", // maps to src/email-templates/contact.hbs
variables: { name, email, telephone, message },
}),
});
Step 2 — API Route (src/app/api/mail/send/route.ts)
// 1. Validates the request body.
// 2. Detects audience === 'sales'.
const { salesEmail, salesEmailCCs } = await getCorrespondenceConfig();
// 3. Renders the Handlebars template.
const html = renderTemplate(template, variables);
// 4. Sends via the active email provider.
await sendMail({ to: [salesEmail, ...salesCCs], subject, html, replyTo: variables.email });
Step 3 — Service: Correspondence Config (src/lib/sanity/getCorrespondenceConfig.ts)
Reads correspondence.salesEmail from the Sanity siteConfiguration document. Validates it looks like a real email address (looksLikeEmail). Falls back to NEXT_PUBLIC_SALES_EMAIL env var if Sanity is empty or invalid.
Step 4 — Service: Email (src/lib/email/index.ts)
Reads the EMAIL_PROVIDER env var. Instantiates the correct provider (Resend, SMTP, or Mailgun). Calls provider.send(input) — the rest of the app never touches provider-specific APIs.
Step 5 — Data Layer
Sanity returns the configured email address. The email provider delivers the message.
19c. Example — Vehicle Model Page
A user navigates to /models/tiggo-7-pro.
Step 1 — Page (Server Component) (src/app/models/[slug]/page.tsx)
// Runs on the server — no client bundle cost.
const [vehicleRes, siteConfigRes] = await Promise.all([
sanityFetch({ query: getVehicleBySlug, params: { slug } }),
sanityFetch({ query: getSiteConfiguration }),
]);
const currency = enrichCurrency(
getCurrency(siteConfigRes.data?.currency),
siteConfigRes.data?.priceDisplay
);
Step 2 — Service: Sanity Queries (src/lib/sanity/queries.ts)
A GROQ query returns vehicle fields, image URLs, variants, and spec sheets. The result is cached by Next.js ISR and only re-fetched when Sanity fires the /api/revalidate webhook on publish.
Step 3 — Service: Currency (src/lib/currencies.ts)
enrichCurrency() merges the site config custom price format into the CurrencyConfig so PricePill renders "Starting from TTD 249,900" — or a custom prefix/suffix if configured in the Admin → Site Config.
Step 4 — UI Component (src/components/layout/price-pill.tsx)
// Receives the enriched CurrencyConfig as a prop — no Sanity knowledge.
<PricePill price={vehicle.price} currency={currency} />
Step 5 — Data Layer
Sanity CDN serves the cached GROQ result. The page is statically cached by Next.js ISR and only re-rendered when Sanity fires the /api/revalidate webhook.
19d. Adding a New Feature
Scenario: Add a "Finance Calculator" page that reads interest rates from Sanity and renders a client-side form.
| Step | File to create or edit | What to do |
|---|---|---|
| 1 — Sanity schema | schemas/finance-rates.ts | Add a new document type with rate, term, minDeposit fields |
| 2 — GROQ query | src/lib/sanity/queries.ts | Add getFinanceRates query |
| 3 — TypeScript type | src/types/finance-rates.ts | Add FinanceRates interface matching the schema |
| 4 — Page | src/app/finance/page.tsx | Server component: fetch rates via sanityFetch, pass to the calculator |
| 5 — UI Component | src/components/finance/FinanceCalculator.tsx | Client component ("use client"): receives rates as props, handles local state |
| 6 — Admin API (if editable) | src/app/api/admin/finance-rates/route.ts | PATCH endpoint: validate body, write to Sanity via client.patch(), call revalidatePath |
| 7 — Admin UI (if editable) | src/app/admin/finance-rates/page.tsx | Admin form: fetch current rates server-side, POST changes to the API route |
Rule: The server component owns data fetching. The client component owns interactivity. The API route owns mutation. The service layer owns the external call. Never skip a layer.
Last updated: July 2026 — added Application Architecture section (19), updated Table of Contents
GAC Caribbean — Admin User Manual