Appearance
Moderated content feed
On Pro plan and higher, a form can expose a public, moderated feed of its approved submissions - testimonials, guestbook entries, community posts - complete with anonymous reactions and a report control. There's no submitter account system; anyone can react or report, once per visitor per submission.
Setting it up
From your form's Workflow tab, under Moderated content feed:
- Enable submission moderation - turns on the Approve/Reject/Undecided control inside each submission (see Managing submissions) and the Pending review folder. A submission only ever appears in the public feed once it's been explicitly approved - moderation must be turned on for you to have any way to do that.
- Public fields - which of a submission's fields are safe to show publicly. Everything not listed here stays private even though it's stored - the feed omits unlisted fields entirely, not just blanks them.
- Report threshold - a submission auto-hides from the feed (pending re-review) once it collects this many reports. Leave blank to disable.
Every submission needs manual approval. There's currently no way to skip review - a submission only reaches
approved(and shows up in the feed) once you explicitly approve it from inside the submission itself. If you want a feed that publishes without a human in the loop, that's not available yet.
Embedding the feed
Option 1: the hosted widget. Copy the snippet from the same Workflow-tab section and paste it anywhere on your page:
html
<script src="https://bootform.com/widget/v1/bootform-widget.js" data-form-id="your-form-id" async></script>It renders itself in place of the tag: a list of approved submissions (public fields only), thumbs up/down reaction buttons with live counts, and a report control - framework-free, no dependencies, plain (not shadow-DOM-isolated) CSS. Embed it more than once on the same page for multiple feeds.
| Attribute | Default | Description |
|---|---|---|
data-form-id | (required) | Your form's ID or vanity slug |
data-api-base | https://f.bootform.com | Override the API host - only needed for local/staging testing |
data-per-page | 20 | Items loaded per page/"Load more" click |
Customizing the widget's look
The widget renders directly into the page (no shadow DOM), so your own CSS overrides it - it just needs to load after the widget's script and use a class with equal or higher specificity. Every element carries one of these classes:
| Class | Element |
|---|---|
.bf-feed | The root container |
.bf-feed__status | Loading/empty-state text |
.bf-feed__error | Error banner |
.bf-feed__list | The <ul> of submissions |
.bf-feed__item | One submission's card |
.bf-feed__fields | A submission's field list (<dl>) |
.bf-feed__meta | The row under a submission's fields (timestamp + actions) |
.bf-feed__actions | Reaction/report button group |
.bf-feed__reaction | A single reaction button |
.bf-feed__reaction--active | A reaction button the current visitor has already picked |
.bf-feed__report | The report button |
.bf-feed__load-more | The "Load more" button |
For example, to match your own brand color instead of the default blue and square off the cards:
css
.bf-feed__item {
border-radius: 0;
}
.bf-feed__reaction--active {
border-color: #16a34a;
color: #16a34a;
}Option 2: the raw API, for a fully custom UI - the same public, unauthenticated endpoints the widget itself uses:
GET https://f.bootform.com/forms/{form_id}/feed?page=1&per_page=50
POST https://f.bootform.com/forms/{form_id}/feed/{submission_id}/react { "type": "up" }
POST https://f.bootform.com/forms/{form_id}/feed/{submission_id}/reportFull schema: openapi.json / openapi.yaml.