CRM Pipelines, deals and tasks · next to your sending

Your pipeline, built
from the replies you earn.

Contacts, pipelines, deals, tasks and notes in one workspace, wired to your campaigns. A positive reply opens a deal, attributes it to the campaign and mailbox that earned it, and the board stays live as your outbound runs.

app.warmbly.com/crm/deals
Deals
7 deals on Sales pipeline
Open
6
active deals
Pipeline value
$103,500
open · all stages
Won
$6,000
closed won
Stages
4
on this pipeline
New 2
$12,700 open
Vela Logistics
$7,500
AM Outbound
Glasshouse Labs
$5,200
JS Inbound
Qualified 2
$36,000 open
Northwind rollout
$24,000
Sequence · q1-outbound
BH Enterprise
Penna Health
$12,000
MO Outbound
Demo booked 2
$54,800 open
Stratech platform
$45,000
BH Enterprise Hot
Nimbus Ops
$9,800
JS Inbound
Won 1
$6,000 total
Initech pilot
Won
$6,000
MO Closed
How it works

A reply does not sit in an inbox.

Most CRMs start where the deal already exists. This one starts at the send. The same event that classifies a reply opens the deal, links the contact, and drops a follow-up on a named owner. You manage the pipeline, not the data entry.

01 Contact

Imported, deduped and categorised. Suppression-aware everywhere it appears.

02 Sequence

A campaign step sends from a warmed mailbox under its per-mailbox cap.

03 Reply

The classifier reads the inbound reply, tags it positive, and pauses the sequence.

04 Deal

A deal opens on the pipeline, attributed to the campaign and mailbox that earned it.

05 Task

A follow-up task lands on a named owner, and the board updates live.

Classification, deal and task fire on one inbound event Sequence auto-pauses for the contact Board updates live
Attribution

Every deal remembers where it came from.

A deal carries the campaign and the sender mailbox that produced the reply it was opened from. Won revenue traces straight back to the outreach that created it, so you can tell which sequences and which mailboxes actually close.

  • Both links are nullable and editable. It is a best guess at creation, not locked ground truth.
  • ON DELETE SET NULL keeps won-revenue history when an old campaign or mailbox is cleaned up.
  • Filter the whole pipeline by attributed campaign to see revenue per sequence.
Deal DEAL-2026-0184
Northwind rollout
Qualified
Deal Northwind rollout
Value $24,000
Stage Qualified
Owner Ben Hsu
Campaign q1-outbound
deals row · attribution
{
"id": "deal_2f9a…0184",
"status": "open",
"value": 24000,
"campaign_id": "cmp · q1-outbound",
"source_mailbox_id": "[email protected]"
}
migration 000022 · deal_attribution FK → campaigns · email_accounts
Pipelines & stages

Build the stages your deals actually move through.

A pipeline is a named flow of stages. Start from a template or build your own, rename and recolour stages inline, and reorder them as your motion changes. Each stage tracks its own deal count for an at-a-glance forecast.

Stage colours
Sales pipeline 5 stages Stage
New
18 deals
Qualified
11 deals
Demo booked
6 deals
Won
9 deals
Lost
4 deals
Double-click to rename · drag to reorder One deal lives in one pipeline
Deals at scale

Totals stay true past the first page.

Search, filter and sort run on the server, so the board works the same with twelve deals or twelve thousand. Every header total is a real SUM and COUNT over the whole matching set, never a reduce over the rows that happen to be loaded.

Search deals…
Status · open Owner · anyone Campaign · q1-outbound Value · high → low
Deal
Stage
Source
Value
Stratech platform
Demo booked
q1-outbound
$45,000
Northwind rollout
Qualified
q1-outbound
$24,000
Penna Health
Qualified
fy26-named
$12,000
Nimbus Ops
Demo booked
inbound-q1
$9,800
Vela Logistics
New
q1-outbound
$7,500
Server-side · POST /crm/deals/search 5 of 248 loaded
Tasks & follow-ups

Nothing waiting on a reply slips.

Tasks attach to a contact or a deal and go to a person or a whole team. Group them by due date so overdue work surfaces first, set a type and a priority, and check them off inline. The counts above are a server-side summary, so overdue is overdue across the whole org.

Overdue
1
needs attention
High priority
2
urgent + high
Pending
7
not started
Completed
24
done
Overdue 1
Email Send proposal to Northwind BH Jun 06
Today 2
Meeting Demo call · Stratech BH 2:30 PM
Call Follow up with Penna Health MO 4:00 PM
This week 2
Meeting Schedule QBR with Initech MG Jun 12
Email Recap notes to Nimbus Ops JS Jun 13
Call Email Meeting Types are yours to rename, recolour, add
app.warmbly.com / contacts
2,431 rows · 0 dupes
Name
Email
Stage
Rowan Cole
Qualified
Dana Vasquez
Demo booked
Eli Soriano
New
Lena Park
Qualified
Sam Iverson
Demo booked
Maya Chen
Won
Bulk select · categories / owner / suppression Export →
Contacts

One contact list, suppression-aware.

Contacts is where the spreadsheet usually wins. Not here. Import with a mapping wizard, dedup before rows land, and the moment a contact bounces, complains or opts out, they drop off every campaign in the workspace at once.

Workspace-wide suppression
Hard bounce

The recipient drops off every campaign in the workspace.

Spam complaint

Suppressed, and the mailbox health score takes the hit.

One-click unsubscribe

Honoured per RFC 8058 before the confirmation page loads.

Reply: STOP / REMOVE

The reply classifier opts them out with nobody in the loop.

01
Import wizard
Column mapping with custom-field detection. A dedup pass runs before a single row lands.
CSV · XLSX
02
Export
Field picker. Scope to the current view, a saved segment, or the whole workspace.
CSV · XLSX · JSON
03
Dedup
Pick the dedup key. Merge conflicting fields with a per-attribute winner.
email · domain
04
Bulk update
Categories, owners, custom fields, suppression state. Every change is reversible.
from a saved view
Data model

Six objects. Six tables. No magic.

The CRM is built around six real entities. Each maps to a Postgres table you can read through the public API. Categories reuse the existing group table, so tagging never drifts into a parallel system.

01
Contacts
→ contacts

People and companies, deduped and categorised, suppression-aware across every campaign.

02
Pipelines
→ pipelines

Named stage flows you build per workflow. Each stage carries its own colour and order.

03
Deals
→ deals

Value, close date, owner, status, and the campaign + mailbox that produced the reply.

04
Tasks
→ crm_tasks

Follow-ups tied to a contact or deal, assigned to a person or a team, due-date bucketed.

05
Notes
→ contact_notes

Free-text notes on a contact. Plain, searchable, and stamped with who wrote them.

06
Activity
→ contact_activities

A typed timeline: sends, opens, replies, stage moves, won and lost, all on one record.

Two-way sync

Already on a CRM? Keep it.

Two-way sync with HubSpot, Salesforce and Pipedrive on contacts, deals, stage and owner. A stage moved over there is honoured here on the next pass. Webhooks are HMAC-signed and idempotent, so a retry never double-books a deal.

HubSpotSalesforcePipedrive
Synced objects
Contact
Deal
Stage
Owner
Activity
Note
HMAC-signed webhooks Idempotency-Key on every write
CRM FAQ

The questions we get a lot.

No. The CRM is built for one job: the cold-outbound workflow, contact to sequence to reply to deal. It is light on purpose. If you already run on Salesforce or HubSpot, two-way sync keeps contacts, deals, stages and owners in step rather than asking you to switch.

Two nullable foreign keys: the campaign and the source mailbox that produced the reply the deal was opened from. Both are ON DELETE SET NULL, so cleaning up an old campaign or mailbox never erases the won-revenue history that traces back to it.

Yes, it is the same workspace-wide list. A bounce, complaint, unsubscribe or STOP reply on a contact suppresses them everywhere at once. No campaign in the workspace queues to a suppressed contact again.

Yes. The board headers and task counts come from a server-side summary computed over the whole filtered set, a true SUM and COUNT, never a reduce over the first page of rows. Search, filter and sort all run on the server, and the list pages with "N of M loaded".

Yes. Each pipeline is its own board with its own stages and colours. A deal lives in one pipeline at a time. Common splits are an SDR pipeline, an AE pipeline, and a partner pipeline.

It is realtime by default. When a reply lands, a deal moves stage, or a task is completed, the board, the counts and the activity feed update live over the socket, with no manual refresh.

Open a pipeline next to your sending.

Connect a mailbox, start a campaign, and watch the first positive reply open a deal on its own.