AI Portfolio Lab Tools Games Blog Feedback
All Posts

I Built a Form That Can't Tell If It Worked

I wired a feedback form into my Apps Script backend using no-cors mode. The success screen fires regardless of whether the message actually landed. Here's what that taught me about success states.

2 min read
web developmentApps Scriptautomationricoordonio.com

I used to read confirmation screens the same way I read cron job logs: no error means it worked.

Then I built a feedback form.

A few weeks ago I added a feedback form to ricoordonio.com. Category picker, message field, submit button. I already had an Apps Script endpoint handling the analytics beacon, so I routed submissions through that same pipeline. Reuse what’s there. Ship faster.

Apps Script doesn’t send CORS headers, so the only way to POST to it from a browser is no-cors mode.

No-cors lets you send the request. It doesn’t let you read the response. Not the status code, not the body, nothing. The browser fires the call and returns an opaque result. You get: the request ran. That’s it.

So the “Signal received” screen fires on the fetch completing, not on the data landing in the spreadsheet. Just: no exception was thrown.

Which means the screen fires whether the message made it through or got dropped somewhere between my server and Google’s infrastructure. Same result from the browser’s perspective, either way.

I ran a test. Submitted a garbage message and watched my inbox. The email arrived four seconds later. That’s when I knew it worked. Not when the screen said anything. The screen had already declared success before the email existed.

No-cors isn’t broken. It’s intentional. The browser is correctly refusing to let client-side JavaScript read responses from foreign origins. Security feature. The tradeoff I accepted is: send, don’t know.

I’ve built plenty of systems where I only find out something failed when someone tells me. For a feedback form, that’s a little circular: the mechanism for reporting failures might be one of the things that failed.

For a personal site that gets a message about as often as a sunny day in Seattle, “probably worked” is an acceptable confidence level. I’m not going to build a confirmation pipeline for that.

But I think about it differently now. When a form says it got your message, that might mean the message landed, or it might mean the call didn’t throw. Usually those are the same thing.

Not always.

The screen declared success before the email existed. I know that now. I can’t unknow it.