Every web app has at least one form: contact forms, waitlist signups, feedback widgets. And every time you ship one, you need the same thing. Get notified when someone fills it out, and ideally send the person a confirmation back.
The usual path is painful. You stand up a server, wire up an email provider, handle errors, manage retries. Or you reach for a hosted form tool and hit a paywall the moment you want email forwarding, even though you're supplying the API key yourself.
This walks through form email notifications the BYOK way: alerts to your inbox and a custom auto-reply to the submitter, both sent through your own Resend account, with no backend to maintain.
Form Email Notifications Without a Paywall
Here's what you'll wire up:
- Every submission stored in a dashboard you control
- A notification email to your team on each submission
- A custom auto-reply to the person who submitted
- Per-send delivery logs so you can see exactly what happened
All of it runs on your Resend key. OSForms makes the API call; Resend bills your account directly, at Resend's pricing, which starts at 3,000 emails/month free. There's no per-email markup and no integration tier to unlock.
"You're not paying for integrations. You're paying for the markup on your own API keys."
You'll need an OSForms account and a Resend account. Both are free, no card required.
Connecting Your Resend Key
1. Create a form. In the dashboard, hit New Form and name it (for example "Contact Form"). You'll get a unique endpoint URL:
https://osforms.com/api/v1/f/abc123xyz2. Add the email integration. Go to Integrations → Email, paste your Resend API key (it starts with re_), and set the from address plus one or more to addresses for notifications.
OSForms encrypts your key at rest with AES-256-GCM. It's never stored in plain text, never logged, and only decrypted in memory when a submission arrives.
3. Point your form at the endpoint. Set the URL as your form's action attribute:
<form action="https://osforms.com/api/v1/f/abc123xyz" method="POST">
<label for="name">Name</label>
<input type="text" id="name" name="name" required />
<label for="email">Email</label>
<input type="email" id="email" name="email" required />
<label for="message">Message</label>
<textarea id="message" name="message" rows="4" required></textarea>
<button type="submit">Send</button>
</form>Submit it, and within seconds the notification email lands in your inbox with every field formatted into a table. The form works on any stack: plain HTML, React, Vue, Astro, anything that can send a POST request.
4. Set a success redirect. If you don't set a redirect URL, the endpoint replies with a JSON { "success": true } body. That's fine for fetch/AJAX, but a plain HTML form will drop your visitor on raw JSON. For HTML forms, set a redirect URL in form settings (for example /thank-you) so visitors land on a clean confirmation.
Writing a Custom Auto-Reply Template
A notification tells you about the submission. An auto-reply tells the submitter you got it. It's the feature most hosted tools lock behind a higher tier. OSForms includes it for free.
In your email integration, turn on Auto-Reply. It ships with a sensible default template you can edit, and you control two things:
- Subject, for example
Thanks for reaching out - HTML template, the body of the reply
Both support variables interpolated from the submission:
{{formName}},{{submittedAt}},{{submissionId}}for submission metadata{{fieldName}}for any field your form posts (for example{{name}},{{email}}){{#if fieldName}}...{{/if}}to render a block only when that field is present
<p>Hi {{name}},</p>
<p>
Thanks for reaching out. We got your message and will reply within one
business day.
</p>
{{#if company}}
<p>Noted that you're writing on behalf of {{company}}.</p>
{{/if}}
<p>— The team</p>You don't have to tell OSForms which field holds the submitter's address. It auto-detects common field names (email, user_email, contactEmail, and similar) and replies there. If your field has an unusual name, set it explicitly in the auto-reply settings. If no valid email is found, the auto-reply is skipped, and the notification still sends.
Debugging Delivery With Per-Send Logs
Email silently failing is the worst failure mode, so every send is logged. For each submission, OSForms records an integration log with the result of every integration that ran: success, or the exact error message Resend returned.
That means you can answer "did the email actually go out?" without guessing:
- Submission stored first. The endpoint stores the submission and returns
200 OKimmediately, then fires integrations in the background viawaitUntil(). Your visitor never waits on Resend. - Each send logged independently. The notification and the auto-reply run and log separately, so a skipped auto-reply (say, no email field in the submission) never hides a successful notification.
- Failures surface. If a send fails, you get an in-app notification with the error so you can fix the key and move on. Nothing is lost, because the submission is already saved.
The OSForms Take
Every hosted form tool charges for email forwarding. Formspree: $15/month. FormBold: $9/month. Basin: $7/month. Auto-reply usually sits a tier higher still, all for features that run entirely on your Resend key.
That's not a business model. It's a markup on your own credentials.
OSForms flips it. You bring the Resend key, and email (notifications and auto-reply) is free. We only charge on submission volume, which scales with actual usage, not with how many integrations you dare to enable.
The code is open source on GitHub, so you can audit exactly how your key is stored, encrypted, and used. And for the reasoning behind the model, read what bring your own key actually means.
