HV Tech Stack Chapter 05 · Operations
Hosting. Backup. Monitoring. Seven corrections. Ten open decisions. The final gates before launch.
I.
Part One
WP Engine is the budgeted working choice. The site is WordPress-first and the builder is solo.
The consolidated budget (hv-data-hub/PLAN.md §5) carries WP Engine
at $414.77 a year with tax. WP Engine bundles caching, CDN, backups, and security.
Those bundles cut WP Rocket and other plugin lines from the budget.
WP Engine is the working choice.
One caveat: the $390 list price is a spreadsheet figure, not re-verified against current WP Engine pricing. Check it before contracting.
Azure App Service was the earlier recommendation here. The Microsoft-adjacency case is real: lower webhook latency to Dataverse, Entra ID on the admin side, one bill. But the site is WordPress-first, the builder is solo, and WP Engine's managed platform keeps the "runs without a full-time developer" property. The webhook path works fine across vendors; Power Automate does not care where WordPress lives.
| Host | Case for | Case against |
|---|---|---|
| WP Engine (chosen) | Managed WordPress, human support, bundled caching/CDN/backups | Off-Microsoft, separate SSO, less Dataverse synergy |
| Azure App Service | Microsoft alignment, one bill, scaling | Learning curve for WP-first admins; more moving parts for a solo builder |
| Kinsta | Fast, managed, strong caching | Off-Microsoft, less identity integration |
| DIY on a VPS | Cheap | Heritage Village loses the "runs without a full-time developer" property |
Power Automate flows exist in three environments too. Flow promotion uses Power Platform solutions.
Two heavy content types threaten storage: board and committee minutes/agendas (scanned PDFs, often 50+ pages and 10+ MB raw) and resident-submitted photos (a likely feature request). Both live on the web host. Neither ever goes in Dataverse: file capacity there costs about $2/GB/month, and the hub is for structured data, not media.
Contingency, disclosed in the budget's optional-items note but not budgeted: if photo volume outgrows the plan, offload the media library to S3-compatible object storage (a few dollars a month at 100 GB) or step up one WP Engine tier. The unforeseen-expenses buffer covers the experiment.
II.
Part Two
Three systems hold state. Each needs its own plan. Four signals matter on day one.
hv_work_orders is a read-only safety net; it is not a full backup.wp-config.php constants, kept out of version control.hv_sync_log. Alert if bounces exceed 2% of daily volume.hv_sync_log.status = Failed.Nice-to-have signals: form submission volume, magic-link-to-login conversion, Dataverse API usage against the daily cap.
III.
Part Three
Seven items from the initial research needed correction during the final write-up. Listed here for a single reference.
Initial research suggested: "Using an established plugin like Passwordless Login or Solid Security will handle generating the secure, time-sensitive tokens." Solid Security is a hardening plugin. It does not issue magic links. The correct plugins are Passwordless Login by Cozmoslabs or Magic Login Pro.
Initial research suggested: "frame the MaintainX resident portal securely on the page."
MaintainX sets X-Frame-Options: DENY or a strict CSP header.
Iframe embedding fails. The correct pattern is a WordPress REST proxy
that calls MaintainX server-side.
Initial reseatch suggested: "you can use JavaScript to make an API call directly to MaintainX."
Browser-side calls expose the API key to every visitor. The correct pattern is a
server-side proxy inside WordPress. The key lives in
wp-config.php, out of version control.
Initial reseatch suggested: "The free version of Advanced Custom Fields (ACF) is incredibly robust and will likely cover 90% of your needs." True for a simple site. For 3,600 residents with multi-unit owners, snowbird addresses, vehicle fleets, and emergency contacts, the Repeater field is the right tool every day. ACF Pro at $49 per year is the correct call.
Initial reserch did not flag the license-scrutiny angle. The service-account pattern works for occasional approvals. Heavy daily use across many staff may draw Microsoft scrutiny. Price out per-user Power Apps licenses if any approver crosses roughly 30 decisions per day.
Initial research suggested: "Legacy platforms typically allow you to export your user roster as a CSV file." Typical, not guaranteed. Confirm the exact HOA-sites export format with the vendor before planning the migration.
Initial research suggested: "WordPress expects data to live in its own MySQL database so it can quickly render pages." True for the Heritage Village use case. Oversimplified in general. Headless WordPress runs fine without local MySQL queries on every page. For this project the local-MySQL pattern is correct. The architecture note stands without overstating the rule.
IV.
Part Four
Ten calls the user still owns. Recommended defaults below. Flip any of them before launch.
Default: build the read-only dashboard at
/residents/forms/variance-status. Feed it from
HV-DV-Sync-VarianceStatus. Send an email on every status change.
Residents get both.
Default: both. Cards for one-click approvals (Sarah's newsletter opt-ins). Power App for Nate and Carol who need a richer queue.
Default: Excel connector. Data Lake is overkill for 3,600 residents. Revisit in year three if reporting volume climbs.
Default: opt-in per field. Name, unit, phone, email each separate. Default is everything hidden.
Default: keep fully gated for now. Revisit after launch based on community engagement.
Default: minimum-content contract enforced by the CPT template. If a club or condo page goes 12 months without an update, it surfaces in a "stale pages" admin report.
Decided 2026-07-05 (Nate): keep the last three years live on the site. Older minutes and agendas move to the Village's in-house servers; a "request archives" link routes to office staff. (Earlier default was five years; three keeps the storage math comfortable. See "Media and document storage" in Part One.)
Default: WCAG 2.2 AA. Build to it from day one. Audit before launch.
Default: English only at launch. Add Spanish in year two if resident demographics call for it.
Default: single YouTube channel for Heritage Village. Unlisted for resident-gated meetings. Public for the homepage pitch and tour videos.
New 2026-07-05, from the auth security review. Many couples share one email address. One inbox then controls both resident records, and the magic link cannot tell the spouses apart. Default: allow shared addresses at launch and treat the login as household-level access. The Request Pattern already routes profile changes through staff review, so the records stay protected. Encourage separate addresses during the census drive. Require distinct addresses per resident only if electronic voting ever goes live; a ballot needs one identity per voter. Decide before migration, because account provisioning depends on it.
V.
Part Five
Confirm upstream. Pass every gate. Watch the five risks.
/site-search/ for known terms to surface orphan pages./account returns the same on-screen message as a known email./residents/, never the off-site URL.