How to Build Care Management on Care Plans and Goals from EHRs with
Your product can read a patient's care plans and the goals they work toward from AdvancedMD, athenahealth, CharmHealth, Epic, MEDITECH, NextGen Healthcare, Oracle Health, PointClickCare, SMART on FHIR, TruBridge and Veradigm through one connection (as of 24 October 2026). Orion Health returns care plans as well.
sdk.healthcare.listHealthcareCareplans and sdk.healthcare.listHealthcareGoals return the same Care Plan and Goal objects on every EHR, linked to each other and to the conditions they address. Every request is executed directly against the customer's EHR.
Why care management needs the EHR's plan
Chronic care management, remote patient monitoring, value-based care and patient engagement apps all act on a plan: what the care team decided, which conditions it addresses, and what targets the patient is working toward (HbA1c below 7%, blood pressure below 130/80). If your product builds its own plan, it drifts from the one the clinician wrote, and the patient hears two different stories.
The EHR already holds the plan and its goals. Unified.to's Healthcare API returns them as a Care Plan object and a Goal object, already linked, so your product can show and track the care team's plan instead of inventing one.
What you are building
A care-management view: each active plan, the conditions it addresses, its goals with target dates and progress, and the readings that measure them.
- Authorize the customer's EHR and store one connection ID
- List the patient's care plans and goals
- Link goals to plans, and both to the problem list
- Track progress against goals with observations
- Pick up changes where supported
List plans and goals
import { UnifiedTo } from '@unified-api/typescript-sdk';
const sdk = new UnifiedTo({
security: { jwt: process.env.UNIFIED_API_KEY },
});
const [careplans, goals] = await Promise.all([
sdk.healthcare.listHealthcareCareplans({ connectionId, patientId }),
sdk.healthcare.listHealthcareGoals({ connectionId, patientId }),
]);
On a patient-launch connection, leave out patientId and Unified.to uses the patient who authorized it.
US Core EHRs require a category when searching care plans, so Unified.to requests the assessment-and-plan category for you. Orion Health's API takes no category, so it returns all of the patient's care plans.
What each field tells you
Care Plan
name and description are the plan's title and summary. status is DRAFT, ACTIVE, ON_HOLD, REVOKED, COMPLETED, ENTERED_IN_ERROR or UNKNOWN; show ACTIVE plans by default.
condition_ids are the problems the plan addresses, goal_ids the goals it works toward, and practitioner_ids the clinicians who wrote or contributed to it. start_at and end_at give its period, and notes holds free-text instructions.
Goal
name is the goal as written ("HbA1c below 7%"), with codes when it's coded.
status is the lifecycle: PROPOSED, PLANNED, ACCEPTED, ACTIVE, ON_HOLD, COMPLETED, CANCELLED, REJECTED or ENTERED_IN_ERROR.
achievement_status is the care team's assessment of progress: IN_PROGRESS, IMPROVING, WORSENING, NO_CHANGE, ACHIEVED, SUSTAINING, NOT_ACHIEVED, NO_PROGRESS or NOT_ATTAINABLE. Show it next to your own measurements; it's the clinician's judgment, not a calculation.
start_at and due_at frame the goal, practitioner_id is who set it, and condition_ids what it addresses.
Link it together
const goalsById = new Map(goals.map((g) => [g.id, g]));
const plans = careplans
.filter((plan) => plan.status === 'ACTIVE')
.map((plan) => ({
plan,
goals: (plan.goal_ids ?? []).map((id) => goalsById.get(id)).filter(Boolean),
}));
Some EHRs record goals without linking them to a plan. Show unlinked active goals in their own section rather than dropping them.
To show the conditions, list them once with listHealthcareConditions and look them up by condition_ids, the same way.
Track progress with observations
Goals state targets; observations hold the measurements. For a blood-pressure goal, read the patient's vital signs and plot them against due_at:
const vitals = await sdk.healthcare.listHealthcareObservations({
connectionId,
patientId,
type: 'VITAL_SIGNS',
});
Where your product collects readings (remote monitoring devices, patient-entered values), you can write them back as observations on EHRs that accept them, so the care team sees the same numbers in the chart.
Handling coverage that varies by EHR
Check support before you scope on the Supported Integrations page. Orion Health returns care plans but not goals, and lists care plans without fetching them one by one (as of 24 October 2026).
Treat 501 as information, not failure. An empty list means the patient has no plan; 501 means the EHR doesn't expose plans or goals.
Plans and goals are read-only through the unified objects. The care team owns the plan; your product reads and tracks it.
Stay current
On SMART on FHIR, TruBridge and Veradigm (as of 24 October 2026), updatedGte and [virtual webhooks](/blog/what_are_virtual_webhooks_how_they_differ_from_sync_based_webhooks) for healthcare_careplan and healthcare_goal deliver changes, such as a goal being marked achieved. On the others, read before each outreach or review cycle.
→ Start your 30-day free trial → Book a demo
Frequently asked questions
Can I create a care plan from my product?
Not through the unified objects yet. Care plans and goals are read-only on every integration as of 24 October 2026.
How do these relate to Performance Management goals?
They're separate objects. Healthcare goals belong to a patient's care plan; Performance Management goals belong to an employee.