Skip to content

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.

AttributeDefaultDescription
data-form-id(required)Your form's ID or vanity slug
data-api-basehttps://f.bootform.comOverride the API host - only needed for local/staging testing
data-per-page20Items 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:

ClassElement
.bf-feedThe root container
.bf-feed__statusLoading/empty-state text
.bf-feed__errorError banner
.bf-feed__listThe <ul> of submissions
.bf-feed__itemOne submission's card
.bf-feed__fieldsA submission's field list (<dl>)
.bf-feed__metaThe row under a submission's fields (timestamp + actions)
.bf-feed__actionsReaction/report button group
.bf-feed__reactionA single reaction button
.bf-feed__reaction--activeA reaction button the current visitor has already picked
.bf-feed__reportThe report button
.bf-feed__load-moreThe "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}/report

Full schema: openapi.json / openapi.yaml.