Contact Detail Page
Every contact has its own page at /dashboard/all-contacts/{contactId} — reached by clicking a contact's name in the All Contacts grid, in a list's own contact grid, from the View full contact link inside a Pipeline record's detail modal, or from an agency owner's cross-workspace contact search. If the contact doesn't exist, has been soft-deleted, or you're not a member of its workspace, you're redirected straight back to All Contacts rather than shown an error page.
On this page
Layout
Two columns on a real desktop width, stacking to one column on mobile. The left column holds editable data: Contact details, Company details, Other custom fields, and Activity timeline. The right column holds relationships: Pipeline records and Campaign history. Every card is collapsible — click its header to expand or collapse it; some start collapsed by default.
Contact and company details
Contact details
First name
Dana
Last name
Okafor
dana@nimbusrobotics.co
Verification status
Valid
Title
VP Operations
Seniority
VP
Job Function
Operations, Supply Chain
LinkedIn URL
Profile
Location
Austin, TX
Contact details — First name, Last name, Email, Verification status (Unverified / Valid / Risky / Invalid / Verified / High probability / Catch-all / Email not found), Title, Seniority, Job Function, LinkedIn URL, Location. Every field is click-to-edit; clicking Email shows the raw address, saving lower-cases and trims it, and rejects a duplicate already in this workspace or an attempt to clear it to empty. Location is one field on screen but writes to two underlying columns behind the scenes — typing "Austin, TX" splits on the comma into city and region; typing a single value with no comma saves it as one broad location string instead.
Company details
Company
Nimbus Robotics
Company Headcount
51-200
Company Specialties
Warehouse automation, Robotics
Founded Year
2018
Company Description
Autonomous picking robots for mid-size 3PLs.
Company Domain
nimbusrobotics.co
Company Industry
Logistics
Company Type
Private
HQ City
Austin
HQ Region
TX
HQ Country
United States
Company details — Company, Company Headcount, Company Specialties, Founded Year, and Company Description are all click-to-edit. Company Headcount accepts either a plain whole number or a range string like "51-200" — whichever you type is what's saved; the other representation is cleared. Company Domain, Company Industry, Company Type, HQ City, HQ Region, and HQ Country are read-only — there's no edit control for any of these six anywhere in the app today, on this page or the All Contacts grid; they're populated only by enrichment or import.
Other custom fields
Other custom fields
Anything not covered above (JSON)
{"referralSource":"partner-webinar"}
Collapsed by default. Every key in the contact's custom-fields data that isn't one of the ~18 known fields shown above (typically an unexpected column from a CSV import) shows up here as a single-line, minified JSON blob — one editable field, not a formatted key/value editor. Editing merges by key: a key you leave out of what you type is left untouched; setting a key to null clears it.
Activity timeline
The Activity tab — one of three tabs at the top of the page, alongside Details and Pipeline — shows a merged, chronological feed of everything real that's happened with this contact: email opens, clicks, and bounces; Pipeline stage changes; and reply messages, both received and sent. It sits side by side with Campaign history as two independent columns within that same tab.
Timeline
Replied: "Re: Quick question about your Q3 hiring plans"
Clicked a link in an email
Moved from Engaged to Interested
Opened an email
Each entry gets a small colored icon badge by source — a Mail icon in #00C896 for email opens, clicks, and bounces; a TrendingUp icon in #F59E0B for Pipeline stage changes; and a MessageSquare icon in #60A5FA for reply messages — plus a matching colored label (Email / Pipeline / Reply) and a timestamp, newest entry first.
A contact with no recorded activity yet shows a plain centered message, "No activity recorded for this contact yet." — not an error state, not a stuck loading spinner.
When this contact's own data shows direct evidence that a reply lost its link to a campaign lead after being received, a plain line appears above the list: "Reply history may be incomplete for this contact." This is a real, computed, per-contact signal, not a blanket disclaimer shown to everyone — it only appears when that specific evidence exists for this particular contact.
Pipeline records
Pipeline records
Q3 warehouse automation outreach
Every Pipeline record this contact holds — one per campaign they're enrolled in — with the campaign name, a stage badge, the estimated value if set, and the health score. Clicking a row opens the same record detail modal used everywhere else in Pipeline, where you can change stage, set an estimated value, and review or undo history. A contact enrolled in no campaign yet shows "Not in any campaign's pipeline yet." instead of an empty list.
Campaign history
Campaign history
Q3 warehouse automation outreach
ACTIVECollapsed by default. Every campaign this contact is enrolled in, with the campaign name and its raw status badge (ACTIVE, PAUSED, DRAFT, or ARCHIVED) — a read-only list, with no click-through from a row itself.
Editing and the manual-edit rule
Every edit here goes through the same click-to-edit control the All Contacts grid uses — click, edit, save on blur or Enter, revert on Escape or on a failed save. Saving marks each field you touched as manually edited, timestamped — the same rule the All Contacts grid already follows: a human's own edit always wins. A later automated write to that same field, from a fresh CSV import or a new enrichment run, won't silently overwrite what you typed here. Deliberately clearing a field to blank bypasses that protection, since a human clearing something on purpose isn't the scenario the rule exists to guard against.
Where tagging, deleting, and list actions live
Tagging, deleting, and adding to a list or campaign all live on the All Contacts grid's own bulk-selection bar instead of here — none of the three has its own control on this single-contact page yet.