fix(contact): the address printed on the site did not receive mail - #376
Merged
Conversation
CONTACT.email was hallo@evig.ch. evig.ch is not registered — it publishes no MX and no A record — so every message a user sent there bounced. That was the whole conversion path. Production has 213 live listings, online payment is deliberately unset (.env.selfhost.local.example: 'leave unset until go-live'), so checkout shows 'Bitte kontaktiere evig, wenn du sofort bezahlen möchtest' — pointing at the dead address. There is no phone either (CONTACT.phone is ''). A buyer holding CHF 2500 had no working way to reach the organisation. Now butaeff@gmail.com: not the long-term brand address, the one that works today. 21 surfaces read it from config — footer, contact page, Impressum, Datenschutz, AGB — so one line moves all of them. When evig.ch is registered and authenticated (Brevo SPF+DKIM), change that line back. ORG.emailDomain deliberately stays evig.ch: it drives staff-email detection and the default sender, and is not where users write to. Also fixed the second dead end: the password-reset failure message hardcoded kontakt@revamp-it.ch — shown precisely WHEN mail delivery just failed, so that address is the user's only way back in. It now reads CONTACT.email. contact-address-reachable.test.ts holds both rules: no publishing on a domain that receives no mail, and no contact address typed inline. Proven by mutation — reverting the domain fails 2 assertions, restoring the inline address fails 1. It strips comments first, so prose explaining the rule does not trip it. Verified: lint, umlauts, chrome, docs, compliance, typecheck, 7843 tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The problem
CONTACT.emailwashallo@evig.ch. evig.ch is not registered — no MX record, no A record — so every message a user sent there bounced.That was the entire conversion path:
.env.selfhost.local.example: "leave unset until go-live"), so checkout shows "Bitte kontaktiere evig, wenn du sofort bezahlen möchtest" — pointing at the dead addressCONTACT.phoneis''— there is no phone lineA buyer ready to spend CHF 2,500 on the MacBook in the catalogue had no working way to reach the organisation.
The fix
butaeff@gmail.com— not the long-term brand address, the one that receives mail today. 21 surfaces read it from config (footer, contact page, Impressum, Datenschutz, AGB, CO₂ page…), so one line moves all of them. When evig.ch is registered and its mail is authenticated (Brevo SPF+DKIM), change that line back.ORG.emailDomaindeliberately staysevig.ch— it drives staff-email detection and the default sender, and is not where users write to. Repointing it at gmail would be wrong.Second dead end, same class
api/auth/forgot-passwordhardcodedkontakt@revamp-it.chin its failure message — shown precisely when mail delivery just failed, making that address the user's only remaining way back into their account. It now readsCONTACT.email.The gate
contact-address-reachable.test.tsholds both rules:Proven by mutation: reverting the domain fails 2 assertions; reintroducing the inline address fails 1. It strips comments first, so prose explaining the rule doesn't trip it — a gate that fails on its own documentation just teaches people to delete the documentation.
Verification
lint, umlaut, card-shell, docs-path and compliance gates green · typecheck clean · 7843 tests
🤖 Generated with Claude Code