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

index.html
<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.

fieldpurpose
_subjectSubject line on the notification email.
_replytoVisitor email used for Reply-To, so you can hit reply.
_ccCC address on the notification.
_nextHTTPS URL to redirect to after a successful submit. Omit to use https://www.postme.dev/thank-you.
_postme_messageCustom success message (used on the thank-you page or returned as JSON).
_postme_pending_messageMessage shown when the inbox still needs email confirmation.
_postme_error_nextHTTPS URL when the submit fails. Omit to use https://www.postme.dev/thank-you?status=error.
_postme_returnHTTPS 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_jsonForce a JSON response. Cross-origin fetch does this automatically.
_postme_hpHoneypot — 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.

fieldformat
_pm_emailPlain text — escaped and wrapped for HTML clients.
_pm_email_htmlRaw HTML after interpolation (like Zapier's HTML body).
_pm_email_rawPlain-text body; also sent as the email text part.
_pm_email_markdownMarkdown 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 }