HV Tech Stack Chapter 04 · Auth
How residents log in. How staff log in. How the old roster moves over. Who sees what.
I.
Part One
Residents skew 55 and older. Password fatigue is the top ticket at peer HOAs. The right tool is a passwordless magic link.
/account or hits a gated URL.wp_users.The right plugin is Passwordless Login by Cozmoslabs (free) or Magic Login Pro (freemium). Both ship a clean magic-link flow. Both pair with ACF, BuddyPress, and WP Mail SMTP.
Gemini named "Solid Security" as a magic-link option. That name is a hardening plugin (formerly iThemes Security). It does not issue magic links. See Operations for the full correction list.
Magic links fail silently if mail lands in spam. The system is not optional.
hv_sync_log
ACF magic_link_last_sent on every user. WordPress blocks a second
link within 60 seconds. Prevents flood attacks on a known address.
II.
Part Two
Import from HOA-sites. Bind each resident to their units. Every logged-in resident sees only their own data.
The current platform holds the master list. The plan assumes CSV export. Confirm this with the HOA-sites vendor before the migration phase. The exact export format drives the importer.
Target shape for the importer:
| Column | Maps to |
|---|---|
email | wp_users.user_email, hv_residents.login_email |
first_name | hv_residents.first_name |
last_name | hv_residents.last_name |
unit_number | hv_units.unit_number via join |
role | Owner, Co-owner, Tenant |
WP All Import handles the CSV-to-WordPress step. A Power Automate flow picks up
the imported rows and creates matching Dataverse hv_residents rows.
hv_units from the condo association roster.hv_residents.hv_resident_units join rows from the CSV's unit references.HV-DV-Sync-ResidentRoster provision the WordPress users.
No open registration. The /account/request form creates
hv_access_requests. Office staff verifies against the community roster.
On approval, Power Automate creates the hv_residents record.
The downstream flow provisions the WordPress user.
wp_usermeta.dataverse_resident_id maps to hv_residents.resident_id.
ACF associated_units holds one row. Work-order proxy, variance
dashboard, and vehicle list all filter by that one unit.
associated_units holds N rows, one per unit. The proxy queries
MaintainX for the array and merges results. Variance dashboard shows a unit
selector. Forms default to the primary unit but allow a dropdown.
hv_resident_units.role drives permissions. Tenants see work orders
for their unit. They do not see variance history or vehicle records. ACF
can_submit_variance checkbox on each row governs the front-end.
The Request Pattern governs every change. Residents cannot mutate
wp_users.user_email directly.
hv_contact_change_requests. Card goes to office triage.hv_residents.secondary_emails. Display only.hv_residents.phone.hv_contact_change_requests. Staff reviews.hv_alternate_addresses with resident-owned dates.III.
Part Three
Staff uses Entra ID. Three tiers. Four WordPress roles.
| Role | Permissions |
|---|---|
| Resident | Read gated pages; submit forms; edit own profile within the Request Pattern |
| Content Editor | Edit announcements, clubs, facilities, meetings for their hub |
| Data Manager | Full admin; Nate's role |
| Pending | Can log in only to see the "account awaiting approval" page |
Gated CPTs enforce role checks in template_redirect.
Public CPTs render without auth.
The cards-only flow is intentional. Carol and Sarah never open Power Apps. The service account holds the premium license and posts on their behalf. Microsoft's license model allows this for occasional use by a human approver.
IV.
Part Four
Directory privacy, hard cases, and the full permission matrix on one page.
The resident directory is opt-in per field. Default is everything hidden.
Staff see everything. Residents see only opted-in rows.
The ACF directory_opt_in field cluster drives this.
hv_residents row; downstream flow deletes the WP user.hv_resident_units row gets end_date; the flow trims associated_units.hv_residents row; hv_resident_units links them separately.| Surface | Public | Pending | Resident | Content Editor | Data Manager |
|---|---|---|---|---|---|
/ | yes | yes | yes | yes | yes |
/buyers/ | yes | yes | yes | yes | yes |
/residents/ | no | awaiting approval | yes | yes | yes |
/governance/ | mostly public | yes | yes | yes | yes |
/living-here/ | yes | yes | yes | yes | yes |
/contact/ | yes | yes | yes | yes | yes |
/wp-admin/ | no | no | no | scoped | full |
| Power Apps | no | no | no | no | yes (tier 1) |
| Teams cards | no | no | no | yes | yes |
| Excel on SharePoint | no | no | no | read | read/write |