Skip to content

Reaction Buttons

Lightweight inline feedback widgets for quick user sentiment collection.

What are Reaction Buttons?

Reaction buttons are compact, inline widgets that let users provide instant feedback with a single click. Unlike full feedback widgets that open modals, reaction buttons embed directly in your content for frictionless micro-feedback collection.

Was this helpful?  [👍] [👎]

Usage Patterns

When to Use Reaction Buttons vs Feedback Widgets

ScenarioWidget TypeWhy
Article helpfulnessReactionQuick yes/no is sufficient
Feature satisfactionReactionLow-friction sentiment capture
Bug reportsFeedbackNeeds detailed description
Feature requestsFeedbackRequires context and explanation
Support articlesReaction"Did this solve your problem?"
Post-purchaseFeedbackWant detailed experience feedback
In-app tooltipsReactionCompact, non-intrusive
Exit surveysFeedbackGather comprehensive insights

Rule of Thumb

Use reaction buttons when you want quick sentiment data. Use feedback widgets when you need qualitative context.

Template Selection

FeedValue offers four reaction templates optimized for different use cases.

Thumbs (Binary Feedback)

Best for: Yes/no questions, helpfulness ratings, simple approval

html
<script
  src="https://cdn.feedvalue.com/widget.js"
  data-widget-id="YOUR_WIDGET_ID"
  data-type="reaction"
  data-template="thumbs"
  async
></script>

Rendered output:

Was this helpful?  [👍 Yes] [👎 No]

Use when:

  • "Was this article helpful?"
  • "Did this answer your question?"
  • Approval/disapproval signals

Helpful (Yes/No)

Best for: Documentation feedback, support articles, simple confirmation

html
<script
  src="https://cdn.feedvalue.com/widget.js"
  data-widget-id="YOUR_WIDGET_ID"
  async
></script>

Rendered output:

Was this helpful?  [✓ Yes] [✕ No]

Use when:

  • "Did this solve your problem?"
  • Knowledge base articles
  • FAQ sections

Emoji (Sentiment Scale)

Best for: Satisfaction surveys, experience ratings, mood capture

html
<script
  src="https://cdn.feedvalue.com/widget.js"
  data-widget-id="YOUR_WIDGET_ID"
  data-type="reaction"
  data-template="emoji"
  async
></script>

Rendered output:

How was your experience?  [😠] [😞] [😐] [😊] [😍]

Use when:

  • Post-interaction satisfaction
  • Feature experience ratings
  • General sentiment capture
  • NPS-style quick surveys

Rating (Numeric Score)

Best for: Star ratings, numeric scores, quantitative metrics

html
<script
  src="https://cdn.feedvalue.com/widget.js"
  data-widget-id="YOUR_WIDGET_ID"
  data-type="reaction"
  data-template="rating"
  data-max-rating="5"
  async
></script>

Rendered output:

Rate this:  [★] [★] [★] [★] [★]

Use when:

  • Product ratings
  • Content quality scores
  • Service ratings
  • Any 1-5 or 1-10 scale needs

Custom Options

For unique use cases, define custom reaction options through the dashboard when creating a reaction widget. Choose any emoji or text labels for your options.

Custom options use cases:

  • Brand-specific reactions (product-themed icons)
  • Multi-choice questions (not just positive/negative)
  • Gamified feedback (custom badges or characters)
  • Localized options (culturally appropriate icons)

Configuration Best Practices

followUpTrigger Settings

Control when to ask for additional context after a reaction.

ValueBehaviorBest For
"negative"Follow-up only on negative reactionsDefault behavior - understand pain points without over-asking
"all"Always show follow-up promptWhen you want context for all feedback
"none"No follow-up, just the reactionMaximum speed, minimum friction
html
<!-- Default: Follow up on negative reactions only -->
<script
  src="https://cdn.feedvalue.com/widget.js"
  data-widget-id="YOUR_WIDGET_ID"
  data-type="reaction"
  data-follow-up-trigger="negative"
  async
></script>

<!-- Always collect context -->
<script
  src="https://cdn.feedvalue.com/widget.js"
  data-widget-id="YOUR_WIDGET_ID"
  data-type="reaction"
  data-follow-up-trigger="all"
  async
></script>

<!-- Quick reactions only, no follow-up -->
<script
  src="https://cdn.feedvalue.com/widget.js"
  data-widget-id="YOUR_WIDGET_ID"
  data-type="reaction"
  data-follow-up-trigger="none"
  async
></script>

Recommendation

Start with "negative" (default). This captures detailed feedback when users are frustrated without annoying happy users.

showLabels Configuration

Control whether text labels appear alongside icons.

html
<!-- Show labels (default) -->
<script
  data-show-labels="true"
  ...
></script>

Result: [👍 Yes] [👎 No]

html
<!-- Hide labels (icon-only) -->
<script
  data-show-labels="false"
  ...
></script>

Result: [👍] [👎]

When to hide labels:

  • Compact UI spaces (sidebars, tooltips)
  • Icon meaning is universally understood
  • Mobile-first designs with limited width
  • Minimalist design aesthetic

When to show labels:

  • Accessibility is a priority
  • Custom icons that need explanation
  • International audiences (icons may vary in meaning)
  • Enterprise applications

buttonSize Accessibility

Choose the appropriate size for your context and audience.

SizeDimensionsUse Case
sm24pxInline with text, dense UIs, tooltips
md32pxStandard usage, most contexts (default)
lg44pxTouch-friendly, accessibility-focused, standalone
html
<!-- Small - for inline/dense contexts -->
<script data-button-size="sm" ...></script>

<!-- Medium - default, balanced -->
<script data-button-size="md" ...></script>

<!-- Large - touch targets, accessibility -->
<script data-button-size="lg" ...></script>

Accessibility Note

WCAG 2.1 recommends minimum touch targets of 44x44 pixels. Use lg size for:

  • Mobile applications
  • Users with motor impairments
  • Standalone reaction widgets
  • High-visibility feedback collection

Integration Guidelines

React SDK

Use FeedValueProvider with headless mode for full control:

tsx
import { FeedValueProvider, useFeedValue } from '@feedvalue/react';

function App() {
  return (
    <FeedValueProvider
      widgetId="YOUR_WIDGET_ID"
      headless
      config={{ type: 'reaction', template: 'thumbs' }}
    >
      <ArticlePage />
    </FeedValueProvider>
  );
}

function ArticleReactions() {
  const { submit, isReady, isSubmitting } = useFeedValue();
  const [submitted, setSubmitted] = useState<string | null>(null);

  const handleReaction = async (value: 'positive' | 'negative') => {
    await submit({
      reaction: value,
      metadata: { articleId: 'article-123' }
    });
    setSubmitted(value);
  };

  if (submitted) {
    return <p>Thanks for your feedback!</p>;
  }

  return (
    <div className="reaction-buttons">
      <span>Was this helpful?</span>
      <button
        onClick={() => handleReaction('positive')}
        disabled={!isReady || isSubmitting}
      >
        👍 Yes
      </button>
      <button
        onClick={() => handleReaction('negative')}
        disabled={!isReady || isSubmitting}
      >
        👎 No
      </button>
    </div>
  );
}

Headless mode benefits for reactions:

  • Complete styling control
  • Custom animations and transitions
  • Integration with existing component libraries
  • Conditional follow-up logic

Vue SDK

Use the useReaction composable for reaction-specific functionality:

vue
<script setup>
import { ref } from 'vue';
import { useFeedValue } from '@feedvalue/vue';

const { submit, isReady, isSubmitting } = useFeedValue();
const submitted = ref(null);

const handleReaction = async (value) => {
  await submit({
    reaction: value,
    metadata: { articleId: 'article-123' }
  });
  submitted.value = value;
};
</script>

<template>
  <div v-if="submitted" class="thank-you">
    Thanks for your feedback!
  </div>
  <div v-else class="reaction-buttons">
    <span>Was this helpful?</span>
    <button
      @click="handleReaction('positive')"
      :disabled="!isReady || isSubmitting"
    >
      👍 Yes
    </button>
    <button
      @click="handleReaction('negative')"
      :disabled="!isReady || isSubmitting"
    >
      👎 No
    </button>
  </div>
</template>

Vue-specific features:

  • Reactive state management with ref
  • Seamless Nuxt 3 integration
  • Options API support via $feedvalue

WordPress Shortcode

Embed reaction buttons anywhere with the [feedvalue_reaction] shortcode:

[feedvalue_reaction widget="YOUR_WIDGET_ID"]

Available shortcode attributes:

AttributeValuesDefaultDescription
widgetWidget IDrequiredYour reaction widget ID
templatethumbs, helpful, emoji, ratingthumbsReaction style
follow_upnegative, all, nonenegativeWhen to show follow-up
show_labelstrue, falsetrueDisplay text labels
sizesm, md, lgmdButton size
alignleft, center, rightleftHorizontal alignment

Examples:

<!-- Basic thumbs reaction -->
[feedvalue_reaction widget="YOUR_WIDGET_ID"]

<!-- Emoji reactions, centered, no follow-up -->
[feedvalue_reaction widget="YOUR_WIDGET_ID" template="emoji" follow_up="none" align="center"]

<!-- Large accessible thumbs with labels -->
[feedvalue_reaction widget="YOUR_WIDGET_ID" size="lg" show_labels="true"]

<!-- 5-star rating -->
[feedvalue_reaction widget="YOUR_WIDGET_ID" template="rating"]

Placement suggestions:

  • End of blog posts: [feedvalue_reaction widget="..." align="center"]
  • Sidebar widget: Use WordPress widget area
  • After WooCommerce purchase: Hook into woocommerce_thankyou
  • Knowledge base articles: End of content

Testing Recommendations

Test All Template Types

Before deployment, verify each template renders correctly:

Create test widgets for each template via the dashboard:

  • Thumbs template
  • Helpful template
  • Emoji template
  • Rating template
  • Custom options

Checklist:

  • [ ] All options render and are clickable
  • [ ] Selected state is visually distinct
  • [ ] Disabled state during submission
  • [ ] Success state after submission

Verify followUpTrigger Behavior

Test each trigger setting systematically:

SettingTest ActionExpected Result
negativeClick positive reactionNo follow-up appears
negativeClick negative reactionFollow-up prompt appears
allClick any reactionFollow-up prompt appears
noneClick any reactionSuccess message, no follow-up

Cross-Browser Emoji Rendering

Emojis render differently across platforms. Test on:

PlatformBrowserKnown Issues
WindowsChrome, Firefox, EdgeEmoji style varies by Windows version
macOSSafari, ChromeConsistent Apple emoji
iOSSafari, ChromeConsistent Apple emoji
AndroidChromeVaries by device manufacturer
LinuxFirefoxMay show text-style emoji

Emoji Compatibility

Some older systems may not support newer Unicode emoji. For maximum compatibility:

  • Use well-established emoji (thumbs, basic faces)
  • Avoid skin tone modifiers
  • Test on target audience's common devices
  • Consider fallback text labels

Testing script:

javascript
// Add to browser console to test emoji support
const testEmoji = ['👍', '👎', '😠', '😞', '😐', '😊', '😍', '⭐'];
testEmoji.forEach(e => {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  ctx.fillText(e, 0, 0);
  console.log(`${e}: ${ctx.getImageData(0, 0, 1, 1).data[3] > 0 ? 'supported' : 'NOT supported'}`);
});

Accessibility Testing

Ensure reaction buttons are accessible:

  • [ ] Keyboard navigation: Tab to focus, Enter/Space to activate
  • [ ] Screen reader: Labels announce correctly
  • [ ] Color contrast: Meets WCAG AA (4.5:1 for text, 3:1 for UI)
  • [ ] Touch targets: lg size meets 44px minimum
  • [ ] Focus indicators: Visible focus ring on buttons
html
<!-- Accessible reaction implementation -->
<div role="group" aria-label="Rate this article">
  <button
    aria-label="Helpful"
    aria-pressed="false"
    data-reaction="positive"
  >
    👍 Yes
  </button>
  <button
    aria-label="Not helpful"
    aria-pressed="false"
    data-reaction="negative"
  >
    👎 No
  </button>
</div>

Analytics and Insights

Reaction data appears in your FeedValue dashboard:

  • Reaction distribution: Pie chart of positive/negative/neutral
  • Trends over time: Line graph of reactions by day/week
  • Page-level breakdown: Which content gets most reactions
  • Follow-up rate: How often users provide additional context

Pro Tip

Combine reaction data with page metadata to identify:

  • Most helpful documentation pages
  • Features with lowest satisfaction
  • Content that needs improvement

Built with care by SarverEnterprises