Contact Activity Panel
A Lightning record-page panel that gives every recruiter, AE, and CSM a real-time view of a single Contact's Customer.io engagement — without leaving the Contact record.
Engagement banner
A prominent colored banner at the top of the panel, driven by the strongest available signal for this Contact. Priority is page views first, then email engagement, then quiet states.
| State | Trigger | Example message |
|---|---|---|
| HOT | Job page viewed in the last hour | Actively job-shopping — viewed /jobs/nurse-icu 12 minutes ago |
| WARM | Job pages viewed today (1–24h ago) | Browsing your site — 4 job pages today |
| ENGAGED | Job page viewed in the last 7 days | Recently job-shopping — viewed /jobs/locum 4 days ago |
| WARM | Email opened or clicked in the last 24h | Email engagement — opened your last campaign 3 hours ago |
| QUIET | Anything older | Low engagement — last activity 14 days ago |
| NONE | No activity at all | No recent Customer.io activity |
Five KPI cards
- Last Sent — most recent campaign or transactional email delivered
- Last Opened — most recent open event
- Last Clicked — most recent click event
- Job Pages Today — count of page views matching your job-page URL pattern in the last 24h
- Last Page View — most recent page view, with URL and timestamp
Recently Viewed Job Pages
A list of the URLs the candidate hit on your careers site, ordered most-recent first. Pages are classified as "job pages" by a configurable substring list (default includes job, career, position, role, opening, hiring, nurse, physician, doctor, locum, specialist, therapy, therapist, healthcare).
Email activity datatable
Sent, delivered, opened, clicked, bounced, failed, unsubscribed — the most recent activities, in a sortable table.
Where it lives
Drag the CIO Pipelines: Contact Activity component onto any Contact Lightning Record Page in the Lightning App Builder. Save and activate. No code, no profile assignment.
Recruiter Dashboard Widgets
Three list widgets and four engagement banners that surface aggregate Customer.io signal across recruiters, teams, and the entire pipeline.
Three list widgets
| Widget | Master label | Scope |
|---|---|---|
cioMyActiveCandidates | CIO Pipelines: My Active Candidates | Contacts owned by the running user with recent Customer.io engagement |
cioTeamActiveCandidates | CIO Pipelines: Team Active Candidates | Contacts owned by the user's team |
cioPipelineActiveCandidates | CIO Pipelines: Pipeline Active Candidates | Every Contact the user can see via sharing |
Four engagement banners
| Banner | Master label | Where it lives |
|---|---|---|
cioContactBanner | CIO Pipelines: Engagement Banner (Contact) | Contact record page (full-width above layout) |
cioMyEngagementBanner | CIO Pipelines: My Candidates Banner | App / Home page |
cioTeamEngagementBanner | CIO Pipelines: Team Candidates Banner | App / Home page |
cioPipelineEngagementBanner | CIO Pipelines: Pipeline Candidates Banner | App / Home page |
Team scoping
The Team widget supports four strategies, configurable in CIO Pipelines: Settings:
- Manager Hierarchy (default) — uses
User.ManagerId - Public Group — pass any group's ID
- Queue — pass any queue's ID
- All Users — every user in the org
Engagement scoring
Candidates rank by recency × intensity × frequency, weighted so page views (especially job-page views) outrank pure email engagement. Recruiters care most about active job-shoppers, so that's what surfaces first.
Outbound CDP Integration
Every Salesforce DML event you care about — record creation, field changes, ownership transfers, deletions — flows into Customer.io's Pipelines CDP API in real time. Configurable per object, per event, per field, per filter.
What gets sent
| CDP event | Salesforce trigger | Use case |
|---|---|---|
identify | After insert / update on Contact, Lead, Account | Sync person/company traits to Customer.io |
track | After insert / update / delete / undelete on supported objects | Send custom events (Status changed, Stage moved, Case opened) |
group | After insert / update on Account-related records | Associate people with companies (B2B) |
Configuration without code
Admins build the integration in the CIO Pipelines Lightning app:
- Configure credentials (Pipelines CDP write key, Site ID, Region — both endpoints ship pre-registered)
- Build event triggers (object, DML events, Customer.io event type, filter conditions, batch mode)
- Map fields (Salesforce field → Customer.io payload field, with DIRECT, UPPERCASE, LOWERCASE, DATE_FORMAT transforms)
- Add filters (visual filter builder, JSON-stored, evaluated by
CIO_FilterEvaluator)
Async, governor-safe execution
All HTTP callouts run in Queueable context — never in the trigger transaction. Failed callouts publish CIO_Retry_Event__e, which CIO_RetryHandler consumes with configurable backoff.
Audit trail
Every API call (success or failure) writes a CIO_Activity_Log__c record with the trigger that fired it, the Salesforce record ID, sanitized request and response bodies, HTTP status, and timestamp. Bodies are retained for 30 days by default (admin-tunable, 7-day floor).
Inbound webhooks (bonus)
CIO Pipelines also exposes a hardened inbound webhook receiver at /services/apexrest/ciopipelines/cio/webhook/. Signatures are HMAC-SHA256, verified with constant-time comparison.
Customization & Per-Widget Settings
Every recruiter-facing label, every banner message, every KPI label, every URL pattern, every team scope — admin-controlled. CIO Pipelines ships with recruiting-tuned defaults, but the same code runs verticals from healthcare staffing to freight brokerage to real estate.
Per-widget settings
The CIO Pipelines: Settings page exposes a configuration panel for every widget — time window, max items, included engagement states, refresh cadence, and per-widget toggles. All settings are persisted in a single JSON blob; admins never edit JSON.
Banner template editing
Every banner has per-state message templates exposed as plain-text textareas. Supported placeholders include {name}, {minutes}, {hours}, {pageTitle}, {pageUrl}, {count}, and {state}.
Industry-agnostic defaults
The package ships with healthcare-recruiting-tuned defaults, but every label is rewritable in five minutes. A freight broker might rewrite the HOT_JOB template to:
{name} is reviewing freight options — viewed {pageTitle} {minutes} min ago — quote them now.
How it works
CIO Pipelines is a Salesforce-native managed package. There's no middleware, no external server, no proxy. Outbound flows from Apex triggers to Customer.io's CDP API. Inbound flows from Customer.io's App API into Lightning Web Components. Both directions respect Salesforce sharing, FLS, and platform limits.
What's in the box
- 40 production Apex classes, 36 test classes, comprehensive coverage
- 17 Lightning Web Components covering admin and recruiter UIs
- 5 custom objects: Settings, Event Trigger, Field Mapping, Activity Log, Retry Event (Platform Event)
- 2 permission sets:
CIO_Admin(full configuration),CIO_ReadOnly(recruiter-facing)
API regions
| Region | CDP URL | App API URL |
|---|---|---|
| US | https://cdp.customer.io/v1 | https://api.customer.io |
| EU | https://cdp-eu.customer.io/v1 | https://api-eu.customer.io |
Ready to put Customer.io's signal where your Salesforce team works?
Install in Sandbox