Practical guide

Contact form not sending email? Check where it stops

A success message does not prove email delivery. Follow the request from your website to the inbox and the notification.

The short answer. If a form shows success but no email arrives, check three stages: whether the website sent a request, whether the submission was saved, and whether email notifications have a verified recipient. In Formgong, also check spam, email verification, and Turnstile errors. success: true confirms request acceptance, not email arrival in your mailbox.

Formgong·

Your form Name Email Message Send message Formgong Telegram New enquiry Name · Email Open in inbox + email notification
Your website owns the design. Formgong handles submissions and notifications.

Three different outcomes to keep separate

A success message on a website, a saved record, and an email in your inbox are separate events. JavaScript might display thanks before the server responds. The server might accept a request while a notification waits for address verification or gets filtered by the mailbox.

Follow the path in order: browser request, saved submission, then notification channel. Send one recognizable test submission from the published website so you can identify the same message at each stage.

The steps below are specific to Formgong. The approach also applies to other services, but check their documentation for their error codes and settings.

1. Check whether the website sends a request

Open your browser's developer tools, select Network, and submit the form. Find the POST to https://formgong.com/submit. Check its URL, access_key, submitted fields, and response.

If there is no request, investigate the submit handler or button: a thank-you state does not send data. If the URL differs, confirm which service is actually handling the form. For plain HTML, inspect action and method; for JavaScript, inspect the fetch URL.

For a JSON response, send Accept: application/json. A native HTML form receives a redirect after acceptance, not JSON. Do not handle those two modes as if they were the same response.

2. Check the response before showing success

For JavaScript, check the HTTP status and result.success === true. A completed fetch can still return an error response. This function is for your form's submit handler; replace the key and wrap the call in try/catch.

JavaScript
// Call from your form's submit handler inside try/catch.
// Keep the entered fields when the request fails.
async function sendContactForm(form) {
  const response = await fetch("https://formgong.com/submit", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Accept: "application/json",
    },
    body: JSON.stringify({
      ...Object.fromEntries(new FormData(form)),
      access_key: "fk_your_access_key",
    }),
  });
  const result = await response.json();
  if (!response.ok || result.success !== true) {
    throw new Error(result.message || "Submission failed");
  }
  // Accepted by Formgong; this is not email-delivery confirmation.
  return result.id;
}

Error codes to look for

unknown_access_key
The key does not match a form. Copy it again from Connect website.
origin_not_allowed
The domain does not match the configured allow list. Check both the real and preview domains.
turnstile_missing / turnstile_failed
The Turnstile token is absent or unacceptable. Update the widget code and obtain a fresh token.
rate_limited / limit_exceeded
A short-term request limit or monthly allowance was exceeded. Repeated rapid retries do not fix it.

Keep the fields filled and display an understandable message when submission fails. Disable the button while the request is pending, then enable it again when the attempt finishes.

3. Check the saved record and spam status

Open the relevant form's Submissions in Formgong and find your test message. Check Spam too. If you accidentally filled the hidden botcheck field, the request can look successful while the message is classified as spam and not delivered.

Confirm that the site's key belongs to the form you opened. If AI scoring with spam holding is enabled, check that status too. Request acceptance does not promise notification delivery for every message regardless of protection.

4. Check verification, notifications, and recipients

  1. Verify the account owner's email. Normal submissions may be held before verification.
  2. Check that email notifications are enabled for this form.
  3. Check the intended recipient's address and its verification. An added but unverified address is not yet a delivery destination.
  4. Check spam, all-mail folders, mailbox filters, and forwarding rules.

A submission appearing in the inbox and Telegram helps narrow the investigation to the email channel. It does not prove that an email reached the recipient's mailbox. An automatic reply to the visitor is also a separate message with its own settings.

If the problem began after enabling Turnstile

Your form must send cf-turnstile-response, and the service must validate it. The widget alone is insufficient. Turnstile tokens expire and are single-use; a retry may require refreshing the widget.

Copy the current example from Connect website after changing protection settings. Test the published domain. Keep the Turnstile secret out of the browser; frontend code uses the site key.

What to collect if the cause remains unclear

Keep the form page URL, test time, HTTP status, and response error code. If the response includes a submission ID, keep it too. Do not publish real customer details, tokens, or secret keys in a support request.

For another channel, follow the Telegram guide. If the form is not connected yet, start with the working HTML example or Lovable setup. After the fix, repeat the test and check the entire path through to the notification.

Frequently asked questions

Does success: true mean the email was delivered?

No. It confirms that Formgong accepted the request. Notification delivery happens separately; spam classification or a hold pending email verification can also affect it.

Why is the submission in Telegram but not email?

These are separate channels. Check that email notifications are enabled, the intended recipient is verified, and the email has not gone to spam.

Why does a filled botcheck not show an error?

It is a honeypot for bots. A request can look successful while being stored as spam without notifications. A person should leave this hidden field empty.

What should I do after a Turnstile error?

Check the current site key and the cf-turnstile-response field. Obtain a fresh token for the retry: tokens are single-use and expire.

Sources and documentation

Official references for this guide: MDN: Fetch API, Cloudflare: Turnstile token validation. Formgong documentation, where data is stored.

Read this article as Markdown
← Back to the blog