How the CRM
Works — The Walkthrough.
A linear, top-to-bottom script for the live demo at crm.cremecollective.com.
Every step has been exercised end-to-end on the production instance the audience will see —
same data, same pages, same dialogs. Read it like a stage script: do the action on the left,
show the screenshot on the right, say the line in italics.
- Repo split — the CRM now lives in its own codebase and deploys to
crm.cremecollective.com, separate from the Portal but on the same shared identity + data. - Email overhaul · 5 phases — provenance, org-wide dedup on Message-ID, thread keys, manual association editing, thread re-sync, body-text inference, and send-from-CRM.
- Suggested tab — unlogged Gmail messages surface with one-click Log / Review. Email threads collapse into a single row; "Log thread" applies one association set to every message.
- Bulk log gate — "Log all single-match" now requires confirmation; no silent mass-logging.
- Brand-level features — Brand-as-association on Activities, threaded-by-default feed, pipeline XLSX export.
- Reliability — Gmail/Calendar OAuth env wired on prod, AI summaries (Haiku) restored, Settings-menu layout fix, brand-create endpoint restored.
Open the CRM in a fresh window so the audience sees a clean state — not your other tabs. Be signed in as a Crème user; the sign-in page itself is editorial and on-brand, so a brief glimpse of it is fine.
Go to https://crm.cremecollective.com. Enter Crème email + password and click Enter CRM. Forgot-password handoff goes to the Portal — that's intentional (one identity, two apps).
"This is Crème's own CRM. It runs on its own service but shares one identity and one dataset with the rest of the platform — your Portal login works here, brands and deals are the same records you see in the reporting product."
The landing page after sign-in is a performance review, not a homepage. Five numbered sections answer "how are we doing", "why did we win or lose", "are we doing the work", "what's the shape of the book", and "what needs attention right now." Walk it top-to-bottom.
After sign-in you land on /crm — the Performance Dashboard. Show the page title "How Are We Doing?", the period selector (Last 30d · 90d · 12mo · QTD · YTD), then point at each numbered section in order.
(01) Headline Diagnostics — Win Rate 49.5% · Closed-Won Sales Cycle 206d · Stage changes · Pipeline coverage. (02) Win & Loss Anatomy — three sub-cards: win rate, reasons, cycle. (03) Are We Doing The Work? — daily activity heatmap. (04) Mix & Composition — New vs Existing, By State, Where Wins Originate. (05) Needs Attention — top open deals with no recent activity.
"Every number here is computed from the live CRM data — there's no separate reporting layer to keep in sync. The 'Needs Attention' list is the one I'd point a sales lead at first thing in the morning."
Two complementary views of the same dataset — the Kanban Board for deal-stage motion, the Matrix for distribution coverage across brand × retailer pairs. Click Pipeline in the top nav once to show the flyout, then pick a sub-view.
Hover Pipeline in the top nav. The flyout shows two cards — Board and Brand × Retailer Matrix — plus a quick set of stage chips on the right.
"Two ways into the same data. Board for the sales motion. Matrix for distribution gaps."
Click Board. The Retailer pipeline columns load in stage order: Qualified · Contacted · In Discussion · Product Trial · Meeting · Closed Won · Closed Lost. Each column shows count and total $.
Qualified 513 · $3.8M · Contacted 2,290 · $7.9M · In Discussion 109 · $118K · Product Trial 616 · $2.0M · Meeting 51 · $513K · Closed Won 1,332 · $1.8M · Closed Lost 3,864 · $5.5M.
"This is the working surface for the reps — drag cards across stages, click in for the deal record. For an org-wide read, the brand filter narrows it to one brand's pipeline; in daily use a rep is usually scoped to their book."
Back to the Pipeline flyout → click Brand × Retailer Matrix. The matrix view answers "where are we placed, where are we not." Columns: Deal · Brand · Stage · Owner · Amount · Last Activity.
"This is how we spot coverage holes — which retailers a brand is in, where we're trying, where we haven't been yet."
Three record types. Each has a list page with editorial columns and a per-record detail with tabs. For the audience, the brand drill-down is the one that tells the story best — show that.
Hover Records in the top nav. Three labelled cards: Retailers · Contacts · Brands. Click Brands.
"Three record kinds. Brands are the portfolio we represent. Retailers are where we sell. Contacts are the people on either side."
On /crm/brands, columns are Brand · Category · Account Lead · Active Deals · Retailers · Last Activity. The Add Brand button is top-right — we'll use it later.
"At-a-glance, every brand's footprint and recency. Click a row to drill in."
Open Joanna Vargas. The brand page has tabs: Overview · Relationships (433) · Retailers (400) · Contacts (0) · Activity (437), plus action buttons: Export pipeline, Edit, New deal.
Overview shows the brand's KPI scorecard. The Relationships tab is the deal list. The Activity tab shows the threaded conversation feed across every deal on the brand.
"This is the brand-account view. Everything we know about Joanna Vargas — every deal, every retailer, every email — rolled up here."
Click the Activity (437) tab. Email conversations are threaded by default — one row per conversation, expandable. At the top, an AI summary of the brand's recent activity narrative.
"Threads collapsed by default — a five-message back-and-forth is one row, not five. The summary up top is generated from the latest activity, not pre-written."
Records → Retailers (Name · Type · Location · Relationships · Contacts — list paginates, 17,271 total in the system) → Contacts (Name · Email · Company · Title · Owner — list paginates, 23,557 total). Each has an Add button + search.
"Same shape across all three record types — searchable list with the columns that matter, and an Add button when the rep hits a gap."
Click into Bergdorf Goodman. Same tab pattern: Overview · Relationships (5) · Contacts (2) · Activity. Address, website, phone in the header.
"From a retailer's-eye view — every brand we have a deal with at Bergdorf, every contact on their side, every email in either direction."
From the retailer or brand page, open a relationship. The deal page shows stage, amount, owner, close date, plus an Activity tab scoped to that one deal.
"The brand-retailer relationship is the atomic unit. Every email logged here is on this deal — and only this deal — unless we explicitly link it elsewhere."
This is the area where most of the recent investment went. The CRM watches the rep's Gmail and proposes what to log, instead of asking the rep to remember. Threads, suggestions, the review dialog, sending from inside the CRM, and a pipeline export — all here.
Go to Activities in the top nav. Two tabs at the top of the column: Logged · Suggested (N). Quick-action buttons: Send email · Note · Task · Call · Log · Import Email · Import Meeting. Time filter pills: Today · 7d · 30d · 90d · All.
"This is the rep's command center for activity. Everything they need to log a meeting, log a call, or send an email lives one click away."
Click Suggested (10). The CRM polled the rep's connected Gmail, dedup'd anything already logged, and surfaced the rest with proposed associations ("Suggests → Brand X · Retailer Y"). Conversations with multiple messages collapse into a single Thread · N messages row.
"The CRM does not auto-log anything. It proposes — the rep clicks Log or Review. We refuse to make logging silent because reps stop trusting a system that puts records they didn't author into their feed."
On a Thread · 2 messages row, click Log thread. The review dialog opens titled "Log Thread to CRM · 2 messages" and lists everyone on the conversation (Existing Contacts · Create New Contacts), every Retailer / Relationship / Brand the system thinks fits, and an Add Other Records search. Confirm the associations once, hit Save & Log Email, and every message in the thread gets logged with the same association set.
"This is the thing that gets the rep out of email triage. A six-message thread used to be six logging clicks; now it's one review, one confirmation, six activities."
Click Send email. The composer opens — header reads "Send email from reporting@cremecollective.com", with To · Cc · Subject · Body. Sending uses Gmail's API on behalf of the connected account, and the sent message is auto-logged as an outbound activity.
"Sending from inside the CRM means we don't lose the touchpoint. The same email lives in the rep's Sent folder and in the deal's activity timeline at the same instant — no copy-paste, no 'log this' afterthought."
Back on a brand page, click Export pipeline. The CRM streams an XLSX named after the brand and the date — e.g. Joanna Vargas Opp Detail 5.27.26.xlsx — with every deal, stage, owner, amount, last activity.
Endpoint returns HTTP 200, Content-Type application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, ~100 KB for Joanna Vargas's 433 deals.
"For board-prep or a quarterly review — the canonical Excel handoff. Same fields the rep sees on screen."
Every record type has an Add button on its list page. These all worked end-to-end on prod during this walkthrough — a brand was created and a contact was created (both labelled DEMO TEST so they can be removed cleanly after the demo).
From the Brands list, click Add Brand. Dialog has Brand name · Category · Domain · City · Founders, plus a state/region select. Submitting redirects to the new brand's detail page.
"Reps onboard a new line as they sign one — no DevOps in the loop, no spreadsheet handoff."
From the Contacts list, click Add Contact. Required: First Name · Last Name. Optional: Email · Phone · Company · Title · Lifecycle stage · Lead status · Owner · linked Retailer · Brand filter. Submitting redirects to the new contact's detail page.
"Linking the contact to a retailer or a brand at create-time means the next email from that person lands on the right deal automatically."
The account dropdown is the gateway to Settings, the Portal's user management (which lives in the Portal, on purpose), and sign-out.
Top-right avatar → dropdown shows name · email, then three items: Settings (CRM-local) · Manage Users (deep-links to portal.cremecollective.com/admin/users) · Log out.
"User and role management lives in the Portal — one place to add a user, give them CRM access, assign them to a brand. The CRM doesn't try to duplicate that surface."
Click Settings. Section Google · Gmail + Calendar shows the connected mailbox + a DISCONNECT button. Click CONNECT GMAIL if not connected — Google OAuth pops, the rep picks their Crème account, scopes are read/send.
The Google OAuth app is org-internal — only @cremecollective.com Google accounts can authorize. That's intentional (the CRM is Crème-internal) and means a non-Crème Gmail will see Google's "access blocked · org_internal" message.
"One-click connect per rep. Tokens are encrypted at rest. Each rep's mailbox feeds only that rep's Suggested tab — nobody sees another rep's emails."
Real production data has rough edges. None of these are bugs in the CRM — they're things to acknowledge without flinching if a board member clicks them.
-
/01Activity heatmap · Thu Apr 2 — 58,717 activities. That's the HubSpot data-migration day, not a real day's outreach. The platform ingested the historical book in one transaction.
-
/02"Brand × Brand" relationships in the Suggested-tab review dialog (e.g. Joanna Vargas × Joanna Vargas, Reverie × Reverie). These are deals in HubSpot whose Company association is the brand's own company instead of the actual retailer. The CRM faithfully mirrors HubSpot — 14 retailer records share a name with a brand, 14 deals are mis-associated. Documented for Crème to clean at the source; full writeup at
docs/DATA-QUALITY-BRAND-RETAILER-DUPES.mdin the repo. -
/03The Kanban Board has ~8,775 deals in the Retailer pipeline. If the audience scrolls down the Closed Lost column, expect a long ride — for daily use a rep filters by their brand. The brand pages do that automatically; the Kanban does not yet have a default user-scope filter.
-
/04Gmail "Access blocked · org_internal" if you sign in with a non-Crème Google account. This is correct — the OAuth app is restricted to the cremecollective.com Workspace. Use a
@cremecollective.comaccount for the OAuth popup, not the rep's personal email. -
/05The two "DEMO TEST" rows created during this walkthrough's verification have been removed. Brand
DEMO TEST — Acme Beauty(id 394 — deleted, zero dependents) and ContactDEMO TEST Contact(id 23606 — deleted via API). Prod is clean for the demo.
- App
https://crm.cremecollective.com- Login
/· email + password- Forgot pwd
portal.cremecollective.com/forgot-password- Admin
portal.cremecollective.com/admin/users
- Primary
analytics@cremecollective.com— admin · Haziq's mailbox- Secondary
hkhurshid@datastudios.ai— admin · OAuth'd toreporting@cremecollective.com(temp pwdCremeCRM-11a15b; change after demo)
- Brand
DEMO TEST — Acme Beauty· id 394 · deleted- Contact
DEMO TEST Contact· id 23606 · deleted- State
- Prod is clean for the demo — nothing to filter past.