Skip to content


Follow these steps (demo video) to integrate a bug report widget like below into your site:

  1. Generate a Public App ID in workspace's settings. Whitelist domains on which the SDK will be integrated. See here if you have questions how to configure domains.

  2. Copy-paste the snippet below into your page's <body>:

<script type="text/javascript">
;(function(){const birdeatsbug=(window.birdeatsbug=window.birdeatsbug||[]);if(birdeatsbug.initialize)return;if(birdeatsbug.invoked){if(window.console&&console.error){console.error('birdeatsbug snippet included twice.')}return}birdeatsbug.invoked=true;birdeatsbug.methods=['setOptions','trigger','resumeSession','takeScreenshot','startRecording','stopRecording','stopSession','uploadSession','deleteSession'];birdeatsbug.factory=function(method){return function(){const;args.unshift(method);birdeatsbug.push(args);return birdeatsbug}};for(let i=0;i<birdeatsbug.methods.length;i++){const key=birdeatsbug.methods[i];birdeatsbug[key]=birdeatsbug.factory(key)}birdeatsbug.load=function(){const script=document.createElement('script');script.type='module';script.async=true;script.src='';const mountJsBefore=document.getElementsByTagName('script')[0]||document.body.firstChild;mountJsBefore.parentNode.insertBefore(script,mountJsBefore);const style=document.createElement('link');style.rel='stylesheet';style.type='text/css';style.href='';const mountCssBefore=document.querySelector('link[rel="stylesheet"]')||mountJsBefore;mountCssBefore.parentNode.insertBefore(style,mountCssBefore)};birdeatsbug.load();window.birdeatsbug.setOptions({publicAppId:'yourPublicAppId'})})();
<script type="text/javascript">
; (function() {
	// Create a queue, but don't obliterate an existing one!
	const birdeatsbug = (window.birdeatsbug = window.birdeatsbug || [])
	// If the real SDK is already on the page, return.
	if (birdeatsbug.initialize) return
	// If the snippet was invoked already, show an error.
	if (birdeatsbug.invoked) {
		if (window.console && console.error) {
			console.error('birdeatsbug snippet included twice.')
	// Invoked flag, to make sure the snippet is never invoked twice.
	birdeatsbug.invoked = true
	// A list of the methods in the SDK to stub.
	birdeatsbug.methods = [
	// Define a factory to create stubs. These are placeholders
	// for methods in the SDK so that you never have to wait
	// for it to load to record method calls. The `method` is
	// stored as the first argument, so we can replay the data.
	birdeatsbug.factory = function(method) {
		return function() {
			const args =
			return birdeatsbug
	// For each of our methods, generate a queueing stub.
	for (let i = 0; i < birdeatsbug.methods.length; i++) {
		const key = birdeatsbug.methods[i]
		birdeatsbug[key] = birdeatsbug.factory(key)
	// Define a method to load the SDK
	// and that will be sure to only ever load it once.
	birdeatsbug.load = function() {
		// Create an async script element.
		const script = document.createElement('script')
		script.type = 'module'
		script.async = true
		script.src = ''
		// Insert the script next to the first script element.
		const mountJsBefore = document.getElementsByTagName('script')[0] || document.body.firstChild
		mountJsBefore.parentNode.insertBefore(script, mountJsBefore)

		// Create a style element
		const style = document.createElement('link')
		style.rel = 'stylesheet'
		style.type = 'text/css'
		style.href = ''
		// Insert the styles before the 1st style
		const mountCssBefore = document.querySelector('link[rel="stylesheet"]') || mountJsBefore
		mountCssBefore.parentNode.insertBefore(style, mountCssBefore)
	// Load SDK
	// Pass options
	window.birdeatsbug.setOptions({ publicAppId: 'yourPublicAppId' })
  1. Replace yourPublicAppId with the one generated in the workspace settings.

Done - now all users of the page can report bugs like a pro! 🚀