Contacts, Leads & Revenue
Track user details, calculate conversion rates, record notes, assign team ownership, and execute direct live support handoffs for all inbound WhatsApp contacts.
Unified CRM & Contact Console
SyncFlo contains a built-in light relationship management layer that aggregates customer sessions initiated over WhatsApp. When a customer sends a message or completes a marketing flow, a contact record is automatically created or updated.
Through the dashboard's Contacts console, team managers can monitor deal pipelines, assign chats to agents, view conversation notes, import contacts from third-party files, and manually override data schema attributes.
1. Core Relationship Metrics
The top of the Contacts page displays four essential Key Performance Indicators (KPIs) calculated in real time:
Total Leads
Sum of all unique numbers registered on WhatsApp.
Active Leads
Contacts set to qualified or converted.
Win Rate %
Percentage of qualified leads out of total contacts.
Lost Leads
Contacts explicitly set to lost status.
2. Contact Attributes Schema
Each contact record holds structured attributes containing user identity, deal value, source markers, and assignment logs. The table below lists the core database properties:
| Property | DB Column | Type | Description |
|---|---|---|---|
| Name | name | Text | Customer's profile name (pulled from WhatsApp profile or set manually). |
| WhatsApp ID (Phone) | whatsapp_contact_id | Text | Clean WhatsApp phone number containing digits only. Used to send messages. |
email | Text | Primary email address gathered during chats or forms. | |
| Company | company | Text | Null | The customer's organization name. |
| Source | source | Text | Creation entry point: chat, broadcast, or chat_conversion. |
| Status | status | Text | Lifecycle stages: new, contacted, qualified, converted, or lost. |
| Deal Value / Score | value | Numeric | Expected revenue value or quality assessment score associated with the lead. |
| Assigned Agent | assigned_to | UUID | Null | Unique ID of the dashboard user responsible for managing this contact. |
| Tags | tags | Array[Text] | Custom strings representing segment groups or behavioral characteristics. |
3. Contact Management Actions
Admins and authorized users can modify lists, run uploads, or export contact tables using built-in utility features:
Creating & Editing Contacts
Admins can add contacts manually via the Add Contact modal. This is ideal when syncing offline leads or adding test numbers.
Editing existing rows will trigger an override dialog to change properties (e.g. updating deal score, email addresses, tags, or renaming companies) which updates Supabase tables instantly.
Bulk CSV Contact Importer
Using the Import Contacts button, users can drag and drop CSV files containing structured lead records.
- Supported columns: name, phone, email, company, value, tags.
- Performs row validation before writing database entries.
- Automatically filters non-numeric characters from phone numbers during parsing.
Safe CSV Exporting
The Export CSV action generates a downloadable spreadsheet containing all visible contacts.
To prevent CSV injection exploits, SyncFlo implements formula sanitization. If any text value starts with executable characters (e.g., =, +, -, or @), a safe single quote (') is appended to block formula execution.
CRM Integration (Preview)
SyncFlo offers a placeholder hook for external CRM syncing (e.g. HubSpot, Salesforce, Zoho).
While first-class sync endpoints are being finalized, triggering the CRM sync updates matching variables inside our leads database and triggers a toast notification verifying connection pathways.
4. Team Assignment Workflow
SyncFlo allows active team members to share responsibility for incoming chats. Assignment logs ensure clear ownership of leads and track handoffs.
Assignee Tracking Columns:
assigned_to
The UUID of the support representative currently assigned to answer messages and close deals for the customer.
assigned_by
The UUID of the admin or automated router that assigned the lead, establishing accountability.
assigned_at
Timestamp record tracking when the assignment occurred, helping evaluate agent response times.
5. Internal Notes Timeline
Agents can record details, customer preferences, meeting results, or specific customer requests in an internal timeline. These logs are hidden from the customer and visible only to team users.
Notes Functionality
- Mention Tags: Agents can mention other team members (using @name handles) to request help on specific contacts.
- Chronological Timeline: Each note displays the author profile (retrieved from system profiles), creation timestamp, and note content.
- Granular Deletion: Admins can delete any note, while agents can only delete their own notes to preserve history.
Internal Notes API Schema
Notes query the database via the API endpoint /api/internal-notes using the following entity format:
{
"id": "UUID-string",
"content": "Meeting scheduled for next Monday. @Jane",
"entity_type": "lead",
"entity_id": "lead-uuid-string",
"author_user_id": "agent-uuid-string",
"created_at": "ISO-Timestamp"
}WhatsApp Live Chat Handoff
Seamless Escalation to Agent Inbox
When a lead requires manual intervention, agents can click the Start Chat action. This initiates the Chat Handoff flow, transferring control from the automated bot to the Live Inbox:
Chat Handoff Execution Steps:
- Fetch Existing Thread: Checks the
whatsapp_conversationstable in Supabase for a clean digits-only matching phone number (`contact_id`). - Inbox Redirect: If an active conversation is found, the system immediately redirects the agent to
/dashboard/whatsapp/inbox?chat={conv_id}. - Thread Ingestion: If no conversation is found, the console creates a new record in
whatsapp_conversationswith:contact_idset to clean phone digits.contact_nameset to contact's name.statusinitialized asactive.ai_enabledset totrue.
- Redirection Fallback: Upon successful creation, the agent is redirected to the active chat in the inbox console. If database creation fails, it falls back to a search query redirect:
/dashboard/whatsapp/inbox?search={phone}.