docs
Reference
Hidden inputs and JS hooks to customize what happens after a submit.
urls
PostMe Intakes
Quick try — /submit/you@example.com works without an account (email in the path, lower limits). Intakes — after you sign up, create an Intake in the console and use /intake/your-id (higher limits, webhooks). Submits and Intakes are separate products.
two ways to submit
HTML or JavaScript
Classic HTML
<form method="POST"> — browser redirects to your _next URL, or the hosted /thank-you page on PostMe (with a back link to the form site when possible). No CORS setup.
JavaScript (fetch)
Stay on the page. PostMe returns JSON with CORS headers. Post FormData or a flat JSON object.
full example
Form with options
<form action="https://www.postme.dev/submit/you@example.com" method="POST">
<input type="text" name="name" required />
<textarea name="message" required></textarea>
<input type="hidden" name="_subject" value="New inquiry" />
<input type="hidden" name="_next" value="https://www.postme.dev/thanks" />
<input type="hidden" name="_postme_error_next" value="https://www.postme.dev/error" />
<input type="hidden" name="_postme_message" value="Thanks! We'll reply soon." />
<input type="hidden" name="_postme_pending_message"
value="Confirm your email to activate this form." />
<button type="submit">Send</button>
</form>hidden fields
All options
Names start with _. They're stripped from the email body.
| field | purpose |
|---|---|
| _subject | Subject line on the notification email. |
| _replyto | Visitor email used for Reply-To, so you can hit reply. |
| _cc | CC address on the notification. |
| _next | HTTPS URL to redirect to after a successful submit. Omit to use https://www.postme.dev/thank-you. |
| _postme_message | Custom success message (used on the thank-you page or returned as JSON). |
| _postme_pending_message | Message shown when the inbox still needs email confirmation. |
| _postme_error_next | HTTPS URL when the submit fails. Omit to use https://www.postme.dev/thank-you?status=error. |
| _postme_return | HTTPS URL for the “Back to …” link on the hosted thank-you page. If omitted, the form page Referer is used when the browser sends it. |
| _postme_json | Force a JSON response. Cross-origin fetch does this automatically. |
| _postme_hp | Honeypot — keep hidden and empty. Filled values are silently ignored. |
pro · destination shapes
Customize email delivery
On Pro Intakes (/intake/your-id), set a _pm_email* template or use the shortcuts below. Use ${fieldName} in templates. The regular field subject is used as the email subject when _subject is omitted.
| field | format |
|---|---|
| _pm_email | Plain text — escaped and wrapped for HTML clients. |
| _pm_email_html | Raw HTML after interpolation (like Zapier's HTML body). |
| _pm_email_raw | Plain-text body; also sent as the email text part. |
| _pm_email_markdown | Markdown rendered to HTML (headings, lists, links). |
If you send more than one _pm_email* field, priority is html → markdown → raw → plain. Literal $ → write $$.
// Agent shortcut — only message + subject fields (markdown inferred)
{
"subject": "Upcoming Shoots — July & August",
"message": "# Upcoming Shoots\n\n### July 19 — Engagement..."
}
// Explicit format + field name
{
"subject": "Agent digest",
"content": "# Title\n\nBody...",
"_postme_email_format": "markdown",
"_postme_email_body": "content"
}
// Template (interpolate any fields)
{
"_subject": "Quick note",
"_pm_email_markdown": "${greeting}, talk to ${person}",
"greeting": "hello",
"person": "My Mom"
}javascript
Submit with fetch
form.addEventListener("submit", async (e) => {
e.preventDefault();
const res = await fetch("https://www.postme.dev/submit/you@example.com", {
method: "POST",
body: new FormData(form),
});
const data = await res.json();
if (!data.ok) {
if (data.errorRedirect) location.href = data.errorRedirect;
else alert(data.message);
return;
}
if (data.status === "pending_confirmation") {
showBanner(data.message);
return;
}
if (data.redirect) location.href = data.redirect;
else showBanner(data.message);
});response shape
JSON
// Sent (inbox confirmed)
{ "ok": true, "status": "sent", "message": "…", "redirect": "https://…" | null }
// First submit — confirmation email sent
{ "ok": true, "status": "pending_confirmation", "message": "…", "redirect": null }
// Error
{ "ok": false, "status": "error", "code": "monthly_limit", "message": "…",
"redirect": null, "errorRedirect": "https://…" | null }