Menu

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?

OptionBest forNeeds an API key?
Hosted pageA link you can share, no website neededNo
EmbedPutting the form on your website as a frame, a button or HTMLNo
Your own formKeeping your existing form and its designNo
APIYour server, app or automation tool, with tags and extra fieldsYes, server-side only

Set up the list first

  1. Open Lists and create a list for this form, or open an existing one.
  2. On the list's Form / Landing Page tab, tick Enable hosted page.
  3. Choose the fields to collect. Email is always required; add Name, Company, Phone and Message as needed. If you add Message, it becomes required.
  4. Write the Success message, then save.
  5. 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-button and colours with data-color and data-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

emailRequired.
name, company, phoneKept when ticked on the Form tab.
messageKept, and required, when Message is ticked.
subjectOptional. Becomes the subject of your alert email.
honeypotSpam 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.
400Valid email required or Message required. Show it to the visitor.
404Form not found: the list's form isn't switched on, or the list ID is wrong.
429Too 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"
  }'
  • email and list_id are required. name, company, phone and source are saved on the contact; any other field is kept as an extra field.
  • tags adds 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: 201 with contact_id for a new contact, 200 with "merged":true for an existing one.
  • Send a User-Agent header 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 phoneTick those fields on the Form tab; unticked fields are ignored.
Your own form does nothingIt must send JSON with JavaScript; a plain HTML form post won't work.
"Captcha required" from the HTML snippetTurn Turnstile off, or use the iframe or button.
No alert for a new sign-upTick Also when a new contact is added. Repeat sign-ups don't alert.
API returns 401 or 404401: copy the key again from API Keys. 404 "List not found": check list_id.
Connect your website forms | Yeevu Contacts