Customization

One customize object controls the form copy, the trigger button and the notification bubbles. Every field is optional and falls back to a sensible default.

Customized widget
<FeedbackWidget
  customize={{
    form: {
      messageInput: { placeholder: "What went wrong?" },
      submitButton: { label: "Send report" },
      cancelButton: { label: "Never mind" },
      successMessage: "Thanks — we're on it.",
      errorMessage: "That didn't send. Try again?",
    },
    triggerButton: {
      mode: "icon",
      placement: "right-bottom",
      label: "Report a bug",
    },
    notifications: {
      enable: true,
      repeatDelay: 30,
      messages: [
        { message: "Spotted a bug?", type: "hint" },
      ],
    },
  }}
/>

Cloud mode owns this object

When a widget is explicitly typed with mode="cloud", passing customize is a compile-time error — the dashboard is the source of truth so the two configurations cannot drift apart. Edit these values in your project settings instead. See Modes.

Form

Everything under customize.form controls the panel the user types into.

PropTypeDefaultDescription
form.messageInput.placeholderstring"Leave your Feedback!"Placeholder text in the message textarea.
form.messageInput.classNamestringExtra classes on the textarea.
form.submitButton.labelstring"Send Feedback"Submit button text.
form.submitButton.classNamestringExtra classes on the submit button.
form.cancelButton.labelstring"Cancel"Cancel button text.
form.cancelButton.classNamestringExtra classes on the cancel button.
form.successMessagestring"Message Submitted"Shown when submission resolves successfully.
form.errorMessagestring"Failed to submit message"Shown when submission fails.
form.classNamestringExtra classes on the form container.

Screenshot output

Both captures are on by default. Excluding one reduces payload size and shortens the pause between selecting an element and the form opening.

PropTypeDefaultDescription
form.output.excludeFullPageScreenshotbooleanfalseSkip the whole-page capture.
form.output.excludeSelectedElementScreenshotbooleanfalseSkip the capture scoped to the selected element.

Trigger button

The floating button that puts the page into selection mode. Set hideTriggerButton on the widget itself if you would rather supply your own.

PropTypeDefaultDescription
triggerButton.mode"default" | "icon""default""default" shows a labelled switch; "icon" collapses it to an icon only.
triggerButton.placement"left-center" | "left-bottom" | "right-center" | "right-bottom" | "bottom-left" | "bottom-right""left-center"Which edge of the viewport the button anchors to.
triggerButton.labelstring"Feedback Mode"Button text in "default" mode.
triggerButton.classNamestringExtra classes on the button.
triggerButton.switchButton.classNamestringExtra classes on the switch track.
triggerButton.switchButton.thumb.classNamestringExtra classes on the switch thumb.

Notifications

Small bubbles that surface near the trigger to remind users the widget exists. They cycle through your message list on an interval.

Notification config
notifications: {
  enable: true,
  repeatDelay: 15,          // seconds between bubbles
  displayDuration: 5,       // seconds each bubble stays up
  allowDismissal: true,
  allowParmanentDismissal: true,
  paramanentDismissalExpiryDays: 7,
  messages: [
    { message: "Spotted a bug?", type: "hint" },
    { message: "Feedback earns credit", type: "reward" },
  ],
}
PropTypeDefaultDescription
notifications.enablebooleantrueTurns the bubble system on or off entirely.
notifications.messagesNotificationMessage[]The rotation. Each entry is a message and a type; keep messages short, since the bubble is sized for roughly 22 characters.
notifications.repeatDelaynumber15Seconds between one bubble disappearing and the next.
notifications.displayDurationnumber5Seconds each bubble stays on screen.
notifications.repeatAllowedbooleanWhether the rotation loops once every message has been shown.
notifications.allowDismissalbooleantrueLets the user close the current bubble.
notifications.allowParmanentDismissalbooleanfalseOffers a don't-show-again action that suppresses bubbles across sessions.
notifications.paramanentDismissalExpiryDaysnumber7How long a permanent dismissal lasts before bubbles resume.

Message types

type selects the bubble's icon and accent. Available values are info, hint, offer, reward, social and urgent.

Notifications are opt-out, not opt-in

They are enabled by default with a stock message rotation. If the pattern is not right for your product, turn them off explicitly:

Disable notifications
<FeedbackWidget customize={{ notifications: { enable: false } }} />

How cloud config merges

When a widget runs in cloud mode without an explicit mode prop, any local customize object is deep-merged with the configuration fetched from your dashboard. The merge is per-leaf, not per-object, so a single dashboard field never blanks out unrelated local settings.

Merge behaviour
// Cloud mode deep-merges your local customize object with the
// dashboard config. Setting form.errorMessage on the dashboard does
// not wipe out a locally configured form.submitButton.label.