Skip to main content
Every person who ever calls, texts, chats with the widget, or fills out a form lands in Contacts automatically. Deduplicated, with addresses and source tracked, conversation history attached, and tags + statuses you can use to organize.

What’s in the list

Each contact has:
  • Name + business name — captured from forms, AI conversations, or manual entry
  • Phone + email — primary contact methods, deduplication keys
  • Address — street, city, state, postal code (when collected)
  • Lifecycle — Lead, Qualified, Opportunity, Customer (or Lost) — where the relationship stands
  • Tags — free-form labels for any organization scheme you like
  • Source — how they reached you (widget, form, voice, manual import, reactivation)
  • Last interaction — when you last heard from them
  • Appointment count — how many bookings they’ve had

Searching and filtering

The list view (/dashboard/contacts) supports:
  • Free-text search across name, email, phone, and business name
  • Status filter — drop to one stage at a time
  • Tag filter — show only contacts with specific tags
  • Source filter — show only contacts from a specific channel
  • Sort by any column — name, phone, address, status, last interaction, appointment count

Detail view

Clicking a contact opens their detail page:
  • AI Summary (top) — a one-click AI briefing built from the contact’s notes, messages, appointments, and deals, so you get instant context instead of reading everything. Click Generate (or Refresh when there’s new activity). It sticks to what’s on the record — no invented details. Available on plans that include AI lead summaries.
  • Header — name and business; phone, email, and address (tap phone/email to call or write, or copy them); consent pills showing SMS and email opt-in status (tap to toggle); the editable lifecycle picker; an Assign to (assign the contact to a teammate); quick actions — Send message, call, book an appointment, request a review; tags; and an at-a-glance panel — the next open task for this contact (overdue flagged in red — click it to see all of this contact’s tasks, or to add one), source, next appointment, last activity, lifetime value, and created date. (Last activity tracks the most recent touchpoint logged in ServiceBooked — contact made outside the app isn’t counted.)
  • Deals — pipeline cards for this contact. Click one to open its details.
  • Appointments — past and upcoming.
  • Interaction log — every call, text, chat, email, and meeting note in chronological order.
  • Notes — timestamped, free-form notes.
The contact detail is your single source of truth for “what’s the story with this person?”

Bulk actions

Select multiple contacts (checkboxes) to:
  • Apply a tag to all selected
  • Change status in bulk
  • Delete in bulk (with a typed-DELETE confirm because this is destructive)
  • Export to CSV

Auto-deduplication

Two contacts that land with the same phone number (or same email) are automatically merged into one row — appointments, conversations, and notes from both are preserved. We dedupe on:
  • Email (case-insensitive, normalized)
  • Phone (normalized to E.164 — +16135551234)
If a person calls in (creating a contact with phone only), then later fills out a form with both phone and email, those are merged on phone match. The email gets added to the existing record. If you have actual duplicates that didn’t auto-merge (different phones, different emails, same person), you can manually merge from the detail page.

What about anonymous web visitors?

Visitors who chat the widget without sharing a phone or email are tracked as “visitor:abcd1234” — anonymous identifiers based on a localStorage token. If they later share a phone or book an appointment, the visitor record promotes to a real contact and the conversation history follows them.

Next

Add a contact manually

For walk-ins, referrals, or anyone who didn’t reach you through the system.

Import from CSV

Bring in your existing customer list when you start.