SyncFlo AI
Relationship Insights

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 Contacts

Total Leads

Sum of all unique numbers registered on WhatsApp.

Qualified Leads

Active Leads

Contacts set to qualified or converted.

Conversion Rate

Win Rate %

Percentage of qualified leads out of total contacts.

Lost Leads

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:

PropertyDB ColumnTypeDescription
NamenameTextCustomer's profile name (pulled from WhatsApp profile or set manually).
WhatsApp ID (Phone)whatsapp_contact_idTextClean WhatsApp phone number containing digits only. Used to send messages.
EmailemailTextPrimary email address gathered during chats or forms.
CompanycompanyText | NullThe customer's organization name.
SourcesourceTextCreation entry point: chat, broadcast, or chat_conversion.
StatusstatusTextLifecycle stages: new, contacted, qualified, converted, or lost.
Deal Value / ScorevalueNumericExpected revenue value or quality assessment score associated with the lead.
Assigned Agentassigned_toUUID | NullUnique ID of the dashboard user responsible for managing this contact.
TagstagsArray[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:

  1. Fetch Existing Thread: Checks the whatsapp_conversations table in Supabase for a clean digits-only matching phone number (`contact_id`).
  2. Inbox Redirect: If an active conversation is found, the system immediately redirects the agent to /dashboard/whatsapp/inbox?chat={conv_id}.
  3. Thread Ingestion: If no conversation is found, the console creates a new record in whatsapp_conversations with:
    • contact_id set to clean phone digits.
    • contact_name set to contact's name.
    • status initialized as active.
    • ai_enabled set to true.
  4. 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}.