Audience
Track visitors, capture structured data from conversations, and take bookings.
Complete reference for the Audience section — visitor analytics, data collections, and booking calendars.
Hidden from agents and supervisors.
For the fast path, use the Quick Start.
Section map#
| Sidebar page | Path | What it is |
|---|---|---|
| Visitor Dashboard | /visitor-dashboard | Who visited the sites carrying your chat widget |
| Data Collections | /data-collections | Structured tables the AI reads and writes |
| Calendars | /calendars | Bookable calendars backed by a data collection |
Data collections are the load-bearing concept here. The same store powers the Call Centre lead book, workflow data lookups, campaign contact sources, and calendar appointments — so a change here is felt in several places.
Visitor Dashboard#
Filters
| Control | Notes |
|---|---|
| Widget | All widgets, or one specific widget |
| Start Date / End Date | Cannot be set past today |
The default range is the first of the current month through today.
This page is not live. It fetches when you open it or change a filter, and otherwise only on Refresh.
Tiles
| Tile | What it counts |
|---|---|
| Visitors In Range | Visitors seen in the window |
| Unique Visitors | Distinct visitors |
| Recurring Visitors | Visitors seen across more than one session |
| Tracked Locations | Distinct locations resolved |
| Page Views | Total page views |
| Avg Active Time | Mean active time per visitor |
Avg Active Time is active time, not time-on-page — it comes from heartbeats while the tab is actually in use, so it is a much more honest engagement figure than a raw duration.
How a visitor is identified
Each visitor gets an id that is unique per widget. The same person visiting two sites that carry two different widgets is two visitors, and there is no cross-widget identity stitching here. Compare a single widget over time rather than summing widgets.
Nothing here requires a login — this is anonymous website analytics, tied to the widget rather than to a customer record. To connect a visitor to a person, see Contacts, where Visitor ID is one of the identifier types.
What is tracked
| Group | Fields |
|---|---|
| Device | Type, OS, browser, user agent, language, timezone, screen and viewport size |
| Location | Country, region, city, coordinates, timezone, source |
| Per page | Path, URL, title, referrer, page type, page views, active time, heartbeats, events, engagement score |
| Timing | First seen, last seen |
Panels
Device Breakdown — a percentage split per device with a visitor count. Empty: No device data yet.
Location Breakdown — expandable region rows that drill down to cities. Empty: Waiting for visitor location data...
Page Details — columns Page, Type, Visits, Page Views, Unique, Recurring, Locations, Avg Active, Score, Devices. Empty: No visitor page data has been collected for this date range yet.
The Score column is an engagement score computed from active time, heartbeats, and events. Use it to find pages that hold attention rather than merely attract clicks.
Data Collections#
The collections list
Heading Data Collections, with a subheading counting collections and how many are sheet-linked.
| Control | Notes |
|---|---|
| Create Collection | Disabled at your plan limit, replaced by Upgrade to create more |
| Add Shopify data | Owner or admin, where Shopify collections are enabled |
| Search | Search collections... |
| Link filter | All collections, Sheet-linked, No sheet, Sync halted |
| Sort | Recently updated, Name, Most rows |
Each card shows row and column counts, when it was updated, and status chips:
| Chip | Meaning |
|---|---|
| Shopify · Products / Orders / Customers / Abandoned checkouts | A managed Shopify mirror |
| Sync failed, Syncing…, Synced {when} | Shopify sync state |
| Sheet linked, No sheet linked, Sync halted | Spreadsheet state |
| Used by {n} campaign(s) | A campaign depends on this collection |
Card actions: View Data →, an export menu (Export as CSV, Export as Excel), Edit, and delete.
Used by {n} campaign(s) is a warning, not decoration. Deleting such a collection breaks those campaigns' contact source, and the confirmation says so explicitly.
Empty: No data collections — Get started by creating a new data collection.
Creating a collection
Create New Collection — Define the structure for your data collection. Two modes:
| Mode | Behaviour |
|---|---|
| Start blank | Define columns by hand |
| Upload a file | Choose a .csv, .xlsx or .xls file — The schema is detected automatically · up to 7MB |
Multi-sheet workbooks prompt for a Worksheet — This file has multiple sheets — pick which one to import.
Some column names are reserved for the system; the form refuses until you rename them.
| Field | Notes |
|---|---|
| Collection Name * | Required — e.g., Customer Database, Product Catalog |
| Description | Optional |
| Columns * | At least one, names unique |
Column types
String, Number, Date, Boolean, Email, URL, Phone, each with an optional Required flag.
The type is not cosmetic. Phone and Email are what make a row addressable by SMS, WhatsApp, email, and the dialler; a phone number typed as String will not reliably work downstream. Fix types before importing thousands of rows.
Columns written by the platform are badged System — Written automatically by campaigns — cannot be edited or removed. Campaign slot answers and Call * outcome columns land here.
Renaming or removing a column that holds data warns first: Existing values will no longer be shown — the values stay in the database but stop appearing, and This cannot be undone from here.
Spreadsheet Sync
Optional, configured on the create or edit form.
| Control | Options |
|---|---|
| Enable Synchronization | Toggle |
| Provider | Google Sheets, Microsoft Excel |
| Google Account / Microsoft Account | A connected account |
| Folder Location | Root Folder, Select Folder, Create Folder |
| File Option | Create new file, Select existing file |
| Spreadsheet Title, Sheet Title | For a new file |
Accounts come from Integrations → Sheets. With none connected: No Google/Microsoft accounts connected. Go to Integrations → Sheets to connect one.
The sync is bidirectional. Rows flow both ways, conflicts resolve in favour of the more recently updated side, and column changes here are pushed to the sheet — Column changes are applied to the linked spreadsheet as well.
Once linked, the collection is pinned to that file: Spreadsheet Integration Active — This collection is locked to a specific Google Spreadsheet / Excel Workbook to maintain sync integrity.
If the sheet stops matching the expected layout, sync halts rather than corrupting data: Spreadsheet sync halted — sheet failed validation — Data here is safe and stays usable, but changes no longer flow to or from the sheet. Fix the sheet, then re-validate to resume synchronization. Fix the layout and press Re-validate.
The practical warning: people rearranging columns in the shared sheet is the single most common cause of a halted sync. If several people can edit the sheet, expect this.
The detail page
Header shows the name, row count, the backing import source, a link to the linked sheet, and the last sync time.
| Control | Notes |
|---|---|
| Add Entry | One row, typed inputs per column |
| Upload File | Append CSV or Excel |
| Manage Columns | Edit the schema |
| Export | Export as CSV, Export as Excel |
| Sync from Spreadsheet | Pull from the linked sheet |
| Delete All | Every row — This action cannot be undone |
Table controls: rows per page (10, 25, 50, 100), Search rows..., and a Filters panel offering a per-column value filter, Call Status where such a column exists, Sheet Sync (All, Synced, Not synced), and a created-date range. Rows are editable in place.
There is no template download anywhere — to get a correctly shaped file, create the collection and export it empty.
Shopify-managed collections
A collection mirroring Shopify is read-only: Synced from Shopify — read-only, with Rows refresh automatically every 30 minutes and a Sync now button.
Do not plan to edit these. To enrich Shopify data, copy what you need into a collection of your own. See FloGPT for Shopify.
Data collections as lead lists
A collection doubles as a lead list for the Call Centre. Alongside your columns, each row carries lead fields the calling floor maintains:
| Field | Values |
|---|---|
| Assigned rep and assignment time | — |
| Pipeline status | new, contacted, callback, won, lost |
| Potential | hot, warm, cold |
| Follow-up, first and last contacted timestamps | — |
| Tags, messaging opt-out | — |
This is why a collection built here appears as a lead list there, and why the Call * columns appear on rows you never touched. The two features are one store viewed two ways.
Calendars#
Each calendar wraps a data collection whose rows are appointments. One calendar per collection.
The calendars list
Cards show the calendar name, description, its backing collection, the appointment count, and the timezone, plus a sync pill — Not synced, Sync error, Syncing, Connected — and a Google or Microsoft provider chip. Actions: Open, Sync now, delete.
Empty: No calendars yet — Create your first calendar to start booking appointments through the call agent.
Deleting is deliberately conservative: The backing DataCollection (and all its appointment rows) will be preserved — only the calendar wrapper is removed. You can delete the DataCollection separately if you want the data gone.
Creating a calendar
| Field | Notes |
|---|---|
| Name | Required — e.g. Sales demos, Doctor visits |
| Description (optional) | |
| Timezone | All availability is interpreted in it |
| Slot duration (min) | 5–240, step 5, default 30 |
| Storage | Auto-create a new Data Collection or Use an existing Data Collection |
Take the recommended storage option — We'll create a Data Collection with the standard appointment columns (Start, End, Customer Name, Customer Phone, etc.). The existing-collection path exists for appointment data you already hold, and requires mapping columns by hand afterwards.
Availability settings
Settings on the detail page:
| Field | Range | Default |
|---|---|---|
| Slot duration (min) | 5–240 | 30 |
| Buffer (min) | 0–60 | — |
| Capacity per slot | 1–100 | 1 |
| Max advance days | 1–365 | 30 |
| Working hours | Per day, with enable and start/end times | Mon–Fri 09:00–17:00 |
Capacity per slot above 1 turns the calendar into a group booking — several people in the same slot, with the UI showing Remaining {r} / {c}. Leave it at 1 for one-to-one appointments.
Max advance days is how far ahead anyone can book. Set it to match how far ahead you can actually honour commitments.
Column mapping
Each appointment is a row in the backing Data Collection. Pick which column stores each field. Required fields (Start, End) must point at columns that exist on the Data Collection.
| Logical field | Default column |
|---|---|
| Start *, End * | Start, End |
| Customer name, Customer phone, Customer email | Customer Name, Customer Phone, Customer Email |
| Status, Notes, Source | Status, Notes, Source |
| External event id, External calendar id, External updated at | External Event ID, External Calendar ID, External Updated At |
Auto-created collections are mapped for you. You only touch this when you brought your own collection.
Booking
The month grid shows appointments per day, an Appointments ({n}) panel, and an Available slots list with a Block slot control per slot.
Book an appointment takes:
| Field | Rules |
|---|---|
| Date | Not in the past, not beyond Max advance days |
| Start time | Chosen from free slots; shows {n}-minute slots · {timezone} |
| Customer name | 2–80 characters, letters, spaces, hyphens, apostrophes, dots, commas |
| Phone (with country code) | E.164 — e.g. +919876543210 or +14155552671 |
| Email, Notes | Optional |
Block slot removes availability without creating a customer appointment — the right tool for holidays and meetings. With capacity above 1 it blocks all remaining seats.
Every appointment records how it arrived: from a call, manually, imported, from the external calendar, or as a manual block. Your voice and chat agents book through the same path and the same capacity rules, so a slot cannot be double-booked between a human and the AI.
External calendar sync
Sync with Google / Microsoft Calendar uses the accounts connected under Integrations → Sheets.
With none connected: No Google or Microsoft account connected for this organization. Go to Integration → Sheets and connect one.
The common failure is a connected account that lacks calendar scope: This account is missing Calendar permission. Disconnect and reconnect it under Integration → Sheets so Google/Microsoft can grant Calendar access, then try again. Reconnecting is the only fix — the permission cannot be added to an existing connection.
Pick an Account, Load its calendars, choose an External calendar, then Save sync config. Sync now runs it on demand, and the panel reports Last synced and Connected. Sync is bidirectional.
Troubleshooting#
| Symptom | Usual cause |
|---|---|
| Visitor numbers look doubled | Visitors are identified per widget; the same person on two widgets counts twice |
| Visitor dashboard looks stale | It does not auto-refresh — press Refresh |
| Waiting for visitor location data... | No location resolved yet for this range |
| SMS or dialling ignores a column | The column is typed String rather than Phone |
| A column cannot be edited | It is a System column written by campaigns |
| Old cell values vanished after renaming a column | Expected — the data remains but is no longer displayed |
| Upload rejected | Not .csv/.xlsx/.xls, or over 7MB |
| Cannot find a template to fill in | There is none; export an empty collection instead |
| Sync halted on a collection | Someone changed the sheet's layout — fix it and Re-validate |
| Rows will not edit | It is a Shopify-managed mirror, which is read-only |
| Deleting a collection warns about campaigns | A campaign uses it as its contact source |
| Calendar deleted but the data is still there | By design — delete the backing collection separately |
| Calendar sync fails on permission | The account lacks calendar scope; disconnect and reconnect it |
| AI booked outside working hours | Check the calendar's timezone, not just its hours |
| Slot shows as unavailable unexpectedly | Buffer minutes, or the slot was blocked with Block slot |
Related#
- Audience quick start
- Call Centre — the same collections as lead lists
- Chat — workflows that read and write collections
- AI Calls — call agents that capture data and book
- Integrations — Google and Microsoft accounts
- Support — contacts, where Visitor ID links a visitor to a person
- FloGPT for Shopify — Shopify-managed collections