Client feedback, left on the page, closed by your agent.
No meeting, no email chain, no ticket. Turn on the on-page toolbar and your client annotates the deliverable itself, no account needed. The comments come back structured and anchored to the exact element, your agent ships the fix to the same URL, and each one gets marked resolved.
How do you collect client feedback on an agent-built page?
Enable the on-page feedback toolbar when you publish (free, off by default) and send the private link. The client clicks the element they mean and leaves a comment right there, without creating an account. Comments land in your dashboard and in your agent's list_feedback tool with the element, selected text, intent, and severity attached; the agent fixes the HTML in place at the same URL and marks each item resolved.
The loop, end to end
Most review cycles die in the gap between "client saw it" and "agent knows what to change". This closes the gap.
1. The client leaves a comment
Turn the toolbar on. Pass agentation: true when the agent publishes, call the set_agentation tool later, or flip "On-page Agentation" in the site's settings. Off by default, free on every plan.
The client opens the link. The same private URL you already sent; the toolbar loads with the page, whether it is a token link, a slug subdomain, or your custom domain. No account, no install.
They click the thing that is wrong. The comment attaches to that element and records what they selected, the text around it, an intent (fix, change, question, approve) and a severity. They can edit or delete their own note if they change their mind.
2. Your agent picks it up
The comments reach you and your agent. The site's Feedback panel in the dashboard shows open items with resolve and remove buttons. Your agent reads the same list over MCP with list_feedback, unresolved items first.
› list_feedback q3-report
✓ 2 open
fb_7g4 fix · high “This total is missing the May invoice” on “£48,200”
fb_2mc question “Is this net of the retainer?” on “Total billed”
› get_site q3-report → edit → update_site q3-report
✓ replaced in place (same URL)
› resolve_feedback fb_7g4 --note "total now includes the May invoice"
✓ resolved · the client just reloads the link they already have
›
3. Fixed, same URL
The agent ships the fix to the same URL. get_site returns the exact stored HTML, not a rendered approximation. The agent edits it and calls update_site, which replaces the page in place. The link in the client's inbox does not change.
Mark it resolved. resolve_feedback takes the item id and an optional note saying what changed; the note shows under the resolved item in the dashboard. Re-review for the client is just reloading the page.
That is the whole cycle: no screenshots, no ticket triage, no "see my comments in the attached PDF". The feedback arrives in the same structured channel the agent already publishes through.
What an annotation carries
A comment on its own ("the number looks wrong") forces someone to figure out which number, on which version, in which part of the page. So each annotation records the context alongside the comment: the element the reviewer clicked, a path to it in the document, any text they selected, the text nearby, the page URL, plus the reviewer's declared intent (fix, change, question, approve) and a severity.
That structure is what makes the loop closable by software. Your agent already holds the source of the page; get_site hands back the exact stored HTML, and the anchor tells it where to look. "Fix, high severity, on the string £48,200" is an instruction an agent can act on directly. A screenshot with a red circle is not.
Comments run up to 2,000 characters, and a reviewer can revise or withdraw a note after leaving it, so the feedback you act on is what they meant, not their first draft.
Why this beats screenshots in Slack and PDF markups
The usual review channels all detach the feedback from the artifact:
- Screenshots in Slack freeze a moment and drop the anchor. You reverse-engineer which element and which revision they meant, and the thread lives somewhere your agent cannot read.
- PDF markups flatten an interactive page into paper. Feedback about a hover state, a filter, or a chart tooltip has nowhere to land, because the PDF does not have them.
- Email serialises the whole cycle: comments arrive as prose, fixes go out as "v2-final-FINAL" attachments, and every round trip re-sends the deliverable.
Anchored comments on the live page fix all three at once. The feedback points at the real element in the real deliverable, it arrives structured enough for an agent to act on, and because update_site replaces the page in place, the fixed version is at the URL the client already has. The re-review step, usually a whole email of its own, becomes a reload.
Two honest concessions. If the conversation is about direction rather than defects ("should this be a dashboard at all?"), a call still beats any comment box. And if your deliverable is a design file and your client already lives in Figma, Figma's own comments are the right tool; this loop is for when the deliverable is a live HTML page.
The lighter sibling: reactions and notes
Not every page needs a review cycle. There is a separate, lighter layer for "how did this land": an on-page reaction bar viewers can tap (🔥 ❤️ 👍 🎉 👀) plus a short private note to you, up to 140 characters. Reactions toggle like they do in FigJam, notes are visible only to the owner, and both show up in the site's dashboard next to the open count. Use reactions for a report you want a pulse on, and the full annotation loop for a deliverable that will go through revisions. Both feed the same place as opens and read-depth; see how your pages get read.
Guardrails on a public comment box
A no-login comment box on a shareable link needs guardrails, and this one has them:
- Opt-in per site. Only pages where you enabled the toolbar accept feedback at all. Everything else ignores it.
- Rate limits. 40 annotations per IP per day across all sites. A reviewer leaving more than that is not reviewing.
- Poster-scoped edits. Editing or deleting a note only works from the connection that posted it, so a drive-by visitor with the link cannot rewrite or erase your client's comments.
- Owner controls. You can remove any item as spam or noise, and resolving is owner-only (you or an agent authenticated as you).
- Retry-safe. The toolbar re-sends unsynced annotations when a flaky connection recovers, and the server deduplicates, so a retry never becomes a duplicate comment.
- Expiry is honoured. A page past its expiry stops accepting feedback along with everything else.
Honest scope
What this is not, so you can pick the right tool:
- It annotates pages you host on Stacktree with the toolbar enabled. It is not a browser extension for commenting on arbitrary websites.
- It is a channel from reviewers to the maker, not a discussion between reviewers. Each viewer sees their own notes; the collected set goes to you and your agent. Resolution status shows in your dashboard, not back on the client's screen; what the client sees is the fix itself.
- Feedback comments cap at 2,000 characters and reaction notes at 140. Long-form commentary belongs in a document, not a margin.
- The toolbar is JavaScript injected at serve time, so it cannot be combined with end-to-end encrypted pages, where the decryption bootstrap rewrites the document.
Turning it on
Three ways, all free on every plan. When the agent publishes, it passes agentation: true to publish_html. On an existing site, it calls set_agentation, or you flip "On-page Agentation" in the site's settings in the dashboard. From then on, every viewer of the link can annotate, and the loop above is live. When the review cycle is over, turn it off the same way and the page goes back to being a clean deliverable.
If your agent is not connected yet, npx stacktree-install sets up the MCP server for Claude Code, Codex, Cursor, and friends; Claude.ai connects with one-click OAuth. The full tool surface, feedback verbs included, is on the MCP page.
Frequent questions
How do I collect feedback on an HTML page? +
list_feedback tool.How do clients comment on a web page deliverable? +
Can clients leave feedback on a prototype without creating an account? +
Can an AI agent respond to review comments? +
list_feedback and gets each comment with its element anchor, selected text, intent, and severity, unresolved items first. It fetches the exact stored HTML with get_site, edits, ships the fix with update_site to the same URL, then calls resolve_feedback with a note describing what changed. Claude Code, Claude.ai, Codex, Cursor, or any MCP client can run it.Is the feedback toolbar free? +
agentation: true when publishing, call the set_agentation MCP tool, or flip "On-page Agentation" in the site's settings. It is off by default because a polished final deliverable and a page under review are different modes.Do reviewers see each other's comments? +
What stops a leaked link filling the page with spam? +
Related guides
- Share an HTML file with a client Getting the deliverable to them in the first place: private link, gates, no login.
- MCP server for publishing HTML All twelve tool calls, including list_feedback and resolve_feedback.
- See how your pages get read Opens, reactions, notes, and Pro engagement analytics on what you share.
- Share deliverables with clients The wider client-handoff story: prototypes, reports, dashboards.
- Custom domains Run the same review loop on a page served from your own domain.
Sources and further reading
Ship the next revision without the meeting.
Publish, turn on the toolbar, send one link. Feedback comes back structured; your agent closes it. Free to start, no card.
Sign up free →