Apps
Managed Forms
Turn any existing HTML form into a stored, emailed and webhook-delivered submission with a single attribute — no backend code.
What it does
Add data-buckhy-form="contact" to a <form>. The Engage SDK intercepts the submit, posts the fields to Buckhy, and writes a success or error message into your page. Each submission is stored as a ticket (ENG-F-…) and appears in the website's Inbox > Leads. Notification email and configured webhook delivery are separate outcomes.
Your markup and styling stay exactly as they are. Managed Forms is delivered by the Engage SDK with a publishable key.
Features
| Feature | Detail |
|---|---|
| One attribute | data-buckhy-form="<name>" on the form; keep your fields. |
| No double posts | In-flight submits are blocked; unchanged retries reuse the idempotency key. |
| SPA navigation | Forms mounted later, including cloned forms, are enhanced without adding another SDK script. |
| Browser controls | Native form validity is checked. Disabled, unchecked and file controls are omitted; repeated selections are joined. |
| Honeypots dropped | Fields named website, url or homepage are removed before storing. |
| Success and error text | data-buckhy-success overrides the configured portal success message; data-buckhy-status marks where it appears. |
| DOM events | buckhy:submitted and buckhy:error for your own UI. |
| Contact mapping | name, email, phone, subject, message/notes fields become the ticket's contact and subject. |
| Fan-out | Email to the notify address, form.submitted webhook, console inbox. |
| Limits | 24 fields × 2,000 characters per submission. |
How it works
- The SDK enhances
form[data-buckhy-form]at startup and watches added DOM nodes and form attributes for SPA navigation. - On submit it checks validity and collects successful string controls, then posts
POST /v1/engage/forms/:formwith anIdempotency-Key. Buckhy sanitizes fields and drops honeypots server-side. - Buckhy enforces the bound website/environment form policy, stores a ticket with source
form, and queues notifications. The response includessuccess,idand the configuredsuccessMessagewhen a form policy applies. A 201 does not prove email or webhook delivery; inspect delivery status. - The SDK writes the success text (or the error message) into the
data-buckhy-statuselement and dispatches the matching DOM event.
Get started
- Open Businesses, add or select your website, and verify domain ownership. Choose Test for local development or Live for your production website.
- Open Apps > Managed Forms > Configure. Set the app's fields and exact allowed origins. HTTP localhost origins belong only in Test.
- In Integrate, create or reuse the environment's Engage credential. Keep one SDK loader when another Engage app is already installed:
<script src="https://api.buckhy.com/v1/engage/sdk.js" defer
data-site-key="bk_live_…"></script>
Complete the Forms interaction below, then open Test, run the checks and continue to Activate. Creating a credential or copying this snippet does not complete activation. 4. Mark up a form:
<form data-buckhy-form="contact"
data-buckhy-success="Thanks — we reply within one business day.">
<input name="name" required />
<input name="email" type="email" required />
<textarea name="message" required></textarea>
<!-- Honeypot: hidden from people, dropped by Buckhy -->
<input name="website" tabindex="-1" autocomplete="off"
style="position:absolute;left:-9999px" />
<button type="submit">Send</button>
<p data-buckhy-status role="status"></p>
</form>
- Submit it and inspect Businesses > your website > Inbox > Leads. Check notification delivery separately, then complete Test > Run checks > Activate.
Framework install and a copy-paste AI-agent prompt that converts your forms: Install the Engage SDK.
Configure
| Setting | Effect |
|---|---|
| Forms module | Turns managed forms on or off. Off returns 403 MODULE_DISABLED. |
| Notify email | Receives every submission. |
| Required fields | Up to 20; start with a letter and use up to 40 letters, numbers, spaces, underscores or hyphens. Names must be unique after ignoring case and separators. Reserved names and honeypots cannot be required. |
| Accept only the configured form ID | New guided form apps enable this. Other form IDs return 400. Imported legacy apps keep their existing multiple-form behavior unless you opt in. |
| Disable form / app | A disabled form rejects its submissions; disabling or removing the owning integration rejects submissions for that integration. Existing stored data is retained. |
| Webhook | Endpoint + secret; each submission is delivered as form.submitted. |
data-buckhy-form="<name>" |
The form label (≤ 40 characters). Filters the inbox; becomes the ticket's category. |
data-buckhy-success="…" |
Text shown after a successful submit. |
data-buckhy-status |
Any element inside the form; success and error text is written here. |
Guides
Convert an existing form
Add the attribute, keep every field, add an off-screen honeypot named website, add an empty status element, and remove any existing submit handler that would post a second time. Nothing else changes.
React to the result
form.addEventListener("buckhy:submitted", (e) => {
console.log("stored as", e.detail.id); // "ENG-F-…"
form.reset();
});
form.addEventListener("buckhy:error", (e) => {
console.error(e.detail.message); // e.g. "fields are required"
});
Post from your own code
Without the SDK — from a mobile app or a backend — call the endpoint directly:
await fetch("https://api.buckhy.com/v1/engage/forms/contact", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": SITE_KEY,
"Idempotency-Key": crypto.randomUUID(), // once per submission, reused on retry
},
body: JSON.stringify({ page: "/contact", fields: { name, email, message } }),
});
Requests without an Origin header (servers, native apps) are accepted; browser requests must come from an allowed origin.
How fields become a ticket
| Field | Used as |
|---|---|
name email phone |
The ticket's contact |
subject |
The ticket subject; otherwise "<form> submission" |
message or notes |
The first message on the ticket |
| everything else | Kept in fields, shown in the inbox and delivered in the webhook |
Reference
| Topic | Page |
|---|---|
POST /forms/:form — body, limits, responses |
Engage API |
form.submitted payload, signature, retries |
Webhooks |
| Field and rate limits | Limits |
