Set Property — Property & value reference
Every property in this dropdown is a field that already exists on a contact in PracticeEHR's Phase 1 CRM. The canonical source is the Smart Filter table in crm.html (Phase 1 doc) — if a field is not in that table, it is not in this dropdown. Out: HubSpot-flavored stages that don't map to PracticeEHR (e.g., "MQL", "SQL", "Evangelist"); clinical writes (ICD/CPT/Medication); free-form taxonomy that doesn't yet exist (tags, scores, custom personas).
Sourcing rule
- Every property maps to a row in the Phase 1 Smart Filter table at
crm.html:1331 - Or to an existing Phase 1 contact-detail surface, such as the Notes tab
- No external taxonomy invented
Mix of the 7
- 3 live in the builder — two kept as-is, one renamed
- 3 net-new from Phase 1 schema — pulled directly from Smart Filter rows
- 1 collaboration action — mapped to the Phase 1 Notes tab
Excluded on purpose
- Clinical writes (ICD / CPT / Medication) — filterable, not settable
- Identity / demographic (Age, Gender, DOB, Phone, Email) — user-entered, not automation-flipped
- Tags / scores / personas — do not exist in Phase 1; defer until added to schema
All 7 properties at a glance
Each row maps to an existing Phase 1 field. Click a name to jump to its detail card.
| # | Property | Phase 1 field | Value control | Source |
|---|---|---|---|---|
| 1 | Status | Status (Lead / Patient) |
Enum dropdown | Rename of "Lifecycle stage" |
| 2 | Contact Owner | Contact Owner (user list) |
User picker | Already in dropdown |
| 3 | Provider | Provider (user list) |
Provider picker | Net-new from Phase 1 |
| 4 | Lead Source | Lead Source (string) |
Text input | Already in dropdown |
| 5 | Patient Enter Date | Patient Enter Date (date) |
Date picker | Net-new from Phase 1 |
| 6 | Contact Enter Date | Contact Enter Date (date) |
Date picker | Net-new from Phase 1 |
| 7 | Note (system note) | Phase 1 Notes tab on Contact Detail | Rich text + @mention | Net-new from Phase 1 |
1. Status Enum dropdown Rename of "Lifecycle stage"
LifecycleLead / Patient values.
Allowed values2
Appointment booked → Set property
Status = Patient. Removes the contact from new-lead nurture, unblocks the Visits
tab on Contact Detail.
Lead / Patient at
crm.html:1342; lifecycle copy at crm.html:500-501.
Just two values. No HubSpot ladder.
2. Contact Owner User picker Already in dropdown
OwnershipAllowed values2
New web form submission → Set property
Contact Owner = Sarah Ahmed. Sarah's My Contacts view now shows the new lead.
crm.html:1331; Contacts views at
crm.html:530, 532.
Reference picker with avatar — not free-text.
3. Provider Provider picker Net-new from Phase 1
OwnershipAllowed values2
Form answer "Which provider?" = Dr. Patel →
Set property Provider = Dr. Patel. Later list segments and recall automations honor it.
crm.html:1332.
Reuses the same provider picker that already exists in scheduling.
4. Lead Source Text input Already in dropdown
AttributionValue type1
Form submitted on /landing/google-ads →
Set property Lead Source = "Paid - Google Ads Q2 2026".
String at crm.html:1344.
Token-aware: {{trigger.utm_source}} can drive the value at runtime.
5. Patient Enter Date Date picker Net-new from Phase 1
Date fieldsModes3
First appointment booked → Set
Status = Patient → Set Patient Enter Date = Date of step.
A year later, anniversary recall fires off this date.
Date picker at
crm.html:1339.
Date of step is the safe default — sets the timestamp at the moment the automation runs.
6. Contact Enter Date Date picker Net-new from Phase 1
Date fieldsModes3
CSV import job ran → Set
Contact Enter Date = trigger.row.created_at. Preserves true acquisition dates so
cohort reports stay honest.
Date picker at
crm.html:1340; Contacts list "Create Date" filter at crm.html:533.
Use Specific date for back-fill / migration. Use Date of step for new-contact triggers.
7. Note (system note) Rich text + @mention Net-new from Phase 1
CollaborationFields2
{{firstname}}, {{trigger.event}}.Appointment booked → in parallel,
Set Status = Patient AND Add Note: "Converted after appointment booked at
{{trigger.timestamp}}. @{{contact.owner}} please confirm first-visit prep is complete."
crm.html:643-691; behavior —
"Internal notes track call summaries... @mentions notify tagged teammates...
Notes are indexed and searchable by keyword".
Rich text + @mention. Notification follows Phase 1 @mention rules. The note is searchable from the Notes tab.
Phase 1 fields intentionally NOT in this dropdown
These rows exist in Phase 1's Smart Filter table (so they're filterable for list segmentation), but they shouldn't be settable from a marketing-automation step. Different categories, different reasons.
Clinical — never write
Filterable for segmentation, but writing them from a marketing automation creates a PHI surface where one shouldn't exist. The chart owns these.
ICD— diagnosesCPT— proceduresMedication— meds list
Demographic / identity — user-entered, not flipped
These come from form intake or staff entry. An automation flipping them is almost always a bug, not a feature.
Age,Gender,DOBPhone,Email
Implementation status
What's currently in the builder ([source.html: case 'property']):
| Property | Value control | Allowed values | Status |
|---|---|---|---|
Status |
Single-select dropdown | Lead / Patient | Live |
Lead source |
Free-text input | String | Live |
Contact owner |
Free-text input | String | Live |
How the type-aware control works:
- The Property dropdown's
onchangecallsupdateConfigAndRefresh('property', this.value, true)(vs. the regularupdateConfig). - That helper updates the property, clears the stale value (third arg
true), and re-renders the config panel so the value control swaps to the right shape. - The value control itself stays on the regular
updateConfigpath — no re-render needed when only the value changes within the same property.