docs(launch): website-integration env vars + cutover sequence

deployment-plan.md gains a full env-var reference (CRM + website) and the cutover env-flip sequence; launch-readiness.md gets the 2026-06-02 closeout; BACKLOG.md adds the deferred integration-health-panel idea (section L).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-02 17:22:12 +02:00
parent 990b566eff
commit 0416dc8d39
3 changed files with 158 additions and 1 deletions

View File

@@ -644,3 +644,75 @@ unproven full builds onto a same-day prod launch.
- **Marketing + Financial reports** — remain unbuilt + now hidden; gated
on Init 1b (website UTM/inquiry cutover) and Init 1c (invoices-module
decision) respectively.
---
## 2026-06-02 (session) — Pre-deployment closeout
Driving toward cutover. Decisions + state captured this session.
### Decisions locked
- **Email ownership = the new CRM, flag-gated (option A).** Registrant
confirmations + staff alerts move from the website to the CRM. The CRM
intake path sends them behind a per-port flag (default OFF); the website
keeps sending until cutover, then flips off in one coordinated step (no
gap, no double-send). Preserve asymmetry: berth/residence = confirmation
- alert; contact form = alert only. Prove end-to-end before the flip.
Cross-ref: `project_email_ownership_at_cutover` memory.
- **`feature/video-headers` is excluded from this launch** (per Matt) — a
separate workstream, do not touch. Launch base = `main`.
- **Berth-read swap is a cutover-time flip, not now.** Until cutover NocoDB
is the live source staff update; the public map must mirror it.
- **UTM capture is cookieless** (no consent banner exists). In-memory only;
no cookie / localStorage / sessionStorage (ePrivacy/PECR). Session-scoped.
### Marketing website (repo: code.portnimara.com/ron/website.git, branch `main`)
Local `main` was 1 unpushed commit ahead (the CRM dual-write) + an uncommitted
Umami refactor; nothing to pull from the remote. Reconciled:
- Committed the Umami refactor (`7e111b3`, `d03fcee`) to set a clean base.
`main` is NOT yet pushed (unpushed since 2026-05-04).
- **Inquiry dual-write**: pre-existing, dormant (no-ops without env). Contract
verified matching CRM `/api/public/website-inquiries` (header, payload,
`kind` enum, idempotent UUID).
- **Berth-read swap**: SHIPPED locally, default-OFF. `server/utils/berths.ts`
reads CRM `/api/public/berths` (+ single) when `CRM_BERTHS_ENABLED` truthy
and `CRM_INTAKE_URL` set; else NocoDB. `register.ts` skips the NocoDB
interest->berth link in CRM mode (UUID ids; CRM links via dual-write).
`PublicBerth` confirmed a verbatim superset of the website `Berth` type
incl. `Map Data` {path,x,y,transform,fontSize} -> the CRM fully backs the
website berth map. vue-tsc: type-clean.
- **UTM forwarding**: SHIPPED locally, cookieless. `plugins/utm.client.ts`
reads utm\_\* from the landing URL into memory and adds an `x-utm` header on
/api/register + /api/contact POSTs; `server/utils/utm.ts#readUtm` parses it;
`crmIntake.ts` forwards the five fields (CRM schema already accepts them).
Zero form-component changes; a misfire degrades to null UTM (no breakage).
vue-tsc: type-clean.
- **Uncommitted**: the berth-swap + UTM changes are in the working tree, not
yet committed (awaiting go).
- Pre-existing bugs noted (not fixed): `pages/berths/[mooringNumber].vue:123`
uses `.MooringNumber` (should be `["Mooring Number"]`);
`berths-item/introduction.vue:32` mis-indexes `"Water Depth"`. The website
repo has no typecheck/lint step (recommend wiring one pre-deploy).
### Env flips required at cutover (website)
- `CRM_INTAKE_URL` + `CRM_INTAKE_SECRET` (turn on inquiry dual-write delivery)
- `CRM_BERTHS_ENABLED=1` (switch the public berth map/list to the CRM)
- website email sending OFF + CRM email flag ON (single owner)
### Closeout sequence
1. Local website (no prod risk): berth swap DONE, UTM DONE.
2. CRM-side email ownership build (flag-gated) + website email-off toggle;
prove end-to-end. NEXT.
3. [GATED] Documenso v1.13.1 -> v2.11.0 prod upgrade (dry-run passed
2026-06-01; Phases A-E sober/scheduled, per-step approval).
4. [GATED] Prod CRM deploy (Phase 1: nginx/certbot/compose/.env). Inputs
needed: Postgres own/shared, deploy dir, registry token, Documenso API
token.
5. [GATED] Data migration + cutover (MinIO EOI backfill, final NocoDB
reconcile, freeze + website env flips) in a maintenance window, explicit go.
6. Post-launch: M23/M25 migrations; e2e in CI; website typecheck/lint.