Launch blocker: verify support email path still works #9

Open
opened 2026-05-02 23:38:48 +00:00 by jester · 4 comments
Owner

Launch blocker

Verify the support email path still works before launch.

Context

Support email has been configured/tested previously, but needs current production-like validation after recent auth/API/Portal/billing changes.

Scope to validate

  • Public support/contact form sends successfully, if present.
  • Authenticated support/contact path sends successfully, if present.
  • Password reset / account email path is still working if it shares SMTP/provider config.
  • Support mailbox receives the message.
  • Sender/from/reply-to values are correct.
  • Failure behavior is user-safe and does not leak SMTP/provider details.
  • Rate limiting/spam controls are acceptable for launch.

Validation needed

  • Send test email from public path.
  • Send test email from authenticated user path if applicable.
  • Confirm receipt in support inbox.
  • Confirm production env vars/secrets are present and not stale.

Launch expectation

No new feature work is implied unless validation shows the current support email path is broken.

## Launch blocker Verify the support email path still works before launch. ## Context Support email has been configured/tested previously, but needs current production-like validation after recent auth/API/Portal/billing changes. ## Scope to validate - Public support/contact form sends successfully, if present. - Authenticated support/contact path sends successfully, if present. - Password reset / account email path is still working if it shares SMTP/provider config. - Support mailbox receives the message. - Sender/from/reply-to values are correct. - Failure behavior is user-safe and does not leak SMTP/provider details. - Rate limiting/spam controls are acceptable for launch. ## Validation needed - Send test email from public path. - Send test email from authenticated user path if applicable. - Confirm receipt in support inbox. - Confirm production env vars/secrets are present and not stale. ## Launch expectation No new feature work is implied unless validation shows the current support email path is broken.
Author
Owner

Backend validation update — support route missing

Verified on zpack-api: the Portal support form target does not currently exist on the backend.

Findings

No src/routes/support.js
src/app.js does not mount /api/support
No support/create handler found under src
Runtime check: POST http://127.0.0.1:4000/api/support/create -> 404

There is a generic email sender available:

src/services/email.js

But it is currently used by billing/email notification code, not by support form submissions.

Current actual flow

Portal submits support form
-> zpack-api /api/support/create
-> 404

So no support email or ticket is currently being sent by the API for the Portal support form.

Required fix

Add a real backend support route:

POST /api/support/create

Minimum launch behavior:

- Accept authenticated support request from Portal
- Validate subject/message/category fields
- Send email to configured support mailbox using existing email service
- Include user identity/email in the message
- Return stable success JSON
- Fail safely without leaking SMTP/provider details
- Add basic rate limiting or anti-spam guard if existing middleware is available

Portal cleanup:

- Fix any missing leading slash or incorrect support API path if present
- Confirm Portal submits to /api/support/create

Status

Support email validation is currently blocked until the backend route exists.

## Backend validation update — support route missing Verified on `zpack-api`: the Portal support form target does not currently exist on the backend. ### Findings ```text No src/routes/support.js src/app.js does not mount /api/support No support/create handler found under src Runtime check: POST http://127.0.0.1:4000/api/support/create -> 404 ``` There is a generic email sender available: ```text src/services/email.js ``` But it is currently used by billing/email notification code, not by support form submissions. ### Current actual flow ```text Portal submits support form -> zpack-api /api/support/create -> 404 ``` So no support email or ticket is currently being sent by the API for the Portal support form. ### Required fix Add a real backend support route: ```text POST /api/support/create ``` Minimum launch behavior: ```text - Accept authenticated support request from Portal - Validate subject/message/category fields - Send email to configured support mailbox using existing email service - Include user identity/email in the message - Return stable success JSON - Fail safely without leaking SMTP/provider details - Add basic rate limiting or anti-spam guard if existing middleware is available ``` Portal cleanup: ```text - Fix any missing leading slash or incorrect support API path if present - Confirm Portal submits to /api/support/create ``` ### Status Support email validation is currently blocked until the backend route exists.
Author
Owner

Implementation update — launch support ticket route added

The missing launch support route has been implemented in zpack-api.

Files changed

prisma/schema.prisma
prisma/migrations/20260503170000_add_support_tickets/migration.sql
src/routes/support.js
src/app.js
src/services/discord.js
src/services/email.js
.env.example

Backend behavior

POST /api/support/create now:

validates support form input
creates SupportTicket row
sends customer acknowledgement email
attempts Discord support alert
optionally sends support mailbox copy if configured
returns ok, ticketId, and ticketNumber

Response shape:

{
  "ok": true,
  "ticketId": "...",
  "ticketNumber": "ZLH-20260503-0001"
}

Ticket number format:

ZLH-YYYYMMDD-XXXX

Env vars added

DISCORD_SUPPORT_WEBHOOK=
SUPPORT_EMAIL_TO=support@zerolaghub.com

Email / Discord behavior

Customer acknowledgement email: enabled and validated through SMTP
Discord support alert: implemented, fail-soft if DISCORD_SUPPORT_WEBHOOK missing
Support mailbox copy: implemented, fail-soft if SUPPORT_EMAIL_TO missing

src/services/email.js now supports optional Reply-To for support mailbox flows.

Validation

npm run prisma:generate: passed
npx prisma validate: passed
node --check src/routes/support.js: passed
node --check src/services/discord.js: passed
node --check src/services/email.js: passed
node --check src/app.js: passed
git diff --check: passed
npx prisma migrate deploy: passed
zpack-api restarted
POST /api/support/create: 200
ticketNumber: ZLH-20260503-0001
SupportTicket DB row exists
Customer acknowledgement email sent to testuser1@zerolaghub.com

Discord visual validation

After configuring the Discord support webhook, a support ticket alert was visible in the #support channel with ticket/customer/category/subject/server context.

Portal note

Portal was not changed in this pass. Backend route now exists at the path Portal was already attempting to post to:

/api/support/create

Current status

Support route launch blocker is substantially resolved. Remaining validation before closing:

- Confirm actual customer/support mailbox copy if SUPPORT_EMAIL_TO is configured
- Confirm Portal form success state after valid submit
- Confirm Reply-To behavior if support mailbox copy is used
## Implementation update — launch support ticket route added The missing launch support route has been implemented in `zpack-api`. ### Files changed ```text prisma/schema.prisma prisma/migrations/20260503170000_add_support_tickets/migration.sql src/routes/support.js src/app.js src/services/discord.js src/services/email.js .env.example ``` ### Backend behavior `POST /api/support/create` now: ```text validates support form input creates SupportTicket row sends customer acknowledgement email attempts Discord support alert optionally sends support mailbox copy if configured returns ok, ticketId, and ticketNumber ``` Response shape: ```json { "ok": true, "ticketId": "...", "ticketNumber": "ZLH-20260503-0001" } ``` Ticket number format: ```text ZLH-YYYYMMDD-XXXX ``` ### Env vars added ```text DISCORD_SUPPORT_WEBHOOK= SUPPORT_EMAIL_TO=support@zerolaghub.com ``` ### Email / Discord behavior ```text Customer acknowledgement email: enabled and validated through SMTP Discord support alert: implemented, fail-soft if DISCORD_SUPPORT_WEBHOOK missing Support mailbox copy: implemented, fail-soft if SUPPORT_EMAIL_TO missing ``` `src/services/email.js` now supports optional Reply-To for support mailbox flows. ### Validation ```text npm run prisma:generate: passed npx prisma validate: passed node --check src/routes/support.js: passed node --check src/services/discord.js: passed node --check src/services/email.js: passed node --check src/app.js: passed git diff --check: passed npx prisma migrate deploy: passed zpack-api restarted POST /api/support/create: 200 ticketNumber: ZLH-20260503-0001 SupportTicket DB row exists Customer acknowledgement email sent to testuser1@zerolaghub.com ``` ### Discord visual validation After configuring the Discord support webhook, a support ticket alert was visible in the `#support` channel with ticket/customer/category/subject/server context. ### Portal note Portal was not changed in this pass. Backend route now exists at the path Portal was already attempting to post to: ```text /api/support/create ``` ### Current status Support route launch blocker is substantially resolved. Remaining validation before closing: ```text - Confirm actual customer/support mailbox copy if SUPPORT_EMAIL_TO is configured - Confirm Portal form success state after valid submit - Confirm Reply-To behavior if support mailbox copy is used ```
Author
Owner

Validation update — support route confirmed from Portal, email, and Discord

Support ticket launch flow has now been validated end-to-end from the Portal form.

Portal validation

Portal support form now submits successfully and shows the success state:

Your support request has been submitted successfully.

Email validation

Customer acknowledgement email was received in the mailbox.

Observed subject:

We received your ZeroLagHub support request [ZLH-20260503-0002]

Sender:

ZeroLagHub Support <support@zerolaghub.com>

Email content includes the submitted subject and acknowledgement text.

Discord validation

Discord #support alert was received for the Portal-created ticket.

Observed ticket:

ZLH-20260503-0002

Discord alert included:

customer name
customer email
user ID
category
priority
subject
created timestamp

A prior validation ticket also included related server/VMID context for VMID 5211.

Current status

The support launch blocker is now effectively resolved:

POST /api/support/create exists and returns success
SupportTicket DB row is created
Portal form success state works
Customer acknowledgement email is delivered
Discord support alert is delivered
Ticket number is human-readable and included in email/Discord

Remaining optional follow-up:

- Confirm support mailbox copy / Reply-To behavior if SUPPORT_EMAIL_TO is used
- Add admin ticket list/view after launch
- Add support triage/diagnostic snapshots after launch
## Validation update — support route confirmed from Portal, email, and Discord Support ticket launch flow has now been validated end-to-end from the Portal form. ### Portal validation Portal support form now submits successfully and shows the success state: ```text Your support request has been submitted successfully. ``` ### Email validation Customer acknowledgement email was received in the mailbox. Observed subject: ```text We received your ZeroLagHub support request [ZLH-20260503-0002] ``` Sender: ```text ZeroLagHub Support <support@zerolaghub.com> ``` Email content includes the submitted subject and acknowledgement text. ### Discord validation Discord `#support` alert was received for the Portal-created ticket. Observed ticket: ```text ZLH-20260503-0002 ``` Discord alert included: ```text customer name customer email user ID category priority subject created timestamp ``` A prior validation ticket also included related server/VMID context for VMID `5211`. ### Current status The support launch blocker is now effectively resolved: ```text POST /api/support/create exists and returns success SupportTicket DB row is created Portal form success state works Customer acknowledgement email is delivered Discord support alert is delivered Ticket number is human-readable and included in email/Discord ``` Remaining optional follow-up: ```text - Confirm support mailbox copy / Reply-To behavior if SUPPORT_EMAIL_TO is used - Add admin ticket list/view after launch - Add support triage/diagnostic snapshots after launch ```
Author
Owner

Final validation update — support launch path complete

Support was validated end-to-end through the Portal.

Confirmed:

Portal support form submitted successfully
Customer acknowledgement email was received
Discord #support alert was received
SupportTicket DB-backed ticket flow works
Human-readable ticket number is included

This satisfies the launch support requirement.

Post-launch enhancements remain optional:

admin ticket list/view
support triage diagnostics
self-hosted helpdesk integration
inbound email reply parsing
attachments

Status: support email/ticket launch blocker is resolved.

## Final validation update — support launch path complete Support was validated end-to-end through the Portal. Confirmed: ```text Portal support form submitted successfully Customer acknowledgement email was received Discord #support alert was received SupportTicket DB-backed ticket flow works Human-readable ticket number is included ``` This satisfies the launch support requirement. Post-launch enhancements remain optional: ```text admin ticket list/view support triage diagnostics self-hosted helpdesk integration inbound email reply parsing attachments ``` Status: support email/ticket launch blocker is resolved.
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: jester/zlh-grind#9
No description provided.