Skip to main content
BeginnerContacts and Data

Contact Management

Manage the NimbusOS contact database with tags, custom fields, soft delete, ICP tier, and lead score, and understand the Contact and GlobalContact relationship.

9 min read
Updated April 23, 2026
1,900 words

Contacts are the center of NimbusOS. Every campaign sends to them, every sequence enrolls them, every analytic aggregates from them. The contact management page at /contacts is where you view, edit, tag, filter, and maintain the database. This article covers the Contact model, the relationship to GlobalContact, custom fields, tags, the soft delete workflow, and the operations you will do most often.

The Contact Model in Plain English

The Contact row carries every attribute about a single human in your outbound universe. Core fields: email, first name, last name, full name, title, department, seniority, phone, mobile, LinkedIn URL, city, state, country, time zone. Computed fields: lead source, lead score, ICP tier, grade.

Each Contact points to a Company row via company_domain. The company row holds firmographic data: industry, employee count, revenue band, tech stack, location. Enrichment fills both.

Each Contact also references a platform-wide GlobalContact row keyed on email. GlobalContact is where deduplication lives. It also carries cross-workspace engagement history: total emails sent, total responses, response rate, bounce status.

Viewing Contacts

The Contacts list page at /contacts supports filtering by any contact or company field, tag, ICP tier, grade, segment membership, and custom fields. The filter state is URL-encoded so you can share a filtered view.

Three columns you should always have visible in the list: email, ICP tier, lead score. Everything else is optional. For agency workflows add client assignment. For deliverability-focused reviews add bounce status and last send date.

Clicking a row opens the contact detail. The detail view shows:

  • Profile section with contact and company fields
  • Engagement timeline (sends, opens, clicks, replies, events)
  • Sequence enrollments (current and past)
  • Segment membership
  • Scoring breakdown (fit, engagement, intent, grade)
  • Enrichment status
  • Personalization research status and generated lines
  • Suppression status
  • Notes and activity log

Editing Contacts

Every editable field has an inline edit control. Click the pencil, change the value, save. Edits write to the Contact row. The AuditLog records the change with user, timestamp, and before/after values.

Company edits are different. Editing the company industry on a contact detail page edits the Company row, which propagates to every contact at the same company domain. A warning shows before save if more than 10 contacts are affected.

Custom field edits follow the same pattern. Custom fields are defined at the workspace level and appear on every contact's profile.

Tags

Tags are lightweight labels you attach to contacts. A contact can have many tags. Tags are filterable in the list view, usable as segment criteria, and visible in campaign targeting.

Common tag patterns:

  • Funnel stage tags: mql, sql, demo_scheduled, closed_won
  • Campaign interaction tags: opened_q2_campaign, replied_q2_campaign
  • Segment qualifier tags: enterprise_tier, mid_market, smb
  • Operational tags: suppress_manually, needs_verification, hot_lead

Tags are added individually or in bulk from the list view. Bulk add supports up to 10,000 contacts per operation.

Custom Fields

Custom fields extend the Contact model without code. You define them at Account Settings -> Custom Fields.

Field types: string, number, boolean, date, dropdown (with enum of allowed values), multi-select. Every custom field has a name, a type, a display label, and optionally a fallback value.

Custom fields are usable in:

  • Templates (via {{custom.field_name}})
  • Segments (via custom field filters)
  • Sequence conditions (via step send_only_if)
  • Scoring rules (via field references)
  • Contact list filters

Workspace limit is 50 custom fields on the default plan. Above that, request a limit increase through account settings.

Soft Delete

Deleting a contact does not immediately remove the row. It sets is_deleted=true, deleted_at=now(), and deletion_reason to a value you provide. The contact stops appearing in filters and sequences and is excluded from campaigns, but the history is preserved.

Restoring a deleted contact is one click from the Deleted tab. The contact re-enters the active database with the is_deleted flag cleared.

Hard delete (physical row removal) is available only through the compliance flow. A GDPR deletion request triggers a hard delete chain that removes the Contact row, the GlobalContact engagement history, and any related personal data, keeping only a retention log that lists when and why the deletion happened.

ICP Tier and Lead Score

Every contact carries an ICP tier (A, B, C, or D) and a lead score (0 to 100). The letter grade (A through F) is derived from the score.

Tier is set by ICPTierRule objects. These rules evaluate title, seniority, company size, industry, and tech stack. The first matching rule wins.

Score is computed by a ScoringModel with three weighted components: fit, engagement, intent. Defaults are 40/30/30 but every workspace tunes these.

Both tier and score are visible on the contact detail and drive segment membership, sequence eligibility, and NowList ranking.

Engagement Timeline

The engagement timeline shows every event for the contact across every campaign and sequence. Event types include sent, delivered, opened, clicked, replied, bounced, unsubscribed, meeting_booked, task_completed.

The timeline is useful for three things.

Diagnosing ghost contacts. A contact who never opened any of eight touches is probably wrong contact info or dead list. Consider verification.

Pulling ready prospects. A contact with three opens and a reply within 24 hours is hot. The timeline is where you confirm the hotness.

Debugging automation. If an automation rule should have fired and did not, the timeline shows the event trail. Missing events point to the source of the failure.

Cross-Workspace Context (Agency)

In agency mode, the ClientAssignment section of the contact detail shows:

  • Which client currently owns the contact
  • Assignment priority
  • Assignment expiry
  • Prior assignments (history)

Two agencies running campaigns on the same NimbusOS instance cannot both hold an active assignment on the same email. The GlobalContact enforces this.

Bulk Operations

The Contacts list supports bulk operations on selected rows.

  • Add tag
  • Remove tag
  • Set custom field value
  • Add to segment (static)
  • Remove from segment (static)
  • Export as CSV
  • Soft delete
  • Trigger enrichment
  • Trigger scoring
  • Enroll in campaign
  • Add to suppression list

Bulk operations run asynchronously for selections over 1000 rows. A progress indicator shows in the corner and you can navigate away without losing the job.

Enrichment Status on the Contact

The contact detail shows enrichment status: never attempted, in progress, completed, failed, stale. Stale contacts are those whose enrichment data is over 90 days old and is considered likely outdated.

Triggering a fresh enrichment from the contact detail runs it immediately for that single contact. Bulk refresh of a segment runs through an EnrichmentJob and is better for lists over 10 contacts.

Merging Duplicates

If dedup missed a duplicate (for example, two contacts with slightly different emails that are actually the same human), the Merge action combines them. The merge keeps all tags from both, merges engagement history, preserves the older contact's ID, and archives the newer one.

Merging is reversible for 7 days. After 7 days the merge is permanent.

Contact Import Summary

Contact creation goes through import, not through one-off Add New actions. The Add New button does exist on the contacts page but is useful mainly for single-row additions during live testing. Production contact data flows through the ImportJob pipeline documented in Importing Contacts.

Frequently Asked Questions

How many contacts can a workspace hold?

Soft limit 1 million on the default plan. Hard limit configurable at enterprise tier. Most agency workspaces sit between 50,000 and 500,000 active contacts.

What happens when I change a contact's email?

The platform creates a new GlobalContact row if the new email does not already exist. If the new email is already in the platform owned by another client, the edit is rejected. If you are certain the edit is correct (a typo fix, for example), the compliance team can force the merge.

Can I undo a bulk tag operation?

Yes. The bulk operation log shows every bulk action for 30 days and supports one-click reverse. After 30 days the log entry expires.

Do contacts expire?

Not automatically. You can configure a DataRetentionPolicy per workspace that auto-soft-deletes contacts with no engagement after a configurable period (90 days, 180 days, 1 year). The policy is off by default.

Can I bulk import contacts from the contact detail page?

No. Bulk import lives at /contacts/import. The contact detail is for single-contact work.

Useful next pages after this one: Segments and Filters for building queryable groups from your contacts, Deduplication for the GlobalContact and ClientAssignment deep dive, and Data Enrichment for expanding contacts with provider data.

Related articles

Still stuck?

Our team answers every support ticket. If the answer is not in the docs, open a ticket and we will write the missing page.