Skip to content

Vanilla JS

The formtress-js npm package gives you full control over form submissions in any JavaScript project — React, Svelte, Vue, plain HTML, or anything else.

Install the Formtress package:

npm install formtress-js

Set the form action so it works without JavaScript:

<form id="my-form" action="https://app.formtress.com/api/f/your-form-id" method="POST">
<!-- your fields -->
</form>

Then progressively enhance it:

import { submitForm } from 'formtress-js'
const form = document.querySelector('#my-form')
form.addEventListener('submit', async (e) => {
e.preventDefault()
const result = await submitForm({
url: form.action,
data: new FormData(form),
})
if (result.ok) {
// Show your own success UI
} else {
// Show error state: result.message, result.status
}
})
ParameterTypeRequiredDescription
urlstringYesThe form’s action URL (your Formtress submit endpoint).
dataFormDataYesThe form data to submit.

Returns: Promise<{ ok: boolean; message?: string; status?: number }>

FieldTypeDescription
okbooleantrue if the submission was accepted.
messagestringError message from the server (only present when ok is false).
statusnumberHTTP status code from the server.
import { submitForm } from 'formtress-js'
const form = document.querySelector('#contact-form')
const submitBtn = form.querySelector('button[type="submit"]')
const errorEl = form.querySelector('.error-message')
form.addEventListener('submit', async (e) => {
e.preventDefault()
submitBtn.disabled = true
submitBtn.textContent = 'Sending...'
errorEl.textContent = ''
try {
const result = await submitForm({
url: form.action,
data: new FormData(form),
})
if (result.ok) {
form.reset()
submitBtn.textContent = 'Sent!'
} else {
errorEl.textContent = result.message
submitBtn.textContent = 'Submit'
}
} catch (err) {
errorEl.textContent = 'Network error. Please try again.'
submitBtn.textContent = 'Submit'
} finally {
submitBtn.disabled = false
}
})

Since submitForm is just a JavaScript function, you can use it in any framework.

import { useState } from 'react'
import { submitForm } from 'formtress-js'
export function ContactForm() {
const [status, setStatus] = useState(null)
async function handleSubmit(e) {
e.preventDefault()
const result = await submitForm({
url: 'https://app.formtress.com/api/f/your-form-id',
data: new FormData(e.target),
})
setStatus(result.ok ? 'success' : result.message)
}
return (
<form onSubmit={handleSubmit}>
<input name="name" />
<input name="email" />
<button type="submit">Send</button>
{status && <p>{status}</p>}
</form>
)
}

If you don’t use a bundler, you can load the module via CDN:

<script type="module">
import { submitForm } from 'https://cdn.jsdelivr.net/npm/formtress-js@0.2.1/dist/js/core.js'
// Use submitForm as shown above
</script>