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 in data-api-key.
  • window.FeedbackFlowConfig is set before widget.min.js loads. If you set it after, the widget reads an empty config.
  • apiKey is filled in with a real project key, not the YOUR_API_KEY placeholder.
  • 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-src must allow https://usefeedbackflow.com so widget.min.js can load.
  • connect-src must allow https://usefeedbackflow.com so 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 only usefeedbackflow.com will block them.
  • img-src must allow blob: 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.channels event subscribed, Intercom needs the conversation.user.created topic, 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:

  1. The pattern is a path, not a URL. Use /pricing, not https://example.com/pricing. Query strings and hashes are ignored when matching.
  2. 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.
  3. The delay has not elapsed. The default is three seconds after the page is ready.
  4. 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:

  1. Type and size. Only PNG, JPEG, GIF, WebP, and PDF are accepted, at up to 5 MB each and 3 files per submission.
  2. Content Security Policy. If your site sends a CSP, connect-src must allow your storage origin as well as https://usefeedbackflow.com. A blocked upload appears in the browser console as a CSP violation naming the storage host. This is the most common cause.
  3. The feedback still sent. A failed upload never blocks the message itself, so check your dashboard: the feedback is there, just without the file.