🚀  UPDATE: Our Feedback Widget now integrates with Intercom Messenger. Learn More

Getting started

Installing Ybug on your site

Ybug's code is asynchronous and is designed not to slow down your site.

When you create a project in Ybug, you'll be sent an email with code snippet to add to your website. Alternatively you can get your code snippet in your dashboard. Simply copy this code and paste it into your website just above the closing </body> tag.

Your code should look something like this:

<!-- Ybug code start (https://ybug.io) -->
<script type='text/javascript'>
(function() {
    window.ybug_settings = {"id":"XXXXXXXXX"};
    var ybug = document.createElement('script'); ybug.type = 'text/javascript'; ybug.async = true;
    ybug.src = 'https://widget.ybug.io/button/'+window.ybug_settings.id+'.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ybug, s);
})();
</script>
<!-- Ybug code end -->

Just replace XXXXXXXXX with your project id.

  If you're using a JavaScript framework, you can install our Vue, React or Angular npm packages to easily integrate Ybug in your projects.

  Looking for instructions for most common web platforms? WordPress, Shopify, Webflow, Bubble .

Browser extensions

If you need pixel perfect screenshots or if you would like to get feedback and bug reports from your testers and team members, our browser extensions are perfect for this use case.

Passing user information

You might want to pass user information to Ybug. It may then help you identify the user who sent feedback. You can pass basically any additional user information you want, it even does not have to be strictly user related.

To add some context, you could for example pass an internal identifier of the application, application build/version, environment (e.g. "DEV", "QA", "PROD"), etc.

window.ybug_settings = {
    id:'XXXXXXXXX', 
    user: {
       id: '112233445566',
       username: 'john-doe'
       // any other info you need to add context
    }
};

If you need to change user data (ie when your user logs in), you can call Ybug.setUser() method.

Ybug.setUser({
    id: 'XYZ',
    // ...
 });

Feedback default values

You can prefill feedback form with some default values:

window.ybug_settings = {
    id: 'XXXXXXXXX', 
    feedback: {
        comment: 'Winter is coming...',
        rating: 5, 
        email: '[email protected]', 
        name: "Jon Snow"
    }
};

Sensitive data protection

We take privacy and security very seriously. Ybug automatically anonymizes the following fields to avoid transmitting any personal data to our server:

  • Password fields
  • Any input field values that look like they contain credit cards (using a basic regular expression)
  • Any input fields with the name attribute containing words such as "password", "token", "key", "secret", "card", "cvv" and their variations

To provide more security in addition to automatic anonymization, you can mark any input fields or html elements as sensitive by adding data-ybug-sensitive attribute to the element in your code.

<div data-ybug-sensitive>
    My sensitive information that will be anonymized
</div>
<input type="email" data-ybug-sensitive value="myemail" />

You can also provide a comma separated list of HTML ids/classes to identify elements that contain sensitive data and should be anonymized. The list can be added as option anonymize_elements to your ybug_settings object:

window.ybug_settings = {
    id: 'XXXXXXXXX', 
    anonymize_elements: '#my-super-secret, .tokens .api_token', // comma separated list of ids/classes of elements on your page containing sensitive data
};

Anonymization is performed by Javascript in the browser to avoid transmitting any personal data to our servers.

Setting the language

Ybug automatically detects which language to use for current user.

You can however override this behavior simply by adding option language_override to your ybug_settings object:

window.ybug_settings = {
    id:'XXXXXXXXX', 
    language_override: 'fr' // Replace with preferred language of your user
};

Currently supported languages are:

  • Bulgarian (bg)
  • Chinese (zh)
  • Croatian (hr)
  • Czech (cs)
  • Danish (da)
  • English (en)
  • Estonian (et)
  • Finnish (fi)
  • French (fr)
  • German (de)
  • Greek (el)
  • Hungarian (hu)
  • Italian (it)
  • Japanese (ja)
  • Latvian (lv)
  • Lithuanian (lt)
  • Nederlands (nl)
  • Norwegian (no)
  • Polish (pl)
  • Portuguese (Brazilian) (pt-BR)
  • Romanian (ro)
  • Russian (ru)
  • Slovak (sk)
  • Slovenian (sl)
  • Spanish (es)
  • Swedish (sv)
  • Turkish (tr)
  • Ukrainian (uk)

Is your language missing from this list? Contact us, we will be happy to add another translation.

Opening Ybug programmatically

Ybug normally opens when someone clicks on the launcher button in the bottom right corner.

If you want to open it on some other event though, you can add a small snippet of code to any element of your project. This way you can implement your own custom launcher button.

With markup

<a href="#" data-ybug="open">Feedback</a>

Example: Your feedback

You can also hide standard Ybug launcher button by passing hide_launcher: true in the ybug_settings object:

window.ybug_settings = {
    id:'XXXXXXXXX', 
    hide_launcher: true
};

If you need to skip welcome step and open feedback form directly, just pass additional skip_to: 'feedback' in the ybug_settings


With Javascript

Ybug also provides some simple Javascript API, you can use Ybug.open() and Ybug.close() methods to control Ybug widget programmatically.

// Open the widget
Ybug.open();

// Open the feedback form
Ybug.open('feedback');

// Close the widget :-)
Ybug.close();

If you need to open any particular feedback step, just pass additional parameter to open method: Ybug.open('feedback').

Example: Open feedback form or even Open annotate tool.


Keyboard shortcut

It is also possible to use a Alt+Y keyboard shortcut for opening Ybug widget. Shortcut must be enabled by passing shortcut: true in the ybug_settings object.

window.ybug_settings = {
    id:'XXXXXXXXX', 
    shortcut: true
};

Launcher position

You can position the Ybug launcher button on the bottom right, bottom left and middle right, middle left and top middle sides of the page. The launcher_position attribute can have these possible values: bottom-right (which is the default value), bottom-left, right-middle, left-middle and top-middle.

window.ybug_settings = {
    id:'XXXXXXXXX', 
    launcher_position: 'bottom-right' // change to bottom-left, right-middle, left-middle or top-middle
};

Widget position

Our Feedback Widget is positioned automatically based on the launcher position. If you set the launcher position to be on the left side of the screen, the widget opens on the left side as well. If you set the launcher position to top-middle, then the widget opens in the center.

You can change the default behavior and set the widget position yourself using the widget_position setting. The widget_position attribute can have these possible values: right, left and center.

window.ybug_settings = {
    id:'XXXXXXXXX',
    widget_position: 'center' // change to left, center, right
};

Javascript API

Open widget

As mentioned earlier, you can use Ybug.open() to open the Feedback Widget.

// Open the default widget screen
Ybug.open();

// Open the feedback form (skipping the welcome screen)
Ybug.open('feedback');

// Open the annotation page
Ybug.open('annotate');

Close widget

To close the widget if it's already open, use Ybug.close():

// Close opened widget
Ybug.close();

Hide widget

To hide the widget on certain pages, you can use Ybug.hide(). If you specify 'launcher' as the first argument, you can hide only the launcher button.

// Hide the widget or launcher
Ybug.hide();

// Hide launcher (if visible)
Ybug.hide('launcher');

Show widget

To show the widget if you have previously hidden it, use Ybug.show(). If you specify 'launcher' as the first argument, you can show only the launcher button.

// Show the widget or launcher
Ybug.show();

// Show launcher (if hidden previously)
Ybug.show('launcher');

Destroy widget

To entirely unmount the widget on certain pages, use Ybug.destroy() API call. This call destroys both widget and launcher:

// Unmount the Feedback Widget
Ybug.destroy();

Initialize widget

To initialize the Feedback Widget if you have previously unmounted it, please use Ybug.boot(). There is no need to call this on a usual page load, use it only when you called Ybug.destroy() before.

// Initialize the widget again
Ybug.boot();

Javascript events

Ybug triggers some lifecycle events, to which you can register listeners easily, either by calling Ybug.on(event, callback) or directly in your configuration object.

Event Description
load Triggers when Ybug is fully loaded and ready.
open Open event is triggered right after the Feedback widget is opened.
beforesend Beforesend event is triggered before sending the feedback report to Ybug servers. You can use this event to modify submitted report. A json object with report data is passed to the beforesend event handler.

New  If you return a Promise from your event handler, the feedback report will not be sent until the Promise resolves. If the Promise resolves with FALSE, the feedback will not be sent. This way, you can cancel the feedback sending operation if needed.
aftersend Aftersend event is triggered after the feedback report is sent to Ybug servers. A json object with report data is passed to the aftersend event handler with two additional properties available for the new report - id (report key) and reportUrl for the report detail page in the dashboard.
cancel Triggers when the Feedback widget is closed without submitting the report (by clicking the Cancel button or pressing ESC).
close Triggers every time the Feedback widget is closed (even when cancelled).

Register your event listeners in the configuration object:

window.ybug_settings = {
    id:'XXXXXXXXX', 
    onload: function() {
        console.log('Ybug loaded and ready');
    },
    onopen: function () {
        console.log('Ybug opened');
    },
    onbeforesend: function (report) {
        console.log('Before report is sent', report);

        // You can modify the feedback report here
        report.title = 'Modified title: ' + report.title;

        // If you need to perform some async actions, you can return a Promise
        return new Promise(resolve => {

            // Do some async work...
            let agreed = confirm('Do you agree to our Terms and Conditions?');

            resolve(agreed); // if you resolve with false, the feedback will not be sent
        });
    },
    onaftersend: function(report) {
        // Feedback report was sent! We have id and reportUrl available now
        console.log(`Feedback with an ID ${report.id} was sent. Go to ${reportUrl} for details!`);
    },
    oncancel: function () {
        console.log('Feedback cancelled');
    },
    onclose: function () {
        console.log('Feedback widget closed');
    }, 
};

Or you can register your event listeners by calling Ybug.on(event, callback). Please note, that you can use Ybug.on method only after Ybug has successfully loaded. The best place to setup your event listeners, is in the onload function:

window.ybug_settings = {
    id:'XXXXXXXXX', 
    onload: function() { 
        Ybug.on('open', function() {console.log('opened')});
        Ybug.on('beforesend', function(report) {console.log('Before report is sent', report)});
        Ybug.on('aftersend', function(report) {console.log('Feedback was sent', report)});
        Ybug.on('cancel', function() {console.log('canceled')});
        Ybug.on('close', function() {console.log('closed')});
    }, 
};

Console recording  BASIC

Ybug automatically captures all unhandled global errors and console output. You can explicitly turn this feature on/off by setting the console_log option to true/false or from your dashboard:

window.ybug_settings = {
    id:'XXXXXXXXX',
    console_log: false, // Turn console recorder off
};

Limitations

Because for performance reasons Ybug is loaded asynchronously, it can capture errors and console output only when it is fully loaded. If performance is not a concern, you can put Ybug's Javascript snippet into the <head> section of the page.

For security reasons, capturing unhandled errors is also limited by browsers. If you see "Script error." in your Ybug's console log, it means that the error originates from a Javascript file from a different origin. This is also known as a CORS error. Please refer to our troubleshooting section for more details.

Custom error logging

You can use Ybug's Custom error logging feature to capture any errors that had been handled by your application.

try {
    // Some JS code ...
} catch (err) {
    if (Ybug) {// Make sure Ybug is loaded
        Ybug.log('error', err);

        // You can also log a message
        Ybug.log('log', 'An error happened...');
    }
}

Feedback form customization

Do You need to customize or translate texts in the Ybug launcher button or feedback forms? No problem, it is possible to customize texts in all parts of Ybug app.

Enabling/disabling fields

It is possible customize the feedback form to meet your needs. Currently supported fields are: Feedback type, Comment, Name, E-mail, Phone, Priority, Rating (with stars) and Net Promoter Score®. You can make these fields hidden, optional or required.

Default feedback form settings:

window.ybug_settings = {
    id:'XXXXXXXXX',
    rating: false,   // Rating is disabled by default
    rating_required: false,
    rating_type: 'emoji', // Possible values: 'stars', 'emoji'
    comment: true,   // Comment is enabled and required
    comment_required: true, 
    name: false,     // Name field is disabled
    name_required: false,
    email: true,     // Email field is enabled and optional
    email_required: false,
    type: false,     // Feedback type (Bug, Improvement, Question, ...)
    type_required: false,
    title: false,    // Feedback title/summary field
    title_required: false,
    priority: false, // Feedback priority
    priority_required: false,
    phone: false,    // Phone number field
    phone_required: false,
    nps: false,      // Net Promoter Score® field
    nps_required: false,
};

Launcher button

To change the label of Ybug launcher button to your own call to action text (for example "Report a problem" instead of default "Send feedback"), just add a translate object with launcherButton.Title option to your ybug_settings object:

window.ybug_settings = {
    id:'XXXXXXXXX', 
    translate: {
        "launcherButton.Title": "Report a problem",
    }
};

Additional options

Name Type Default Description
close_countdown int|false 5 The countdown total value (in seconds) before the Thank you dialog closes. You can also pass a negative number which will close the Thank you page immediately after submitting the feedback. The countdown timer can also be disabled by passing close_countdown: false

Translations  BASIC

To customize the translations of certain text elements within the widget, you can use the translate setting. This setting is a JSON object containing key-value pairs where the key is the text element and the value is the translation. To use this setting, simply add it to your ybug_settings object. You can use this as a template:

window.ybug_settings = {
    id:'XXXXXXXXX', 
    translate: {
    "launcherButton.Title": "Feedback",
    "feedbackTypeForm.Heading": "Feedback",
    "feedbackTypeForm.Subheading": "Have you found a bug or do you have any comments\/suggestions about this site?",
    "feedbackTypeForm.ButtonSpecific": "Select and comment part of this page",
    "feedbackTypeForm.ButtonGeneral": "General feedback about this page",
    "feedbackForm.Heading": "Feedback",
    "feedbackForm.RatingLabel": "How would you rate your experience?",
    "feedbackForm.TextLabel": "Comment",
    "feedbackForm.TextPlaceholder": "Write a comment or describe a problem.",
    "feedbackForm.TitleLabel": "Title",
    "feedbackForm.TitlePlaceholder": "Short feedback summary",
    "feedbackForm.EmailLabel": "Your e-mail",
    "feedbackForm.EmailPlaceholder": "Your e-mail",
    "feedbackForm.EmailError": "Please enter a valid e-mail address",
    "feedbackForm.NameLabel": "Your name",
    "feedbackForm.PriorityLabel": "Priority",
    "feedbackForm.TypeLabel": "Feedback type",
    "feedbackForm.Types.1": "Bug",
    "feedbackForm.Types.2": "Improvement",
    "feedbackForm.Types.3": "Question",
    "feedbackForm.Types.4": "Feedback",
    "feedbackForm.PhoneLabel": "Your phone number",
    "feedbackForm.PhoneError": "Please enter a valid phone number",
    "feedbackForm.NpsLabel": "How likely are you to recommend us to a friend or colleague?",
    "feedbackForm.Nps.Unlikely": "Not likely at all",
    "feedbackForm.Nps.Likely": "Extremely likely",
    "feedbackForm.ButtonSubmit": "Submit feedback",
    "feedbackForm.ButtonCancel": "Back",
    "feedbackForm.RequiredError": "This field is required",
    "feedbackForm.OptionalText": "(optional)",
    "feedbackForm.AddScreenshot": "Add screenshot",
    "feedbackForm.EditScreenshot": "Edit screenshot",
    "feedbackForm.AddVideoClip": "Record video clip",
    "feedbackForm.PreviewVideoClip": "Preview video clip",
    "feedbackForm.Consent.Label": "I agree to the {tos}",
    "feedbackForm.Consent.TosUrl": "https:\/\/ybug.io\/terms",
    "feedbackForm.Consent.TosLabel": "Terms of Service",
    "feedbackForm.MaxLengthError": "This text is too long. Maximum is {max} characters",
    "feedbackForm.BeforeUnload": "Are you sure you want to exit? Any feedback left will not be saved.",
    "screenRecorder.Start": "Start recording",
    "screenRecorder.Stop": "Stop recording",
    "screenRecorder.Audio.Mute": "Mute",
    "screenRecorder.Audio.Unmute": "Unmute",
    "screenRecorder.Audio.NotSupported": "Audio not supported",
    "videoPreview.RecordAgain": "Record again",
    "videoPreview.Done": "Done",
    "highlighter.Cancel": "Cancel",
    "highlighter.Undo": "Undo",
    "highlighter.tools.Pencil": "Pencil",
    "highlighter.tools.Interact": "Interact",
    "highlighter.tools.Arrow": "Arrow",
    "highlighter.tools.Rectangle": "Rectangle",
    "highlighter.tools.ColorPicker": "Color picker",
    "highlighter.tools.Obfuscate": "Obfuscate",
    "highlighter.tools.Text": "Add a comment",
    "highlighter.tools.Text.Placeholder": "Type a comment",
    "highlighter.tools.Text.Save": "Save comment",
    "highlighter.Done": "Done",
    "thankYouModal.Heading": "Thank You",
    "thankYouModal.Text": "Your feedback has been sent successfully. Thank you.",
    "thankYouModal.Button": "Close",
    "processingModal.Heading": "Processing",
    "privacyTour.Title": "Privacy tip",
    "privacyTour.Ok": "Got it",
    "privacyTour.Obfuscate": "Use this tool to obfuscate any personal information before sending your feedback."
}};

Note that any text elements that are not defined in this setting will use the default texts.

Multi-language setup

To set up multiple languages at once, you can use the translations setting. It is again a JSON object where each key is a language code (e.g. 'cs', 'en', 'de', 'it', ...) and the value is another JSON object containing key-value pairs for the different text elements in that language. The keys are the same as in the translate setting mentioned above. To use this setting, simply add it to your ybug_settings object like this:

window.ybug_settings = {
    id: 'XXXXXXXXX',
    translations: {
        'en': {
            "launcherButton.Title": "Feedback button",
            "feedbackTypeForm.Heading": "Feedback please!"
        },
        'de': {
            "launcherButton.Title": "Feedback",
            "feedbackTypeForm.Heading": "Feedback bitte!"
        }
    }
};

Please keep in mind that the translate setting takes precedence over the translations setting, meaning that any text elements defined in the translate setting will override the corresponding text elements in the translations setting for any language.


Do you have any questions?

Contact us in case you have any questions or feedback.
We will be happy to help.

This website uses cookies to ensure you get the best experience on our website. Review our privacy policy