Contact directory @switch (activePanel()) { @case ('profiling') { A form of nine questions gets abandoned; nine conversations do not. Each field states what it is used for — a field with no use is a field not to ask for. } @case ('lookalikes') { @if (refused().length > 0) { {{ refused().length }} audience was refused: below roughly 500 seed contacts a lookalike is describing noise. Shipping it with a caveat would be worse than not shipping it. } } @case ('streaming') { Event streams — {{ totalEvents().toLocaleString() }} in 24h CRM field mapping — {{ totalConflicts() }} conflicts in 7 days @for (mapping of mappings; track mapping.id) { {{ mapping.platformField }} {{ mapping.crmField }} {{ mapping.winner }} {{ mapping.conflicts7d }} } Enrichment } @case ('next-best-action') { @if (blockedActions().length > 0) { {{ blockedActions().length }} recommendation is blocked by a consent or policy rule. The block wins — a model does not get a vote on whether somebody opted out. } } @case ('journey') { {{ journeyContact }} across {{ channelsUsed().length }} channels, on one timeline. Sentiment is carried on the dot, so the point where a good customer turned is visible without opening anything.
    @for (event of journey; track event.id) {
  1. }
} } @switch (activePanel()) { @case ('profiling') { @if (selectedField(); as field) {

{{ field.field }}

{{ field.coverage }}% of contacts

When we ask

{{ field.askWhen }}

What it is for {{ field.usedFor }}
Handling

{{ sensitiveFields().length }} field(s) are sensitive and are never asked for conversationally.

} @else { Select a field. } } @case ('lookalikes') { @if (selectedLookalike(); as audience) {

{{ audience.name }}

{{ audience.seed }}

Model
What drove the match @if (audience.drivers.length > 0) {
    @for (driver of audience.drivers; track driver) {
  • {{ driver }}
  • }

Drivers are shown so an audience can be argued with. One nobody can inspect gets used once and never again.

} @else {

No model yet.

}
@if (audience.note) { {{ audience.note }} } } @else { Select an audience. } } @case ('streaming') { @if (selectedStream(); as stream) {

{{ stream.event }}

Schema {{ stream.schemaVersion }}

Stream @for (consumer of stream.consumers; track consumer) { }
Sync health

Consent is the one field where neither side wins by recency: whichever record says no is the one that stands.

Enrichment
} @else { Select a stream. } } @case ('next-best-action') { @if (selectedAction(); as action) {

{{ action.contact }}

{{ action.action }}

Why

{{ action.reason }}

@if (action.blockedBy) {
Blocked {{ action.blockedBy }}
}
Queue

Blocked recommendations are excluded from that total. Counting them would be forecasting revenue nobody is allowed to pursue.

} @else { Select a recommendation. } } @case ('journey') { @if (selectedEvent(); as event) {

{{ journeyKindLabels[event.kind] }}

{{ event.at }} · {{ event.channel }}

What happened

{{ event.summary }}

This contact
Full conversation history } @else { Select an event. } } }