# Contacts

Contacts is Ring Tonic's lightweight CRM. Every phone call and form submission your tracking generates can be matched to a contact, moved through a pipeline of stages, and tracked from first touch to closed-won revenue — without leaving the platform.

{% hint style="info" %}
The Kanban view, contact detail page, custom fields, and stage drag-and-drop are **Agency plan** features. The basic table view and individual contact details remain available on every plan.
{% endhint %}

***

### The Pipeline

Every contact has a **stage** showing where they are in your funnel. Stages are forward-only by default — a contact advances automatically (from phone calls, form submissions, or events sent from other tools), but only owners and admins can move one backward.

| Order | Stage                  | Meaning                                                                                    |
| ----- | ---------------------- | ------------------------------------------------------------------------------------------ |
| 0     | **New**                | A contact exists but no event has been recorded                                            |
| 10    | **Contacted**          | An outbound or inbound interaction has happened                                            |
| 20    | **Form Submitted**     | The contact submitted a tracked form (via [Form Submissions](/guides/form-submissions.md)) |
| 30    | **Qualified**          | AI auto-qualification or manual review marked the lead worth pursuing                      |
| 40    | **Appointment Booked** | A calendar event was created (typically from an outside tool)                              |
| 50    | **Proposal Sent**      | A quote or proposal has been delivered                                                     |
| 100   | **Won** / **Customer** | Closed-won — revenue recognized                                                            |
| 200   | **Lost**               | Closed-lost                                                                                |
| 300   | **Unqualified**        | Excluded from the funnel (spam, wrong fit, etc.)                                           |

The terminal stages (Won, Customer, Lost, Unqualified) are **mutually exclusive** — once a contact lands in one, it stops advancing automatically. (Won and Customer are both "won" outcomes and share the same place in the funnel order.) To move a contact out of a terminal stage you have to drag it there yourself, which only owners and admins can do.

{% hint style="info" %}
**Why fixed stages?** Ring Tonic intentionally ships an opinionated stage set matching the call-tracking industry norm (CallRail, WhatConverts). This keeps funnel analytics consistent across workspaces. Workspace-customizable stages are a planned future enhancement.
{% endhint %}

***

### Kanban View

The default view at **Contacts** is a horizontally-scrolling Kanban board with one column per pipeline stage.

<figure><img src="/files/1lnfNjiucjgIXdoLhRDG" alt=""><figcaption><p>Contacts Kanban board — one column per pipeline stage, with counts and deal value</p></figcaption></figure>

**What each column shows:**

* **Stage label** (e.g. "Form Submitted") with a colored badge
* **Count** of contacts currently in that stage
* **Total deal value** — the combined value of all contacts in the column
* **Up to 50 cards**, most-recently-changed first
* **Load more** at the bottom if more cards exist

**Each card shows:**

* Contact name (or phone number if the name is blank)
* Phone number, formatted for your workspace
* Email, if known
* "About X hours ago" — when the contact last moved into this stage

**Click a card** to open the [Contact Detail](#contact-detail) page.

#### Moving cards between stages

Drag any card onto a different column to change its stage. Three behaviors:

* **Forward move** (e.g. Contacted → Qualified) — instant, no confirmation. Any logged-in user can do this.
* **Backward move** (e.g. Won → Qualified) — owners and admins only, with an **Undo** toast. Other users get a permission error.
* **Same column** — nothing happens.

{% hint style="info" %}
Moving a contact **backward** is recorded in its timeline as a manual change, and moving it out of Won or Lost automatically updates the matching won/lost close date.
{% endhint %}

<details>

<summary>Backward moves — for developers</summary>

Forward and backward moves fire the `contact.stage_changed` webhook. Backward moves use the `force_stage=true` path and are logged with `source: manual`. See the [API guide](/guides/crm-api.md) and [Webhooks](/guides/webhooks.md).

</details>

***

### Table View

Click the **Table** toggle (top-right of the Kanban) to switch to a flat, sortable, filterable table — handy for bulk operations or richer filtering.

<figure><img src="/files/r2wVKZtLlD4rgsoebETA" alt=""><figcaption><p>Contacts table view — sortable and filterable, with multi-select bulk actions</p></figcaption></figure>

* Sort by name, phone, last stage change, deal value, and more
* Filter by stage, campaign, source, or date range
* Multi-select for bulk actions (assign owner, archive, export CSV)

Ring Tonic remembers which view you used last.

***

### Contact Detail

Click any card or row to open the full contact detail page.

<figure><img src="/files/WpolHWOJT2rGfeYXRWTJ" alt="" width="563"><figcaption><p>Contact detail page — header, stage, deal value, and the timeline / tabs</p></figcaption></figure>

#### Header

* Contact name as the page title
* Current **Stage** badge
* **Value** — the contact's deal value
* Phone, email, and company (whichever are known)

#### Tabs

* **Timeline** — a chronological feed of everything tied to this contact:
  * Stage changes (showing where each one came from — a manual edit, a call, a form, or an outside tool)
  * Form submissions
  * Calls (with a link to the call detail page)
  * Notes
  * Repeat events that didn't change anything (marked **(ignored)** — see below)
* **Custom fields** — your workspace's custom fields (see [Custom Fields](#custom-fields))
* **Notes** — free-form team notes
* **Calls** — call history for this contact only
* **Forms** — form submissions for this contact, showing everything that was submitted

#### Why some events say "(ignored)"

When the same event happens twice (for example, the same visitor submits a form more than once), the first one moves the contact to the new stage. Later repeats still appear in the timeline but are marked **(ignored)**, because the contact is already at that stage. This keeps a complete history without throwing off your pipeline counts.

***

### Custom Fields

Custom fields are your own typed fields that attach to every contact. They accept values from form submissions, the API, and manual edits.

<figure><img src="/files/1UOHj46atczVUnmX2JKV" alt=""><figcaption><p>Custom fields on a contact — edit each typed field and click Save</p></figcaption></figure>

**Field types you can add:**

| Type              | What it's for                                      |
| ----------------- | -------------------------------------------------- |
| **Text**          | Free-form notes, IDs, statuses                     |
| **Number**        | Lead scores, ticket counts, quantities             |
| **Date**          | Appointment dates, deadlines                       |
| **Single Select** | One choice from a fixed list (lead source, region) |
| **Multi Select**  | Several choices from a list (tags, interests)      |
| **Boolean**       | A simple Yes/No toggle                             |
| **URL**           | A link, e.g. a LinkedIn profile                    |

#### Defining a custom field

1. Go to **Settings** → **Custom Fields**
2. Click **Add custom field**
3. Choose a **key** (a lowercase identifier like `lead_score` — it can't be changed after saving), a display **label**, and a **type**
4. For **Single Select** / **Multi Select**, add the allowed options
5. Mark **Required** if the field must be set on every contact (enforced on manual create/edit only; form submissions and API calls may leave it blank)
6. Save

{% hint style="danger" %}
**The key can't be changed.** Once a custom field is saved, its key is fixed — existing contacts' values are stored under that key. You can rename the **label** any time, and you can archive a whole field (which hides it from forms but keeps the historical values).
{% endhint %}

#### Editing custom field values on a contact

You edit custom fields one at a time, right where you see them. Open a contact — either the quick-view panel (click a card or row) or the full detail page — and go to the **Custom fields** section.

1. Find the field you want to change and click its **Edit** control.
2. An inline editor opens with the right kind of input — a text, number, date, or link box; a dropdown for Single Select; checkboxes for Multi Select; or a Yes/No toggle.
3. Make your change and click **Save**.

Each field saves on its own, so editing one never touches the others. Validation runs the moment you save (type, required, allowed options), and anything that needs fixing shows a message right on that field.

***

### How Stages Get Set Automatically

Most of the time you won't move contacts by hand — events do it for you.

| Event                                                    | Sets stage to                  | Notes                                                       |
| -------------------------------------------------------- | ------------------------------ | ----------------------------------------------------------- |
| Form submission matched by phone or email                | **Form Submitted**             | First submission only; later ones just add timeline entries |
| Phone call auto-qualified by AI                          | **Qualified**                  | Driven by your workspace's AI auto-qualification rules      |
| An event sent via the [Postback API](/guides/crm-api.md) | Whatever stage was sent        | Used to connect outside tools (CRM, scheduler, automations) |
| Manual drag in the Kanban                                | Whatever column you dropped on | Owners/admins for backward moves                            |

Stage advancement is **forward-only** by default. If a call or an outside event asks to move a contact *backward*, it's recorded in the timeline but the contact doesn't actually move. Only an owner or admin can move a contact backward (or a developer using the API's force option).

***

### Won and Lost Tracking

Ring Tonic tracks Won and Lost separately so your analytics can compute close rates and lost-revenue baselines.

* When a contact moves to **Won**, Ring Tonic records the close date and locks in the deal value — keeping your close-rate and revenue reports accurate.
* When a contact moves to **Lost**, it records the close date and keeps the deal value, so you can see how much potential revenue slipped away.

Funnel analytics in the [Analytics](/guides/analytics.md) section roll these up by source, campaign, and date range.

***

### Plan Gating

| Feature                                                            | Plan                                                         |
| ------------------------------------------------------------------ | ------------------------------------------------------------ |
| Contact detail panel (quick-view)                                  | All plans                                                    |
| Kanban view, full detail page, timeline, custom fields, stage drag | Agency                                                       |
| Auto-creating contacts from form submissions                       | Agency (via [Form Submissions](/guides/form-submissions.md)) |
| Creating/updating contacts via the API                             | Agency (via [API](/guides/crm-api.md))                       |

If you open **Contacts** on a non-Agency plan, you'll see a pricing prompt. Existing contact records remain accessible via the table view and individual detail panels.

***

### Common Questions

<details>

<summary>Can I import contacts from a CSV?</summary>

Yes — **Contacts** → **Add contact** → **Import from CSV**. Required columns are `name` and at least one of `phone` or `email`. Custom field columns are matched automatically by their header to a custom field's key.

</details>

<details>

<summary>What happens to a contact's data if I archive a custom field?</summary>

The values are kept on the contact. The field just stops appearing in new contact forms and the Custom Fields tab. To bring it back, un-archive it from **Settings** → **Custom Fields**.

</details>

<details>

<summary>Can two workspaces share contacts?</summary>

No. Contacts are workspace-scoped. The same phone number can exist as a contact in multiple workspaces, but each workspace's funnel is independent.

</details>

<details>

<summary>How do duplicate contacts get merged?</summary>

Automatic merging isn't available yet. When a new call or form comes in, Ring Tonic matches it to an existing contact by checking, in order: a reference ID from your other tools, then phone number, then email. If a match is ambiguous, it doesn't guess — it flags it so you can decide. A manual merge tool is on the roadmap.

</details>

<details>

<summary>Can I create custom stages?</summary>

Not yet — the stages are a fixed set. Workspace-customizable stages are planned but not committed.

</details>

<details>

<summary>How are deleted contacts handled?</summary>

Deleted contacts are moved to the trash — they disappear from the Kanban and table, but their identifiers (reference ID, phone, and email) stay reserved. If the same lead comes in again later, it's restored instead of creating a duplicate.

</details>

***

### Related Guides

* [Form Submissions](/guides/form-submissions.md) — capture leads from a website
* [API](/guides/crm-api.md) — push contacts and conversions programmatically
* [Analytics](/guides/analytics.md) — funnel chart and revenue-by-source reporting
* [Webhooks](/guides/webhooks.md) — subscribe to `contact.stage_changed` and `conversion.recorded`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.ringtonic.app/guides/contacts.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
