One line of code.
The feedback that never reached you.
Paste a script before your closing body tag and your site gets a feedback button. Rating, comment and the exact page the person was on, straight to your ecoa dashboard.
No dependency, no build step, no cookie. 28 KB, or 10 KB gzipped.
Silence is not praise.
Someone lands, tries to use it, gets stuck at checkout and closes the tab. Nobody opens an issue on your GitHub to tell you the button didn't respond. You only see the hole in the funnel weeks later, with no idea which screen it started on.
Nobody fills in a form on a separate page. Support email only hears from people already angry enough to write. The feedback you need most is from the person who shrugged and left.
Ask where the doubt happens
Three steps. The third one is opening the dashboard.
Paste the script
Before your closing body tag. Plain JavaScript, zero dependencies and Shadow DOM: it leaks no CSS into your site and reads none of yours.
The visitor rates it
One to five stars, required. Comment and email optional. Submit stays disabled until a rating is picked.
You read it in the dashboard
Average, filter by label and the source URL of every answer. An in-app notification on each new one.
<script src="https://ecoa.dev/widget/ecoa-widget.js"
data-ecoa-key="ecoa_pk_xxxxxxxx"
data-ecoa-label="Checkout" async></script>The label splits feedback by flow. Checkout, onboarding and search, each with its own average.
Exactly what it collects
No asterisk. This is the whole list.
- A rating from 1 to 5
- Comment and email, both optional
- The label of the flow the person was in
- URL and title of the source page
- A user id of yours, if you pass one
And what it does not do:
- No cookie, no localStorage, no fingerprinting
- No screenshots, no console reading, no session recording
- No third-party tracker loaded
Three ways to ask
From passive to the exact moment someone finished something.
Floating button
The default. It sits in a corner and the visitor clicks whenever they want.
End of a flow
No button at all: you open the widget from code when the purchase closes, the upload finishes, the onboarding ends.
Nudge
The button reveals its own label for a few seconds, with a soft pulse, then folds back. A push without a modal in anyone's face.
Pass a stable user id and the widget never asks the same person twice in the same flow, while still being able to ask them in another one.
The box shows up in Portuguese, English or Spanish, following your site's language. Or you pin one.
Or ask your AI to install it
With ecoa connected to your agent, a plain-language request does it: it fetches your key, builds the snippet and pastes it in the right place. Then it reads the answers by label without you opening the dashboard.
Questions
Will it break my site's CSS?+
No. Everything runs inside an isolated Shadow DOM: the widget cannot see your CSS and your CSS cannot see the widget.
Does the person answering need an account?+
No. They are a visitor to your site and need nothing on ecoa. The email field is optional.
Does it work with React, Next, Vue, Astro, WordPress?+
It works with anything that serves HTML. It is a script tag, not an npm package. No build step and no framework version to match.
Is there spam protection?+
There is an invisible honeypot field, and that is all. No CAPTCHA, no per-IP rate limit, no domain allowlist. If your case needs that today, the widget is not there yet.
Is widget feedback the same as the community's ecos?+
No. The widget is yours and independent: it spends no points, goes through no moderation, and lives in its own tab of the app dashboard.
Can I see how many people saw the button and didn't answer?+
No. The widget records submissions, not impressions, so there is no response rate in the dashboard. It counts what arrived, not what walked past.
Your site may be telling you something right now
Create the account, grab the key, paste the line. It is less work than reading this page.
Create a free account