Can people actually reach you? A form audit of all 25 live sites
Private deliverable. Enter the hub password to continue.
That's not right. Try again.
Can people actually reach you? A form audit of all 25 live sites
Every form on every site now works, and every one of them saves what people send you as well as emailing it.
Every live site was crawled on August 8, 2026, its contact and feedback pages read, and every form endpoint tested with a real submission. This is not "a form tag exists in the HTML." Each verdict is based on what the server actually did when a message was sent to it, and every fix below was confirmed twice: once by a scripted request, once by filling the form in a real browser.
Where it stands now
Ten sites can receive something from a visitor, and nothing on any site silently discards a message any more.
| Site | Form | State |
|---|---|---|
| annettethompson.com | /contact | fixed today. New endpoint, saves to D1, emails you |
| newtoboulder.com | /contact/ advertising inquiries | fixed today. Endpoint existed but had never been deployed |
| socialmapped.com | /contact | fixed today. The proxy dropped every POST |
| vitalency.com | /contact/ discovery call | fixed today. Was on dead FormSubmit, now your own rail |
| outdoorboulder.com | homepage signup | built today. Was an honest disabled stub waiting for a backend |
| boulderthingstodo.com | /contact/ and signup | already working |
| seobeliever.com | /contact | already working |
| sponsorlab.ai | brand inquiry and waitlist | already working |
| verityagentic.ai | /contact | already working, on Web3Forms |
| recipememoir.com | waitlist and feedback widget | already working |
| socialmapped.com | floating suggestion widget | already working |
| bonevoyagedogrescue.com | adoption application | already working |
| ajijic.org, medspasboulder.com, testosteroneinwomen.com | email signup | already working |
What was actually broken, and why
Three of the four failures shared one cause. The form was written as
action="/contact" with data-static-form-name, which is the Netlify
convention. On Cloudflare Pages nothing handles it, so the POST re-rendered the
page and the message was gone. No error, no bounce, nothing in a log. The
visitor sees a page that looks like it worked.
- annettethompson.com had exactly that, on your own name, with no handler anywhere in the repo.
- socialmapped.com served the same page through a proxy that only ever handled GET and HEAD, so submissions fell through to its catch-all 404.
- newtoboulder.com was different and more annoying: the endpoint was written properly in July, sitting in the repo, and simply never deployed. The live route answered 404 and every advertising inquiry was lost.
- vitalency.com posted to FormSubmit, a third-party backend that requires one activation click before it will deliver anything. That click was never made. Every discovery-call request since launch produced an "Action Required: Activate FormSubmit" email to your Gmail instead of the lead. The form looked perfectly healthy: correct markup, a real endpoint, HTTP 200 on submit.
Those lost messages are not recoverable. Nothing was stored anywhere.
Two corrections to the first version of this page
Worth writing down, because the mistake is instructive.
recipememoir.com was never broken. The first pass called its waitlist dead
because GET /api/waitlist returned 404. That test is right for an endpoint
with method-specific handlers, where a live route answers 405, and wrong for a
catch-all router, which returns 404 for any path plus method it does not match.
A real POST returns {"ok":true} and always did. Its feedback widget works too.
outdoorboulder.com's disabled form was correct, not broken. It was a deliberate stub carrying a comment saying not to wire it up until a D1-backed handler existed. That is the right instinct, and the opposite of the bug on the other four. It has a real backend now, so the form is live.
What each fix actually does
The same shape everywhere, which is the point: one pattern to maintain rather than five.
- Write to D1 first. The database is the durable record, so a lead survives a bad day at Amazon.
- Email you second, over SES, from the site's own domain, with the sender's address as Reply-To so hitting reply answers the actual person.
- A mail failure is never reported to the visitor as an error, because the message is already saved and asking someone to resend something you already have is the worse outcome.
- Validation says what to do about it. "That email address does not look right" rather than a 400.
- A honeypot field, hidden from people, catches the obvious bots.
One detail worth knowing: From and Reply-To are deliberately different domains on newtoboulder.com, vitalency.com and outdoorboulder.com. Verifying a domain in SES grants the right to send from it, not a mailbox to receive at. On a zone with no MX records, a reply to a branded address bounces, so Reply-To points at [email protected], which works. Do not tidy them to match.
The sites that had no way to reach you
That list is now empty. Every site below got a contact form today, written in its own voice and linked from its nav or footer:
curecaninedisease.com, smartstrongalive.com, proteinfirstrecipes.com, nottoooldforai.com, testosteroneinwomen.com, buildamensgroup.com, househelperhub.com, ajijic.org, verityagentic.ai and trainerbooked.com.
Two sites were already contactable and did not need one: medspasboulder.com publishes an email address with a good explanation of what you will and will not do, and rebuildingseminars.com lists three real addresses on Bob's GoHighLevel site.
Verification
Every fixed endpoint was checked four ways: the route answers 405 to a GET
rather than 404, invalid input returns the right message, a valid submission
returns stored: true and mailed: true, and the form was then filled in and
submitted in a real browser. All test rows have been deleted from the
databases. Her site validator runs GREEN on New to Boulder, Vitalency and
Outdoor Boulder.
Round two: contact forms everywhere, and a database behind all of them
Two corrections to what this page said this morning, then what changed.
The "no way to reach you" list was wrong. It was built by following links
whose text looked like "contact", which cannot see a form living on /schedule,
/kit, /publicar or /lead-magnet. Walking every URL in every sitemap found
working forms on most of those sites: Bob's consultation form, the men's group
kit signup, both HouseHelperHub registration flows, the Not Too Old For AI lead
magnet, the Smart Strong Alive protein plan, and the Ajijic and Testosterone in
Women signups. All of them work. What none of them had was a way to send a
message, which is a different thing from handing over an address.
One more site was quietly broken. tasteboulder.com/submit/ has had a form
since August 2 and its endpoint had never been deployed, so every report of a
new opening, a correction or a closure hit a 405 and vanished. Same failure as
New to Boulder. It works now, and notifications are on for the first time.
New contact forms, each in its own site's voice
curecaninedisease.com (bilingual, and it tells anyone with a sick dog to call a vet), smartstrongalive.com, proteinfirstrecipes.com, nottoooldforai.com, testosteroneinwomen.com, buildamensgroup.com, househelperhub.com (bilingual), ajijic.org, verityagentic.ai and trainerbooked.com. Each is linked from the nav or footer, because a form nobody can find is barely a form.
bobmanthy.com did not get one, on purpose
Its /schedule/ form already reaches Bob, and it is built for that specific
job: it emails him and deliberately never writes a visitor's own words to the
database, because they are a stranger's reason for seeking counseling. A
second, more casual contact form would have collected the same disclosures under
weaker handling. It got the word "Contact" in the footer instead, pointing at
the form that already works.
This is the one thing that needs your decision. You asked for every form to save what people send. Bob's is the exception, and switching it on would mean storing a prospective therapy client's description of what they are going through, on a licensed clinician's site. I have left it as it is. Say the word and I will change it, but it should be your call and probably Bob's too.
Everything now saves as well as sends
Sixteen live endpoints, each verified with a real submission returning both
stored: true and mailed: true. Three were not saving anything before today:
- verityagentic.ai posted straight to Web3Forms, which delivered mail and stored nothing. Every enquiry to the consultancy existed only as one email in one inbox, with no record you owned. That was the most expensive gap of the lot, and it now writes to its own database first.
- househelperhub.com and ajijic.org were email-only when I built them this afternoon, because neither project had a database binding available in its config. Both now have one, attached to the Pages project directly.
The shape is the same everywhere: save first, mail second, and never tell someone their message failed when it is already saved. Test rows have all been deleted.
Published to Annette's hub. Rebuilt from the source markdown, so edit the source and rerun rather than editing this page.