A small signal, captured well
Put a listening post on your website.
Give customers a simple way to tell you what is getting in their way. Their feedback lands in Brimknot alongside the signals you already review.
Live preview
Try the form here
CORS-ready
This preview uses the same anonymous intake as the copied form below.
Install in minutes
Copy the snippet
Copy this snippet, paste it into your website HTML, and keep the form and script together.
<form data-brimknot-feedback>
<label for="brimknot-feedback-body">Share your feedback</label>
<textarea id="brimknot-feedback-body" name="body" maxlength="5000" required></textarea>
<button type="submit">Send feedback</button>
<p data-brimknot-feedback-status role="status" aria-live="polite"></p>
</form>
<script>
(() => {
const form = document.querySelector('[data-brimknot-feedback]');
const body = form?.querySelector('[name="body"]');
const status = form?.querySelector('[data-brimknot-feedback-status]');
const endpoint = "https://brimknot.com/api/feedback/embed";
if (!(form instanceof HTMLFormElement) || !(body instanceof HTMLTextAreaElement) || !(status instanceof HTMLElement)) return;
form.addEventListener('submit', async (event) => {
event.preventDefault();
const button = form.querySelector('button[type="submit"]');
if (button instanceof HTMLButtonElement) button.disabled = true;
status.textContent = 'Sending…';
try {
const response = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ body: body.value }),
});
if (!response.ok) throw new Error('Feedback request failed');
form.reset();
status.textContent = 'Thanks — your feedback was sent.';
} catch {
status.textContent = 'Could not send feedback. Please try again.';
} finally {
if (button instanceof HTMLButtonElement) button.disabled = false;
}
});
})();
</script>- 01
Copy the full block.
- 02
Paste it into your site HTML.
- 03
Keep listening for the pattern.
The form works on a separate domain with no login required.