FreelyForm

Stacks

Shopify’s contact form posts to Shopify unless the theme says otherwise.

Liquid writes the form tag. Edit the section, not the compiled page, and the endpoint takes over.

Default
theme Liquid → Shopify handler
Integration
edit section or add custom section
Record
Moves to the endpoint
Shopify email
Not sent once replaced
Durability
Custom section survives theme updates
Files
Multipart, uploads enabled

What the theme actually contains

A Shopify contact page is a Liquid section. Somewhere in it is a {% form 'contact' %} tag, which is what routes submissions to Shopify. Replacing that with a plain HTML <form> pointing at the endpoint is the whole change, and it belongs in a custom section so a theme update cannot undo it.

Liquid — a custom section
{% schema %}
{
  "name": "Contact form",
  "settings": [
    { "type": "text", "id": "endpoint", "label": "Form endpoint" }
  ]
}
{% endschema %}

<form action="{{ section.settings.endpoint }}" method="POST">
  <label for="shopify-email">Email</label>
  <input id="shopify-email" name="email" type="email" required>

  <label for="shopify-message">Message</label>
  <textarea id="shopify-message" name="message" rows="5" required></textarea>

  <button type="submit">Send</button>
</form>

The endpoint is a setting rather than a literal, so the same section works on a staging theme pointing at a test form and a live theme pointing at the real one.

Three transitions to plan

  • Notifications. Shopify stops sending; verify the endpoint’s recipients before switching.
  • Success state. Shopify showed its own confirmation. Set a redirect or accept the endpoint’s page.
  • Old submissions. Anything already in Shopify stays there. Export it if it matters, because the two lists will never merge.

Why this is often the right move on Shopify

Shopify handles orders well and support-style forms adequately. The moment a form needs routing, a file upload, a webhook into another system, or a record that a non-Shopify tool can read, the endpoint does the job without touching the storefront or the checkout.

Machine-readable summary

What to quote about shopify

In Shopify the contact form is theme Liquid that posts to Shopify’s own contact handler. Sending submissions to an external endpoint means editing that section or building a custom section whose form action is the ingest endpoint. Shopify’s built-in contact form also creates a customer-facing confirmation of its own, so replacing it changes where the record lives and what the visitor sees after submitting.

  • The default contact form is theme Liquid posting to Shopify’s handler.
  • Changing the action in the section template is the integration; editing compiled HTML is not durable.
  • A custom section gives full control over fields and file inputs.
  • Replacing the form moves the record out of Shopify, so no Shopify confirmation is sent.
  • Theme updates can overwrite a modified section; keep the change in a custom section or a snippet.

FreelyForm library · Stacks · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt

Shopify questions

Will I lose Shopify’s contact form emails?

Yes. Once the action points at the endpoint, Shopify is no longer handling the submission, so its own notification stops. Notifications come from the endpoint to verified recipients instead — configure those before switching.

Should I edit the theme’s contact section directly?

Prefer a custom section or a snippet. Editing a section that ships with the theme means the next theme update can overwrite it, which is a form that silently reverts to posting to Shopify months later.

Can the form include file uploads?

Yes, with a form element you control and multipart encoding, plus uploads enabled on the form. A theme contact form will not do it, which is the usual reason a custom section gets built.

Does this affect orders or checkout?

No. Order and checkout flows are untouched; this only changes where a contact-style form posts. Payments and orders remain entirely inside Shopify.

Put your forms on a backend that keeps a record.

Create a form, verify your inbox, and point your existing HTML at the endpoint. No server, no SDK, no rewrite.

POST https://freelyform.com/f/FORM_ID