Troubleshooting
The widget does not appear
Check these in order:
- The script tag is present and sits just before the closing
</body>tag, with your key indata-api-key. window.FeedbackFlowConfigis set beforewidget.min.jsloads. If you set it after, the widget reads an empty config.apiKeyis filled in with a real project key, not theYOUR_API_KEYplaceholder.- No ad blocker or content blocker is hiding the launcher. Test in a private window with extensions disabled.
Invalid API key
If submissions fail with an authentication error, the key is wrong or has been rotated. Open your project page, regenerate the key, and update the apiKey value on your site. Regenerating replaces the old key immediately, so any site still using the old value stops submitting.
Content Security Policy errors
If your site sends a Content-Security-Policy header, allow FeedbackFlow in the following directives:
script-srcmust allowhttps://usefeedbackflow.comsowidget.min.jscan load.connect-srcmust allowhttps://usefeedbackflow.comso the widget can submit feedback, and your FeedbackFlow storage origin (https://YOUR_PROJECT.supabase.co) so attachments can upload. Attachments upload directly to storage, so a policy that lists onlyusefeedbackflow.comwill block them.img-srcmust allowblob:so attachment thumbnails preview in the panel before sending.
A blocked resource shows up in the browser console as a CSP violation naming the directive to fix.
Feedback from an integration is not arriving
For inbound integrations (Slack, Intercom, Zendesk), check the source side:
- The webhook Request URL matches the one shown on the integration setup screen, including your project ID.
- The signing secret entered in FeedbackFlow matches the one from the provider.
- The provider is actually sending events: Slack needs the bot invited to the channel and the
message.channelsevent subscribed, Intercom needs theconversation.user.createdtopic, and Zendesk needs a trigger that runs the webhook when a ticket is created.
See the integration guides for the exact steps per provider.
The panel does not auto-open
Check these in order:
- The pattern is a path, not a URL. Use
/pricing, nothttps://example.com/pricing. Query strings and hashes are ignored when matching. - It already fired this session. Auto-open runs at most once per browser session, and opening or dismissing the panel yourself also suppresses it. To test repeatedly, run
sessionStorage.removeItem('_ff_autoopened')in the console and reload. - The delay has not elapsed. The default is three seconds after the page is ready.
- The pattern does not match.
*stops at a/, so/app/*does not match/app/a/b. Use/app/**for that.
An attachment will not upload
The panel shows "Could not upload files" or "Some files could not be uploaded" when a file is rejected. Check, in order:
- Type and size. Only PNG, JPEG, GIF, WebP, and PDF are accepted, at up to 5 MB each and 3 files per submission.
- Content Security Policy. If your site sends a CSP,
connect-srcmust allow your storage origin as well ashttps://usefeedbackflow.com. A blocked upload appears in the browser console as a CSP violation naming the storage host. This is the most common cause. - The feedback still sent. A failed upload never blocks the message itself, so check your dashboard: the feedback is there, just without the file.