{"id":885,"date":"2026-09-29T14:19:28","date_gmt":"2026-09-29T08:49:28","guid":{"rendered":"https:\/\/www.shakebug.com\/blog\/?p=885"},"modified":"2026-09-29T14:19:28","modified_gmt":"2026-09-29T08:49:28","slug":"in-app-bug-reporting-sdk","status":"publish","type":"post","link":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/","title":{"rendered":"In-App Bug Reporting SDK: The Complete Guide for Mobile Teams"},"content":{"rendered":"<p>An in-app bug reporting SDK is a library you add to your mobile app so testers and users can file a bug from inside the app. The report arrives with an annotated screenshot, a screen recording, network and console logs, and device details already attached. Shakebug does this with one SDK family for iOS, Android, Flutter, React Native and web, and it has a free plan with no credit card required.<\/p>\n<p>This guide covers what these SDKs actually capture, how each platform is set up, what happens to a report after it&#8217;s filed, and what to check before you pick one. If you already know your platform, jump straight to its setup guide: <a href=\"https:\/\/www.shakebug.com\/mobile-app-bug-reporting\/ios\">iOS<\/a>, <a href=\"https:\/\/www.shakebug.com\/mobile-app-bug-reporting\/android\">Android<\/a>, <a href=\"https:\/\/www.shakebug.com\/blog\/flutter-crash-reporting-sdk-setup-guide\/\">Flutter<\/a>, or <a href=\"https:\/\/www.shakebug.com\/blog\/react-native-crash-reporting-guide-shakebug\/\">React Native<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Why_crash_reporting_alone_misses_most_bugs\"><\/span>Why crash reporting alone misses most bugs<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Crash reporters only see crashes. A checkout total that&#8217;s off by one cent, a button that does nothing on one Android skin, or a screen that renders blank after a slow API call never throws an exception. So they never show up in Crashlytics or any other crash-only tool.<\/p>\n<p>Those bugs reach you as a Slack message: &#8220;checkout is broken.&#8221; Then comes the usual back-and-forth. Which device? Which build? What did you tap before that? Were you logged in? By the time you have answers, the tester has moved on and the state that caused the bug is gone.<\/p>\n<p>An in-app bug reporting SDK fixes that by recording the context at the moment someone notices the problem. The tester doesn&#8217;t need to know what a stack trace is. They shake the phone, circle the wrong number, type one line, and send.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"What_an_in-app_bug_reporting_SDK_captures\"><\/span>What an in-app bug reporting SDK captures<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Here&#8217;s what a Shakebug report contains, compared with what a crash-only tool gives you for the same issue:<\/p>\n<table>\n<thead>\n<tr>\n<th>Data<\/th>\n<th>Crash-only reporter<\/th>\n<th>Shakebug in-app report<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Stack trace for crashes<\/td>\n<td>Yes<\/td>\n<td>Yes, captured automatically<\/td>\n<\/tr>\n<tr>\n<td>Non-crash bugs (wrong UI, logic errors)<\/td>\n<td>No<\/td>\n<td>Yes, filed by shake, screenshot, or a button<\/td>\n<\/tr>\n<tr>\n<td>Annotated screenshot<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Screen recording<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Network requests<\/td>\n<td>No<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Console logs<\/td>\n<td>Partial (breadcrumbs, depending on the tool)<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Device model, OS version, app version<\/td>\n<td>Yes<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>What the user did before the bug<\/td>\n<td>Breadcrumbs, if you instrument them<\/td>\n<td>Session Journey timeline<\/td>\n<\/tr>\n<tr>\n<td>Who the user is<\/td>\n<td>If you set a user ID<\/td>\n<td>User Journey, once you set custom user details<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Network logs are usually the part that closes the ticket. Most &#8220;the screen is empty&#8221; bugs turn out to be a 401 or a malformed payload. For a walkthrough of reading them in a real report, see <a href=\"https:\/\/www.shakebug.com\/blog\/capture-network-logs-react-native\/\">how to capture network logs in React Native<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Four_ways_a_report_gets_filed\"><\/span>Four ways a report gets filed<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Shake-to-report gets the attention, but it&#8217;s one of four triggers. You&#8217;ll likely want more than one.<\/p>\n<p><strong>Shake the device.<\/strong> On by default on every mobile SDK. You can turn it off if shaking conflicts with a feature in your app (a dice game, a fitness tracker).<\/p>\n<p><strong>Take a screenshot.<\/strong> The OS screenshot gesture opens the reporter. This is off by default in the React Native, Flutter and web SDKs and on by default in the iOS SDK, according to the property tables on the installation docs.<\/p>\n<p><strong>Call it from your own UI.<\/strong> Put a &#8220;Report a problem&#8221; item in your settings menu and call <code>triggerBugReporting()<\/code>. This matters for production users, who won&#8217;t know about the shake gesture.<\/p>\n<p><strong>Crash.<\/strong> Unhandled crashes are captured and sent without anyone doing anything. On iOS you can also attach a recording of the last 18 to 20 seconds before the crash with <code>allowAutoCaptureScreenForCrashes(true)<\/code>. The docs note that this can cost a little UI performance, so test it on your lowest-end supported device before you ship it.<\/p>\n<p>Here&#8217;s the manual trigger on native iOS and Android:<\/p>\n<pre class=\"wp-block-code\"><code>\/\/ iOS (Swift)\r\nShakeBugSDK.sharedInstance.triggerBugReporting()\r\n\r\n\/\/ Android (Kotlin)\r\nShakeBug.sharedInstance().triggerBugReporting()<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Setup_by_platform\"><\/span>Setup by platform<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Every platform follows the same three steps. Create a project in the Shakebug dashboard, copy the app key, and initialize the SDK once at app start. The snippets below show only the initialization. Each platform guide covers permissions, optional settings and testing in full.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"iOS_Swift_Objective-C_SwiftUI\"><\/span>iOS (Swift, Objective-C, SwiftUI)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Swift Package Manager is the recommended install. Add the package <code>https:\/\/github.com\/softnoesis\/ShakeBug\/<\/code> in Xcode and pick the latest version. CocoaPods still works but is deprecated. The minimum deployment target is iOS 13.0.<\/p>\n<pre class=\"wp-block-code\"><code>import ShakeBug\r\n\r\nfunc application(_ application: UIApplication,\r\n                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -&gt; Bool {\r\n    ShakeBugSDK.sharedInstance.initiateWithKey(\"YOUR_IOS_APP_KEY\")\r\n    return true\r\n}<\/code><\/pre>\n<p>You also need <code>NSPhotoLibraryUsageDescription<\/code> in <code>Info.plist<\/code>. Full walkthrough: <a href=\"https:\/\/www.shakebug.com\/mobile-app-bug-reporting\/ios\">iOS bug reporting with Shakebug<\/a>.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Android_Kotlin_Java\"><\/span>Android (Kotlin, Java)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Add the Gradle dependency, and add <code>maven { url 'https:\/\/jitpack.io' }<\/code> under your repositories:<\/p>\n<pre class=\"wp-block-code\"><code>\/\/ app\/build.gradle\r\nimplementation 'com.softnoesis.shakebug:ShakeBug:1.2.51'<\/code><\/pre>\n<p>Then initialize in your <code>Application<\/code> class or launch activity:<\/p>\n<pre class=\"wp-block-code\"><code>override fun onCreate(savedInstanceState: Bundle?) {\r\n    super.onCreate(savedInstanceState)\r\n    ShakeBug.sharedInstance().initiateWithKey(this, \"YOUR_ANDROID_APP_KEY\")\r\n}<\/code><\/pre>\n<p>Check the <a href=\"https:\/\/www.shakebug.com\/installation-docs\">installation docs<\/a> for the current SDK version before you copy the version number. Full walkthrough: <a href=\"https:\/\/www.shakebug.com\/mobile-app-bug-reporting\/android\">Android bug reporting with Shakebug<\/a>.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Flutter\"><\/span>Flutter<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Shakebug ships as an official Flutter plugin, so there&#8217;s no native host code to write. Run <code>flutter pub add shakebug<\/code>, then wrap your root widget:<\/p>\n<pre class=\"wp-block-code\"><code>import 'package:shakebug\/shakebug.dart';\r\n\r\nvoid main() {\r\n  runApp(\r\n    ShakebugSDK(\r\n      androidAppKey: 'YOUR_ANDROID_APP_KEY',\r\n      iosAppKey: 'YOUR_IOS_APP_KEY',\r\n      child: MaterialApp(home: const HomeScreen()),\r\n    ),\r\n  );\r\n}<\/code><\/pre>\n<p>Crash capture is on by default through <code>allowCrashReport<\/code>, and it covers both Dart exceptions and native crashes. Full walkthrough, including the Android and iOS permissions: <a href=\"https:\/\/www.shakebug.com\/blog\/flutter-crash-reporting-sdk-setup-guide\/\">Flutter crash reporting SDK setup guide<\/a>.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"React_Native\"><\/span>React Native<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Install the package with <code>npm install shakebug-react-native<\/code> and run <code>cd ios &amp;&amp; pod install<\/code>. Android needs <code>minSdkVersion<\/code> 24 or later. Then wrap your app in <code>ShakebugView<\/code>:<\/p>\n<pre class=\"wp-block-code\"><code>import ShakebugView from 'shakebug-react-native';\r\n\r\nexport default function App() {\r\n  return (\r\n    &lt;ShakebugView\r\n      Android_appkey=\"YOUR_ANDROID_APP_KEY\"\r\n      iOS_appkey=\"YOUR_IOS_APP_KEY\"\r\n    &gt;\r\n      &lt;NavigationContainer independent&gt;\r\n        {\/* your app *\/}\r\n      &lt;\/NavigationContainer&gt;\r\n    &lt;\/ShakebugView&gt;\r\n  );\r\n}<\/code><\/pre>\n<p>If <code>NavigationContainer<\/code> sits inside <code>ShakebugView<\/code>, pass it the <code>independent<\/code> prop as shown above. Full walkthrough: <a href=\"https:\/\/www.shakebug.com\/blog\/react-native-crash-reporting-guide-shakebug\/\">React Native crash reporting guide<\/a>. Already on Crashlytics? The <a href=\"https:\/\/www.shakebug.com\/blog\/migrating-from-firebase-crashlytics-to-shakebug-in-react-native\/\">Crashlytics to Shakebug migration guide<\/a> shows how to run both side by side before you switch.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Web_React_Nextjs_and_other_JS_apps\"><\/span>Web (React, Next.js and other JS apps)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The web SDK is the <code>@softnoesis\/shakebug-js<\/code> npm package. It&#8217;s a React component, so <code>react<\/code> and <code>react-dom<\/code> are peer dependencies:<\/p>\n<pre class=\"wp-block-code\"><code>import '@softnoesis\/shakebug-js\/dist\/index.css';\r\nimport { Shakebug } from '@softnoesis\/shakebug-js';\r\n\r\nfunction App() {\r\n  return (\r\n    &lt;&gt;\r\n      &lt;Shakebug appKey=\"YOUR_APP_KEY\" bundleId=\"https:\/\/your-site.com\" showFloatingButton={true} \/&gt;\r\n      {\/* your app *\/}\r\n    &lt;\/&gt;\r\n  );\r\n}<\/code><\/pre>\n<p>Users can also open the reporter with <code>Cmd + Alt + K<\/code> on macOS or <code>Ctrl + Alt + K<\/code> on Windows and Linux. If you only need testers to report bugs on a site you don&#8217;t control the code for, the <a href=\"https:\/\/www.shakebug.com\/chrome-extension\">Shakebug Chrome extension<\/a> does it with no install in the app.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Useful_calls_after_the_SDK_is_in\"><\/span>Useful calls after the SDK is in<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Three calls make reports much easier to act on. The method names are the same on every platform, and the argument styles differ slightly.<\/p>\n<p><strong>Identify the user.<\/strong> Once you set custom user details, every bug, crash and session from that person links together in their User Journey.<\/p>\n<pre class=\"wp-block-code\"><code>\/\/ React Native\r\naddCustomUser(\"user_123\", \"John Doe\", \"john@example.com\", \"US\", \"beta tester\");\r\n\r\n\/\/ Android (Kotlin)\r\nShakeBug.sharedInstance().addCustomUser(\"user_123\", \"john@example.com\", \"John Doe\", \"US\", \"beta tester\")<\/code><\/pre>\n<p><strong>Log custom events.<\/strong> <code>addEventKey<\/code> attaches an event (for example &#8220;checkout_started&#8221;) to the timeline, so a report shows the business step the user was on, not just the screen.<\/p>\n<p><strong>Hide sensitive screens.<\/strong> In React Native, wrap anything private in <code>ShakebugSdkProtectedView<\/code> so it isn&#8217;t captured in screenshots or recordings.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"From_report_to_fix_Session_Journey_and_Crash_AI\"><\/span>From report to fix: Session Journey and Crash AI<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Getting the report filed is half the job. The other half is making it quick to act on.<\/p>\n<p><strong>Session Journey<\/strong> shows the timeline that led to the bug: sessions, screens, events, earlier bugs and crashes, in order. It works for anonymous users too, grouped by device, so apps without a login still get the full story. Here&#8217;s how that looks on a real report: <a href=\"https:\/\/www.shakebug.com\/blog\/session-replay-mobile-apps-shakebug-session-journey\/\">session replay for mobile apps with Session Journey<\/a>.<\/p>\n<p><strong>Crash AI<\/strong> handles the other side. One bug in a release can produce hundreds of crash reports, and obfuscation or inlining can make identical crashes look different. Crash AI groups duplicates into one issue with a first-seen date, the affected devices and OS versions, and a trend. That means your team triages one issue instead of 200 alerts. Why exact stack-trace matching fails and what pattern-based grouping does instead: <a href=\"https:\/\/www.shakebug.com\/blog\/obfuscated-builds-break-crash-grouping\/\">why obfuscated builds break crash grouping<\/a>. Product overview: <a href=\"https:\/\/www.shakebug.com\/ai-crash-grouping\">AI crash grouping<\/a>.<\/p>\n<p>From there, reports go to the tools your team already uses. Shakebug integrates with Jira, Linear, GitHub, GitLab, Slack, Trello, Asana, ClickUp, Monday.com, Wrike and email.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"What_to_check_before_you_pick_an_in-app_bug_reporting_SDK\"><\/span>What to check before you pick an in-app bug reporting SDK<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Run through this list against any SDK you&#8217;re evaluating, including Shakebug:<\/p>\n<p><strong>Does it cover every platform you ship?<\/strong> If you have a Flutter app and a React web dashboard, one vendor for both means one place to triage. Check that each platform has a real SDK, not just a webview wrapper.<\/p>\n<p><strong>What&#8217;s attached without extra code?<\/strong> Network logs and console logs should come for free. If you have to write an interceptor to get network data, most testers&#8217; reports will arrive without it.<\/p>\n<p><strong>How are crashes grouped?<\/strong> Ask how the tool handles obfuscated or minified builds. Exact stack-trace matching creates duplicate issues after every release.<\/p>\n<p><strong>Can you control what&#8217;s captured?<\/strong> Look for a way to exclude sensitive screens, and for a self-hosted or on-premise option if your data can&#8217;t leave your infrastructure. Shakebug has a <a href=\"https:\/\/www.shakebug.com\/self-hosted-bug-reporting\">self-hosted plan<\/a>, and the SDK supports a custom endpoint.<\/p>\n<p><strong>How is it priced?<\/strong> Per-event pricing punishes you in exactly the release where crashes spike. Check what the free tier includes and what the paid tier costs as your monthly active users grow. Shakebug&#8217;s plans are on the <a href=\"https:\/\/www.shakebug.com\/pricing\">pricing page<\/a>.<\/p>\n<p>And where Shakebug is not the right tool: it isn&#8217;t a backend APM or server-side tracing product. If your main problem is slow database queries or distributed tracing across microservices, you need an observability tool, and Shakebug can sit next to it for the mobile side. The installation docs also list no SDK for Unity or Kotlin Multiplatform, so check for yourself if you need one of those. For side-by-side comparisons, see the <a href=\"https:\/\/www.shakebug.com\/blog\/best-mobile-crash-reporting-tools-in-2026-honest-guide\/\">best mobile crash reporting tools in 2026<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Frequently_asked_questions\"><\/span>Frequently asked questions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>What is an in-app bug reporting SDK?<\/strong><br \/>\nIt&#8217;s a library you add to a mobile or web app so users and testers can report a bug from inside the app. The SDK attaches a screenshot, screen recording, network and console logs, and device details to the report automatically, so developers don&#8217;t have to ask for them.<\/p>\n<p><strong>Is there a free bug reporting SDK for iOS and Android?<\/strong><br \/>\nYes. Shakebug has a free Basic plan with no credit card required. It covers iOS and Android, plus Flutter, React Native and web. Current limits for each plan are listed on the Shakebug pricing page.<\/p>\n<p><strong>What&#8217;s the difference between a bug reporting SDK and a crash reporting SDK?<\/strong><br \/>\nA crash reporting SDK only captures crashes and unhandled exceptions, automatically. A bug reporting SDK also lets people report problems that don&#8217;t crash the app, like wrong data, broken layouts or buttons that do nothing, with visual and log context. Shakebug does both in one SDK.<\/p>\n<p><strong>Do I need a separate SDK for each platform?<\/strong><br \/>\nYou install the package that matches your stack: the native SDK for iOS or Android, the <code>shakebug<\/code> plugin for Flutter, <code>shakebug-react-native<\/code> for React Native, or <code>@softnoesis\/shakebug-js<\/code> for web. All of them report into the same Shakebug dashboard, so a team shipping several platforms triages everything in one place.<\/p>\n<p><strong>Can users report bugs without shaking the phone?<\/strong><br \/>\nYes. You can trigger the reporter from a screenshot or from your own button with <code>triggerBugReporting()<\/code>. On web there&#8217;s a floating button and a keyboard shortcut. Shake-to-report can be turned off entirely.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Get_started\"><\/span>Get started<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Pick your platform guide above, or <a href=\"https:\/\/www.shakebug.com\/app\/registration\">create a free Shakebug account<\/a> and copy your app key from the dashboard. Setup is one package and one initialization call. Shake your test device once, and the first report shows up in your dashboard with the screenshot, logs and device details attached.<\/p>\n<p><!-- ============ FAQPage JSON-LD (must match visible FAQ above) ============ --><br \/>\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is an in-app bug reporting SDK?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"It's a library you add to a mobile or web app so users and testers can report a bug from inside the app. The SDK attaches a screenshot, screen recording, network and console logs, and device details to the report automatically, so developers don't have to ask for them.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is there a free bug reporting SDK for iOS and Android?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. Shakebug has a free Basic plan with no credit card required. It covers iOS and Android, plus Flutter, React Native and web. Current limits for each plan are listed on the Shakebug pricing page.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What's the difference between a bug reporting SDK and a crash reporting SDK?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"A crash reporting SDK only captures crashes and unhandled exceptions, automatically. A bug reporting SDK also lets people report problems that don't crash the app, like wrong data, broken layouts or buttons that do nothing, with visual and log context. Shakebug does both in one SDK.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do I need a separate SDK for each platform?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"You install the package that matches your stack: the native SDK for iOS or Android, the shakebug plugin for Flutter, shakebug-react-native for React Native, or @softnoesis\/shakebug-js for web. All of them report into the same Shakebug dashboard, so a team shipping several platforms triages everything in one place.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can users report bugs without shaking the phone?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes. You can trigger the reporter from a screenshot or from your own button with triggerBugReporting(). On web there's a floating button and a keyboard shortcut. Shake-to-report can be turned off entirely.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>An in-app bug reporting SDK is a library you add to your mobile app so testers and users can file a bug from inside the app. The report arrives with an annotated screenshot, a screen recording, network and console logs, and device details already attached. Shakebug does this with one SDK family for iOS, Android, [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":887,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[22],"tags":[],"class_list":["post-885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bug-reporting"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>In-App Bug Reporting SDK for iOS, Android, Flutter &amp; RN<\/title>\n<meta name=\"description\" content=\"Add an in-app bug reporting SDK to iOS, Android, Flutter, React Native or web apps. What it captures, setup code per platform, and a free plan to start.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"In-App Bug Reporting SDK for iOS, Android, Flutter &amp; RN\" \/>\n<meta property=\"og:description\" content=\"Add an in-app bug reporting SDK to iOS, Android, Flutter, React Native or web apps. What it captures, setup code per platform, and a free plan to start.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"Shakebug\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-29T08:49:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"896\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Chirag Lukhi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Chirag Lukhi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/\"},\"author\":{\"name\":\"Chirag Lukhi\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/#\/schema\/person\/37c0213bb8cbb9b49d90a908929d4ec6\"},\"headline\":\"In-App Bug Reporting SDK: The Complete Guide for Mobile Teams\",\"datePublished\":\"2026-09-29T08:49:28+00:00\",\"dateModified\":\"2026-09-29T08:49:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/\"},\"wordCount\":1794,\"publisher\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png\",\"articleSection\":[\"bug reporting\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/\",\"url\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/\",\"name\":\"In-App Bug Reporting SDK for iOS, Android, Flutter & RN\",\"isPartOf\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png\",\"datePublished\":\"2026-09-29T08:49:28+00:00\",\"dateModified\":\"2026-09-29T08:49:28+00:00\",\"description\":\"Add an in-app bug reporting SDK to iOS, Android, Flutter, React Native or web apps. What it captures, setup code per platform, and a free plan to start.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage\",\"url\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png\",\"contentUrl\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png\",\"width\":1600,\"height\":896,\"caption\":\"shakebug_blog_banner_inapp_bug_reporting_sdk\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.shakebug.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"In-App Bug Reporting SDK: The Complete Guide for Mobile Teams\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/#website\",\"url\":\"https:\/\/www.shakebug.com\/blog\/\",\"name\":\"Shakebug - Blog\",\"description\":\"Shakebug\",\"publisher\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.shakebug.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/#organization\",\"name\":\"Shakebug - Blog\",\"url\":\"https:\/\/www.shakebug.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/01\/logo.png\",\"contentUrl\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/01\/logo.png\",\"width\":192,\"height\":76,\"caption\":\"Shakebug - Blog\"},\"image\":{\"@id\":\"https:\/\/www.shakebug.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/#\/schema\/person\/37c0213bb8cbb9b49d90a908929d4ec6\",\"name\":\"Chirag Lukhi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.shakebug.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/04\/Mainphoto500500.jpg\",\"contentUrl\":\"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/04\/Mainphoto500500.jpg\",\"caption\":\"Chirag Lukhi\"},\"description\":\"Mobile application and SDK expert | Tech Geek | IT Consultant\",\"sameAs\":[\"https:\/\/www.shakebug.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"In-App Bug Reporting SDK for iOS, Android, Flutter & RN","description":"Add an in-app bug reporting SDK to iOS, Android, Flutter, React Native or web apps. What it captures, setup code per platform, and a free plan to start.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/","og_locale":"en_US","og_type":"article","og_title":"In-App Bug Reporting SDK for iOS, Android, Flutter & RN","og_description":"Add an in-app bug reporting SDK to iOS, Android, Flutter, React Native or web apps. What it captures, setup code per platform, and a free plan to start.","og_url":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/","og_site_name":"Shakebug","article_published_time":"2026-09-29T08:49:28+00:00","og_image":[{"width":1600,"height":896,"url":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png","type":"image\/png"}],"author":"Chirag Lukhi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Chirag Lukhi","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#article","isPartOf":{"@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/"},"author":{"name":"Chirag Lukhi","@id":"https:\/\/www.shakebug.com\/blog\/#\/schema\/person\/37c0213bb8cbb9b49d90a908929d4ec6"},"headline":"In-App Bug Reporting SDK: The Complete Guide for Mobile Teams","datePublished":"2026-09-29T08:49:28+00:00","dateModified":"2026-09-29T08:49:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/"},"wordCount":1794,"publisher":{"@id":"https:\/\/www.shakebug.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png","articleSection":["bug reporting"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/","url":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/","name":"In-App Bug Reporting SDK for iOS, Android, Flutter & RN","isPartOf":{"@id":"https:\/\/www.shakebug.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png","datePublished":"2026-09-29T08:49:28+00:00","dateModified":"2026-09-29T08:49:28+00:00","description":"Add an in-app bug reporting SDK to iOS, Android, Flutter, React Native or web apps. What it captures, setup code per platform, and a free plan to start.","breadcrumb":{"@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#primaryimage","url":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png","contentUrl":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2026\/09\/shakebug_blog_banner_inapp_bug_reporting_sdk.png","width":1600,"height":896,"caption":"shakebug_blog_banner_inapp_bug_reporting_sdk"},{"@type":"BreadcrumbList","@id":"https:\/\/www.shakebug.com\/blog\/in-app-bug-reporting-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.shakebug.com\/blog\/"},{"@type":"ListItem","position":2,"name":"In-App Bug Reporting SDK: The Complete Guide for Mobile Teams"}]},{"@type":"WebSite","@id":"https:\/\/www.shakebug.com\/blog\/#website","url":"https:\/\/www.shakebug.com\/blog\/","name":"Shakebug - Blog","description":"Shakebug","publisher":{"@id":"https:\/\/www.shakebug.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.shakebug.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.shakebug.com\/blog\/#organization","name":"Shakebug - Blog","url":"https:\/\/www.shakebug.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.shakebug.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/01\/logo.png","contentUrl":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/01\/logo.png","width":192,"height":76,"caption":"Shakebug - Blog"},"image":{"@id":"https:\/\/www.shakebug.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.shakebug.com\/blog\/#\/schema\/person\/37c0213bb8cbb9b49d90a908929d4ec6","name":"Chirag Lukhi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.shakebug.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/04\/Mainphoto500500.jpg","contentUrl":"https:\/\/www.shakebug.com\/blog\/wp-content\/uploads\/2022\/04\/Mainphoto500500.jpg","caption":"Chirag Lukhi"},"description":"Mobile application and SDK expert | Tech Geek | IT Consultant","sameAs":["https:\/\/www.shakebug.com"]}]}},"_links":{"self":[{"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/posts\/885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/comments?post=885"}],"version-history":[{"count":1,"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/posts\/885\/revisions"}],"predecessor-version":[{"id":886,"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/posts\/885\/revisions\/886"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/media\/887"}],"wp:attachment":[{"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/media?parent=885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/categories?post=885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shakebug.com\/blog\/wp-json\/wp\/v2\/tags?post=885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}