Pool 1
Conditions
Clinical conditions the patient has been diagnosed with — t1d, t2d, hypertension, cardiac_event_history, cancer_diagnosis, etc. Sourced from the buyer's clinical data. Used to gate disease-specific message variants.
Audience safety
Seven audience tags keep every cue in-bounds. Ineligible members are filtered silently — never warned, never shamed.
Display mode never touches PHI — no BAA required. Start in 5 minutes.
One filtered cue
delivered to 41 312 enrolled
271 filtered silently
Audience safety
Every message in every template carries two audience tag sets: includes (must match the patient for the message to be eligible) and excludes (any match blocks the message). Tags are organized into four pools so a buyer's roster mapping does not get tangled with their condition coding. The cue endpoint runs the filter before it returns; messages that fail are dropped, never sent, never flagged for review.
A message that fails its audience check is not returned from the cue endpoint, not enqueued for review, not surfaced in any partner dashboard. The next eligible message in the template is selected and returned instead. Failure is silent, durable, and logged in the safety audit trail — never user-facing.
The contrast with "flag" is intentional. Health-content products that flag messages for human review add latency, a queue, and a person looking at PHI. Signal does none of that. The template authors decide what is appropriate at authoring-time; the cue endpoint enforces those decisions at call-time; humans never see the filtered candidates.
Try it · synthetic patient
Toggle a patient's tags below. The 6 message variants light up eligible or filtered live — the same logic that runs inside the cue endpoint.
Conditions
Topics
Family
Population
Pool 1
Clinical conditions the patient has been diagnosed with — t1d, t2d, hypertension, cardiac_event_history, cancer_diagnosis, etc. Sourced from the buyer's clinical data. Used to gate disease-specific message variants.
Pool 2
Patient-opted-in topic categories — mental_health_optin, sex_repro_optin, substance_use_optin, lgbtq_optin, etc. Sourced from explicit consent. Used to gate sensitive content classes.
Pool 3
Relationship and life-stage context — caregiver_role, parent_pediatric, postpartum_optin, partner_disclosure. Used by relapse-prevention and family-system templates to address the right person.
Pool 4
Demographic and population-health stratification — veteran_optin, occupation_class, language_pref. Used for population-tailored messages without mixing demographic data into condition records.
§2 · Display vs Deliver
Every cue is gated against the audience filter regardless of mode. What differs between Display and Deliver is whether real PHI crosses Uphealth's boundary, whether a BAA is required, and who actually sends the resulting message.
Display
Buyer renders · default
Deliver
Uphealth sends · opt-in
§3 · Governance roles
Audience-safety decisions are not a single team's call. The split below is the canonical role-based separation — one person at the partner can hold multiple roles, but the audit trail records the role exercised on each change, not just the user.
At authoring time
Uphealth's content team. Decide which include/exclude audience tags gate each message at authoring time. Cannot read partner roster data; their decisions are per-message, not per-patient. Changes write a content audit entry — message_id, tag set, author, effective_at.
At roster-config time
Buyer-side. Configure roster ingestion — which fields in the clinical record map to which audience-tag pools (Conditions, Topics, Family, Population). Roster changes write a partner audit entry; the data itself stays on the partner's side in Display mode or under BAA in Deliver mode.
At opt-in time
Opt in or out of sensitive Topics-pool tags via the partner's settings UI (mental_health_optin, sex_repro_optin, substance_use_optin, lgbtq_optin). Conditions-pool tags are clinical-data-derived, not patient-toggled. Patient changes propagate to Signal within the next cue cycle.
At review time
Quarterly review of the safety audit trail under BAA-bound access. Reads aggregate filter rates per tag pool — not per-patient data. Reviewers can flag template-level patterns (a tag fires more than expected) but cannot see which patients matched which tags.
§4 · Crisis pathway
Messages tagged with mental_health_optin and any suicide-related sub-tag carry a separate routing contract from the rest of the catalog. They never reach a patient without a paired resource. The pathway differs slightly by mode but the destination is the same: 988 (Suicide & Crisis Lifeline) plus the buyer's configured EAP where one exists.
Display mode
You render the resource
Deliver mode
Uphealth routes through EAP first
Signal is not a crisis-intervention product. The pathway routes content + resources; it does not detect crises, does not screen patient replies for risk, and does not page on-call clinicians. Buyers building crisis-detection products on top of Signal should layer their own detection + escalation on the response stream.
Buyers that have not configured an EAP see only the 988 universal fallback. Configuring an EAP is part of Deliver-mode onboarding; Discovery-tier buyers in Display mode can configure one at any time via /talk-to-sales.

Filter as care
Sensitive topics carry the highest stakes. Filtering — not flagging — keeps care private.
Evaluating Signal? Let Claude or ChatGPT do the vendor legwork — paste one prompt.
See how →