HV Tech Stack Chapter 05 · Operations

Operations.

Hosting. Backup. Monitoring. Seven corrections. Ten open decisions. The final gates before launch.

Contents

In this chapter

  1. i.HostingI
  2. ii.Backup and monitoringII
  3. iii.Initial research correctionsIII
  4. iv.Open decisionsIV
  5. v.Prerequisites, gates, risksV

I.

Part One

Hosting

WP Engine is the budgeted working choice. The site is WordPress-first and the builder is solo.

WP Engine (budgeted working choice)

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.

Why WP Engine over Azure App Service

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.

Alternatives

HostCase forCase against
WP Engine (chosen)Managed WordPress, human support, bundled caching/CDN/backupsOff-Microsoft, separate SSO, less Dataverse synergy
Azure App ServiceMicrosoft alignment, one bill, scalingLearning curve for WP-first admins; more moving parts for a solo builder
KinstaFast, managed, strong cachingOff-Microsoft, less identity integration
DIY on a VPSCheapHeritage Village loses the "runs without a full-time developer" property

Environments

Power Automate flows exist in three environments too. Flow promotion uses Power Platform solutions.

Media and document storage (added 2026-07-05)

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.

  1. OCR and compress every scanned PDF before posting. A 10 MB raw scan drops to roughly 1-2 MB, becomes text-searchable, and image-only PDFs would fail the WCAG launch gate anyway. Scanner settings: 200 dpi, black-and-white for text pages. Compression also protects bandwidth: a 10 MB file downloaded 500 times is 5 GB of transfer.
  2. Photos ride WordPress's built-in scaling. Core caps oversized uploads (the 2560px big-image threshold), so the site stores a 1-2 MB web copy, not the raw phone original. Resident submissions arrive through a Gravity Forms upload field and sit in a staff moderation queue before publishing.
  3. Three-year live window for minutes and agendas (decision D7). Older files move to the Village's in-house servers; a "request archives" link routes to office staff.
  4. The math. ~300 documents a year at a compressed 1-2 MB is under 2 GB for the whole three-year window; a moderated photo gallery adds about 1-2 GB a year. WP Engine's entry plan includes about 10 GB of site storage (verify when contracting). Comfortable, not tight.

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

Backup and monitoring

Three systems hold state. Each needs its own plan. Four signals matter on day one.

WordPress

Dataverse

MaintainX

Credentials and secrets

Monitoring: four signals

  1. Magic-link delivery. SendGrid bounce webhook writes to hv_sync_log. Alert if bounces exceed 2% of daily volume.
  2. Flow failures. Power Automate flow failure notifications post to Nate's Teams channel. Every failure writes hv_sync_log.status = Failed.
  3. WordPress uptime. WP Engine's monitoring or a third-party pinger hits the homepage every minute. Alert on a 5-minute outage.
  4. MaintainX proxy errors. WordPress logs proxy failures to a rotating log. Power Automate tails the log nightly; alerts on spikes.

Nice-to-have signals: form submission volume, magic-link-to-login conversion, Dataverse API usage against the daily cap.

III.

Part Three

Initial reserch corrections

Seven items from the initial research needed correction during the final write-up. Listed here for a single reference.

1 · Magic-link plugin name

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.

2 · MaintainX iframe embedding

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.

3 · Client-side API calls to MaintainX

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.

4 · ACF free vs Pro

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.

5 · Teams Adaptive Card multiplexing

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.

6 · HOA-sites CSV export

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.

7 · "WordPress needs MySQL to be fast"

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

Open decisions

Ten calls the user still owns. Recommended defaults below. Flip any of them before launch.

D1 · Variance status dashboard or email-only

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.

D2 · Adaptive Cards vs Power App for approvals

Default: both. Cards for one-click approvals (Sarah's newsletter opt-ins). Power App for Nate and Carol who need a richer queue.

D3 · Excel connector vs Export to Data Lake

Default: Excel connector. Data Lake is overkill for 3,600 residents. Revisit in year three if reporting volume climbs.

D4 · Directory privacy model

Default: opt-in per field. Name, unit, phone, email each separate. Default is everything hidden.

D5 · Message board gated or partially public

Default: keep fully gated for now. Revisit after launch based on community engagement.

D6 · Per-club and per-condo page maintenance

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.

D7 · Archive depth

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.)

D8 · Accessibility target

Default: WCAG 2.2 AA. Build to it from day one. Audit before launch.

D9 · Multi-language

Default: English only at launch. Add Spanish in year two if resident demographics call for it.

D10 · Video hosting

Default: single YouTube channel for Heritage Village. Unlisted for resident-gated meetings. Public for the homepage pitch and tour videos.

D11 · Shared email inboxes between co-residents

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

Prerequisites, gates, risks

Confirm upstream. Pass every gate. Watch the five risks.

Pre-migration prerequisites

  1. Confirm the HOA-sites CSV export format with the current vendor.
  2. MaintainX API access: confirmed in use. One question left: does the tier include webhooks? Polling is the accepted fallback either way.
  3. Confirm the Constant Contact subscriber export format.
  4. Confirm the WebTrac public event feed format (if any).
  5. Confirm the YouTube channel ownership for meeting videos.
  6. Resolve the Non-Disclosure vs Non-Discrimination file mismatch flagged in the gaps file.
  7. Run /site-search/ for known terms to surface orphan pages.
  8. Pick the match key across the four contact sources: unit number, street address, or AUC account/parcel ID. Check what AUC exports.
  9. AUC scheduled export: developer conversation pending. Fallback accepted: an employee runs a daily or weekly manual export. Does not block Phase 1.
  10. Ask the accountant: does CT tax business SaaS at 1% or 6.35%? About a $250-a-year swing on the consolidated budget.
  11. Re-verify WP Engine and Claude Max list prices before contracting; both are spreadsheet or user-stated figures.

Launch gates

Known risks