A useful enquiry form before the backend is connected
Short answer. You can finish a reviewable website prototype without a form-service account. Let the visitor prepare and copy a message, or open an email draft to an address the owner supplied. Say clearly that nothing has been sent. Connect a service before calling the form a live enquiry channel.
Choose the state you can actually support
| Available connection | Useful action | What you can claim |
|---|---|---|
| None yet | Prepare and copy a readable draft | Prototype; sending is not connected |
| Owner-confirmed email | Open a prefilled draft for the visitor to review and send | Email draft opened; delivery is unconfirmed |
| Owner's form service or backend | Submit to that endpoint and handle success and failure | Accepted only after that service confirms; delivery only if verified separately |
Copy a working static example
Open the form example · Download the standalone HTML
- Use the example in the website's existing design. It has labelled fields, a reviewable draft and a Copy button with a manual-copy fallback.
- Keep
OWNER_EMAILempty until the owner gives you a real contact. An empty recipient is visibly labelled as a prototype. - If the owner supplies an email address, set it in the file. The visitor chooses whether to open and send the draft. The page sends nothing automatically.
- When a form endpoint is provided, replace the draft handler with that integration. Test acceptance and failure with the owner. Do not place service secrets in frontend code.
The example does not transmit visitor enquiries to Add Domain, use a third-party form service or save them in browser storage. A draft remains on the page until the visitor copies it or chooses their email app. The site owner must choose their real enquiry workflow and privacy information.
Why a static form does not send
| Symptom | Likely cause and check | Fix and honest result |
|---|---|---|
mailto: does nothing on a phone, or asks to choose an app | The visitor has no email handler configured, or the browser cannot hand the link to it. A mailto link opens an email draft; it does not send a message. | Keep a visible Copy message option and the owner-confirmed contact. For sending inside the page, connect the owner's form service or backend. Never report delivery after opening a draft. Email links. |
| “Blocked form submission” inside a sandboxed iframe | An iframe with sandbox but no allow-forms blocks native form submission. A JavaScript handler can also need allow-scripts; opening a draft can face separate navigation restrictions. | Test the standalone published page. If the embed owner controls the sandbox and approves the form, request only the required permissions, including allow-forms for native submission. Keep the host's other restrictions. Iframe sandbox tokens. |
Browser fetch or XHR fails with a CORS error | The endpoint has not allowed the published origin, or its preflight OPTIONS response is missing the allowed origin, method or headers. Inspect the browser Network panel and the service logs. | Use the provider's documented browser integration, configure the endpoint's CORS policy for the real site, or use a backend on the same origin. Native HTML form navigation differs from fetch/XHR. Do not use mode: no-cors as a success signal: an opaque response cannot confirm acceptance. CORS. |
A browser error does not always prove nothing was sent: a simple cross-origin request may reach the service before the browser blocks access to its response. Check service logs before retrying to avoid duplicate enquiries. A successful HTTP response confirms only what the service documents; verify delivery separately.
Handover without pretending the prototype is live
Report: “Website preview ready. Enquiry draft and copy tested. Sending is not connected: [form endpoint] or an owner-confirmed contact is still needed.” A booking request is also different from a confirmed reservation.
Then prepare the public launch
After the working preview, choose the publishing host, test the customer action and confirm the owner's final address. A platform URL can be shared already. An own domain is optional and adds control over the address when moving hosts. Reuse an existing domain, or check a suitable name if the owner wants one.
Next: public-launch checklist · publishing routes for each AI platform.
Building the site with an AI agent? Read the complete website workflow in HTML, or its raw SKILL.md / raw GitHub copy. No installation is needed. API and MCP for agents: For agents.