Contacts and consent records
For the business owner or team member who manages the lead list.
Use Contacts to import warm-contact lists, record consent sources, manage suppression, and review opt-outs.
Importing your list (CSV wizard)
The fastest way to load contacts is a CSV file — a spreadsheet exported from your CRM, a trade-show badge scanner, or any list of phone numbers. Go to Contacts and click Import CSV. The wizard has four short steps.
Step 1 — Upload your file
- Make sure the first row of your file is column headers (like
first_name,phone,email). - Click to choose a
.csvfile. You can import up to 5,000 rows at a time. - Not sure of the format? The upload screen has a Download a sample CSV link. Open it, replace the example rows with yours, then verify the column mapping and preview before importing.
The sample file uses these columns: first_name, last_name, phone, email, timezone, tags, notes. Only phone is truly required — everything else is optional.
Step 2 — Map your columns
The wizard reads your headers and takes its best guess at which of your columns is the phone number, the first name, and so on. Review each match and fix any that are wrong using the dropdowns. You can map these fields:
| Field | What it's for |
|---|---|
| Phone (required) | The number to call or text. This is the only field you must map. |
| First name / Last name | Used to personalize calls and messages. |
| Stored as contact information. A public chat email is unverified and is never used to auto-link a contact. | |
| Timezone | Optional. Use a verified value such as America/Chicago when known. A blank field uses the limited area-code fallback described below. |
| Tags | Comma-separated labels for organizing (e.g. vip,trade-show). |
| Notes | Free text that lands on the contact record. |
| Consent status column | Only if your file already records consent per person. Otherwise you'll set it in Step 3. |
| Consent evidence/source column | Optional per-row evidence, such as a form submission ID, signed-card reference, or recording reference. Use it with a mapped consent status column. |
You'll see a preview of your first five rows so you can confirm the mapping looks right. You can't continue until the phone column is mapped.
Step 3 — Consent
Every imported contact needs a consent status and source. You have two choices:
The wizard defaults to No consent on record, which is non-dialable. Choosing any other batch status requires a concrete consent or suppression source.
- One status for the whole batch (most common). Pick the consent level that describes how you got this list (see the consent section below), then describe the proof in the Consent proof / source description box (for example, "signed badge-scan consent card, CHAMPS Chicago 2026").
- Per-row from your file, if you mapped a consent column in Step 2. The platform reads each row's value and translates it (e.g.
writtenbecomes prior express written consent,verbalbecomes express consent). Every row mapped to written or express consent must also have a concrete source in the mapped Consent evidence/source column or use the explicit fallback source in Step 3. A list name or the mere presence of a CSV status is not proof. Unknown/blank status values safely import as No consent on record, and the server refuses dialable mapped rows that lack a real source.
You'll also fill in a List source — a short name for where these leads came from (e.g. "CHAMPS Chicago 2026"). This shows up on every contact and lets you filter your whole list by source later.
Contacts marked No consent on record can be stored but cannot be dialed.
Step 4 — Import report
When the import finishes you get a clean summary so you know exactly what happened:
| Report number | Meaning |
|---|---|
| Created | New contacts added to your list. |
| Duplicates in file | The same number appeared twice in your CSV; only the first was kept. |
| Already existed | The number was already in your contacts; it was skipped (never duplicated). |
| Invalid phone | The number couldn't be understood and was skipped. A few examples are shown so you can fix them. |
| Skipped (invalid) | A row broke a field rule — a name or note over the length limit, a bad tag. Each one is listed with its line number, the field, and what was wrong, so you can fix those rows in your spreadsheet and import the file again. The rest of the file still imports. |
| Forced to DNC | The number was on your do-not-call list, so it was imported but marked do-not-call automatically. |
A row claiming written or express consent without a concrete evidence source stops the import, and no rows are written. Add the evidence source, then import the file again.
From here you can jump straight to View contacts or import another file.
Timezone auto-detection
Store a verified timezone such as America/Chicago when you know it. If the field is blank, CallOps uses a North American area-code fallback during call checks. If no timezone can be resolved, the contact is marked Time zone missing. Confirm each contact's timezone before launch.
Consent levels, in plain words
The platform tracks five consent statuses. The first two can satisfy a campaign's configured consent requirement:
| What you'll see | Plain meaning | Can you run campaigns to them? |
|---|---|---|
| Prior express written consent | You recorded a signed form, web opt-in, badge-scan consent card, or other written evidence. | Yes — for campaigns configured to require written or express consent. |
| Express consent | They verbally agreed to be contacted (e.g. said "sure, call me" at your booth). | Yes — but only for campaigns that require the lighter "express" level, not for ones that require written consent. |
| No consent on record | You have their number but no record they agreed to be contacted. | No. Never dialed until you upgrade this. |
| Do not call | They're on your suppression list. | No. |
| Opted out | They asked to stop hearing from you. | No. |
Each campaign sets a required consent level. Contacts below that level are excluded before dialing.
The campaign certification requires prior express written consent for every contact. Launch only lists that meet it.
What proof to keep
For anything above "No consent on record," keep a record of how you got permission. When you import or change someone's consent, enter a consent source / proof description such as "web form opt-in, firebarlabs.com/contact, 2026-06-14" or "signed consent card at trade show." The contact page shows this description as Consent source. Keep the underlying document in your own records.
The Do-Not-Call (DNC) list
Your workspace keeps its own do-not-call list. Campaigns do not dial numbers on it.
How numbers get on it (automatically)
You rarely have to touch this list, because the platform adds numbers for you whenever:
- A contact opts out during a call or chat (see the next section).
- You import a list and mark it as do-not-call or opted-out — those numbers land on the DNC list on the way in.
- You import a number that was already on your DNC list — it's forced back to do-not-call automatically (shown as "Forced to DNC" in your import report).
Adding a number manually
To add one yourself, go to Settings → Compliance, find the Do-not-call list, enter the phone number and an optional reason (e.g. "customer request"), and click Add to DNC. This also opts out any matching contact and removes pending campaign attempts. You can remove a number from the list from the same screen if it was added by mistake.
Complete required federal and state registry checks before signing the campaign certification. Use CallOps only with warm contacts whose permission you can document.
What happens when someone opts out
When a contact says "stop calling me" on a voice call or in a chat already linked to that verified contact, the platform:
- Changes their consent to "Opted out," blocking new campaign calls.
- Adds their number to your do-not-call list.
- Excludes pending and queued future campaign attempts. Calls already in progress continue to their recorded terminal state.
- Writes it to the audit log with a timestamp and where the opt-out came from.
For an unlinked public chat, CallOps closes the conversation and records the request for review. Manual Opted out, Do not call, and bulk Add to DNC actions apply the same contact-level updates.
Lead scores & pipeline status
Every contact carries two pieces of "how promising is this lead" intelligence that update on their own as calls and chats happen.
The score (0–100) and its band
Each contact has a score from 0 to 100, shown as a colored badge on the contacts list. It moves automatically after each call or chat based on what happened:
| Band | Score | What it means |
|---|---|---|
| Hot | 60–100 | Green. Strong interest — prioritize these. |
| Warm | 25–59 | Amber. Some engagement, worth following up. |
| Cold | 0–24 | Gray. Little or no traction yet. |
What moves the score
Good outcomes push it up; bad ones pull it down. Roughly:
| What happened on the call/chat | Effect on score |
|---|---|
| Booked an appointment | Large increase |
| Showed interest | Solid increase |
| Asked for a callback / got transferred to a person | Moderate increase |
| Left a voicemail | Tiny increase |
| No answer | Tiny decrease |
| Not interested | Moderate decrease |
| Opted out | Drops to the floor |
A positive or negative tone in the conversation nudges the score a little further in the same direction. Scores never go below 0 or above 100.
The pipeline status
Alongside the score, each contact sits in one of five pipeline stages that describe where they are in your funnel:
New → Working → Qualified → Customer — plus Unqualified for dead ends.
The platform advances contacts through these stages automatically:
- A booked appointment (or a Hot score) moves someone to Qualified.
- A warming score moves someone to Working.
- An opt-out or a clear "not interested" moves someone to Unqualified.
- Once someone is marked a Customer, the platform never downgrades them — a routine missed call won't knock a paying customer back down your funnel.
You never lose progress to a random no-answer: the platform won't bounce a "Working" lead back to "New" over a single missed call.
Tags & bulk actions
Tags are free-form labels you attach to contacts — vip, trade-show, spanish-speaker, whatever helps you organize. You can add tags during import, or select contacts on the list and tag them in bulk.
On the Contacts page, tick the checkboxes next to any contacts to reveal a bulk action bar with three options:
| Action | What it does |
|---|---|
| Add tag | Prompts for a tag and applies it to everyone selected (no duplicates). |
| Add to DNC | Runs the full opt-out on every selected contact — consent flipped, added to do-not-call, removed from all campaigns. |
| Delete | Permanently removes the selected contacts (asks you to confirm first). |
Above the list you can also search by name, phone, or email and filter by consent status or by list source, so you can slice your list any way you need before acting on it.
The contact page: one unified timeline
Click any contact's name to open their page. Everything you know about that person lives in one place:
- Details — source, timezone, tags, consent source, consent proof, notes, and when they were added.
- Change consent — update their consent level with a required reason/evidence note. Every change is audit-logged, and setting them to do-not-call or opted-out automatically pulls them from every campaign.
- Activity timeline — a newest-first story of voice calls and consent/DNC events, so you can see when a contact was added, called, or opted out without digging.
- Call history — the detail on each call: direction, status, outcome, duration, and cost.
- Consent audit trail — a record of every consent change and opt-out for this contact, with timestamps.
Related: Getting started · Building your agents · Running campaigns · Analytics & reporting