Connect your website forms
Collect sign-ups and enquiries straight into a list. Share the hosted page, embed it on your site, connect a form you already have, or send contacts from your own server.
Which option should I use?
| Option | Best for | Needs an API key? |
|---|---|---|
| Hosted page | A link you can share, no website needed | No |
| Embed | Putting the form on your website as a frame, a button or HTML | No |
| Your own form | Keeping your existing form and its design | No |
| API | Your server, app or automation tool, with tags and extra fields | Yes, server-side only |
Set up the list first
- Open Lists and create a list for this form, or open an existing one.
- On the list's Form / Landing Page tab, tick Enable hosted page.
- Choose the fields to collect. Email is always required; add Name, Company, Phone and Message as needed. If you add Message, it becomes required.
- Write the Success message, then save.
- Set alerts and an automatic reply on the Notifications tab (see below).
The list ID is in the address bar, after /contacts/lists/.
Share the hosted page
Every list with its form switched on has its own page. Copy the exact link from Share / Embed → Link.
https://app.yeevu.com/contacts/f/<your list ID>
- Pick a template, then add your title, logo, description, button text and colour. Add a headline, image or features to turn it into a full landing page.
- Set a Redirect URL to send people to your own thank-you page.
- Turn on Require Cloudflare Turnstile if you get spam. It works on the hosted page, the iframe and the button.
Embed the form on your website
Open Share / Embed on the list's Form / Landing Page tab and copy a snippet. Your list ID is already filled in.
- iframe: shows the form inside your page (form layouts only).
- Button widget: a button that opens the form in a pop-up (form layouts only). Change the label with
data-buttonand colours withdata-coloranddata-text-color. - HTML: a complete form you can restyle. It matches your chosen fields and includes spam protection.
Turn Turnstile off if you use the HTML snippet. Turnstile only works on the hosted page, the iframe and the button, so the HTML snippet's submissions are refused while it's on.
Connect a form you already have
Keep your own form and send each entry to your list with a few lines of JavaScript. No API key is needed: the list ID in the address decides where entries go, and the address can be called from any website. Switch the list's form on first. Share / Embed → Your own form gives you a snippet with your list ID and fields filled in.
POST https://app.yeevu.com/contacts/api/f/<your list ID>/submit Content-Type: application/json
Send JSON from JavaScript. A plain HTML form that posts straight to the address won't work.
Fields you can send
email | Required. |
name, company, phone | Kept when ticked on the Form tab. |
message | Kept, and required, when Message is ticked. |
subject | Optional. Becomes the subject of your alert email. |
honeypot | Spam trap: the value of a hidden field people never fill in. If it has a value, the entry is dropped. |
Other fields are ignored. To keep extra answers, add them to message, or use the API.
Example
<form id="yeevu-form">
<input name="name" placeholder="Your name">
<input name="email" type="email" placeholder="Email" required>
<textarea name="message" placeholder="How can we help?" required></textarea>
<input name="website" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true">
<button type="submit">Send</button>
<p data-yeevu-status role="status"></p>
</form>
<script>
document.getElementById('yeevu-form').addEventListener('submit', async (e) => {
e.preventDefault();
const form = e.target, status = form.querySelector('[data-yeevu-status]');
const res = await fetch('https://app.yeevu.com/contacts/api/f/<your list ID>/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: form.email.value, name: form.name.value, message: form.message.value,
subject: 'Website enquiry', honeypot: form.website.value
})
});
const data = await res.json().catch(() => ({}));
status.textContent = res.ok ? 'Thanks, we have your message.' : (data.error || 'Something went wrong. Please try again.');
if (res.ok) form.reset();
});
</script>Responses
| 200 | {"ok":true}: saved. A repeat sign-up from the same address also returns this, without a duplicate. |
| 400 | Valid email required or Message required. Show it to the visitor. |
| 404 | Form not found: the list's form isn't switched on, or the list ID is wrong. |
| 429 | Too many submissions in a short time. Wait a minute and try again. |
When an existing contact submits again, blank details are filled in and existing values are never overwritten.
Send contacts from your server (API)
Create a key in Settings → API Keys; Settings → Developer has more examples. Send the key in the Authorization header.
Keep your key on your server. An API key gives full access to your account, so never put it in a web page; for website forms use your own form.
curl https://app.yeevu.com/contacts/api/v1/contacts \
-H "Authorization: Bearer yc_your_key" \
-H "Content-Type: application/json" \
-H "User-Agent: my-app/1.0" \
-d '{
"email": "jane@example.com",
"list_id": "<your list ID>",
"name": "Jane Doe",
"company": "Doe Bakery",
"source": "website",
"tags": ["quote-request"],
"budget": "2-5k"
}'emailandlist_idare required.name,company,phoneandsourceare saved on the contact; any other field is kept as an extra field.tagsadds tags, creating any that don't exist.- The same email updates the existing contact: fields you send replace old values, fields you leave out are kept, tags are added.
- Replies:
201withcontact_idfor a new contact,200with"merged":truefor an existing one. - Send a
User-Agentheader from server code. Automation tools with an HTTP request step can use the same call. - Contacts added through the API don't get the automatic reply.
Alerts and automatic replies
Both are on the list's Notifications tab. Changes save as you make them.
- Tick Email me about form submissions. Leave Send to blank to use your login email.
- Forms with a Message field alert you for every message. For sign-up forms and API contacts, also tick Also when a new contact is added.
- For an automatic reply, connect a mailbox, tick Send a reply when someone submits the form, then pick a template or write a message.
- Personalise with
{{first_name|there}},{{name}},{{company|your company}},{{email}}and{{phone}}. - Each address gets at most one reply per list every 24 hours, and each list sends up to 100 replies a day. Suppressed contacts never get one.
Privacy and consent
The hosted form has no consent checkbox. Add a short line near your form explaining how you'll use the details, with a link to your privacy policy. If you collect consent yourself, send it through the API as an extra field, such as "consentGiven": true.
Troubleshooting
| "Form not found" | Tick Enable hosted page on the Form / Landing Page tab and save, then check the list ID. |
| Missing name, company or phone | Tick those fields on the Form tab; unticked fields are ignored. |
| Your own form does nothing | It must send JSON with JavaScript; a plain HTML form post won't work. |
| "Captcha required" from the HTML snippet | Turn Turnstile off, or use the iframe or button. |
| No alert for a new sign-up | Tick Also when a new contact is added. Repeat sign-ups don't alert. |
| API returns 401 or 404 | 401: copy the key again from API Keys. 404 "List not found": check list_id. |