Changelog

Every Bubbl SDK release, newest first. Filter by platform to see the releases that touched yours. Subscribe with RSS.

Android, iOS, Flutter and React Native share one version number, and a release lists only the platforms it changed where that's known. To move an app from 4.x, see Migrating from 4.x to 5.x.

5.1.07 Oct 2026Stable
AndroidiOSFlutterReact Native
Added
Correlation ID: Bubbl.setCorrelationId(id) and Bubbl.clearCorrelationId() are back, with the same names on Android, iOS, Flutter and React Native. They were in 4.x and missing from 5.0.x. Set your own id for the person using the device (an opaque member or CRM id, never an email address or a name) and Bubbl sends it as the device's correlation_id, so your data can be joined to your own user and CRM records. It's kept between launches, sent exactly as given (1 to 255 characters, not blank), and not unique: one person's phone and tablet share it. Clear it on sign-out. deleteMyData() and a start that began afresh forget it. See Your own user ID.
Withdrawing consent clears the id at Bubbl. The SDK keeps the last id and sends it again with the next consent, so there's nothing to do in your app.
Fixed
There are no other SDK changes. The Platform API contract bundled with the SDK is refreshed (media, location groups and new error codes).
5.0.16 Oct 2026Stable
AndroidiOSFlutterReact Native
Added
Diagnostics: when Bubbl's server answers 5xx to 3 requests in a row, Bubbl logs one error saying so, and it shows in diagnostics().lastError and as an error event. Before, a server outage left registered false with lastError empty, because 5xx answers are retried quietly. It's one error per outage, not one per retry.
Fixed
All four SDKs (Android, iOS, Flutter and React Native) are on the same stable version. There are no API changes.
5.0.05 Oct 2026Stable
iOSFlutterReact Native
Security
iOS: a campaign's button or link can no longer open any of Apple's itms- URL schemes except the App Store's own (itms-apps and itms-appss). Before, only one of them was refused. The SDK now matches the whole family by prefix, so new ones are covered too, and itms-beta, itms-books and the like are refused. Links to the App Store are unaffected. Android is unchanged.
5.0.0-alpha.41 Oct 2026Alpha
AndroidFlutterReact Native
Fixed
Android: Bubbl's notification and permission screens no longer use a display-cutout mode that Google Play flags on Android 15. They use the always-extend mode on Android 11 and later. On Android 9 and 10 the system default applies, so in landscape the dim stops at the cutout.
5.0.0-alpha.328 Sept 2026Alpha
AndroidiOSFlutterReact Native
Added
Silent geofence sync: when a geo campaign is published, updated or paused, Bubbl sends a silent push. The SDK wakes in the background, fetches the latest geofences and registers them with the OS, so devices get notifications even if the app has never been opened in that area. On iOS this needs remote-notification under UIBackgroundModes, which most Bubbl apps already have.
iOS: Bubbl.didReceiveRemoteNotification(_:completionHandler:), for apps that turn the automatic push integration off with BubblAutoIntegrationEnabled. It returns true for Bubbl's silent pushes and then calls the completion handler.
5.0.0-alpha.227 Sept 2026Alpha
AndroidFlutterReact Native
Fixed
Bubbl.permissions.openSettings() now works before Bubbl.start on Android, so an app can send people to its settings page (after a camera refusal, say) before it starts Bubbl. iOS 17 and later already did. Below the minimum OS version it stays a no-op.
On Android, openSettings() before start relies on Bubbl's AndroidX App Startup initializer, so it does nothing in an app that removed it.
Read the migration guide →
5.0.0-alpha.126 Sept 2026major
AndroidiOSFlutterReact Native
Breaking
A new SDK with no compatibility layer: nothing from the 4.x API keeps its old name. Nothing from a 4.x install carries over either, and each install registers as a new device.
One start(apiKey, options) call replaces 4.x's install and boot. BubblOptions.baseUrl is required and must be https://; there's no default host, and environment, runtimeBaseUrl, transmissionBaseUrl and ingestBaseUrl are gone.
Push, geofencing and notification taps are automatic, so push and token forwarding, location tracking calls and tap forwarding are gone. Feeding locations in by hand has no 5.0 equivalent, and correlation IDs are back from 5.1.0.
track(name, properties), setSegments, submitSurvey(message, answers) and setNotificationListener replace track(BubblTrackEvent), updateSegments, submitSurveyResponse and the default-modal switches; notification styles move to Android resources and iOS asset-catalogue colours.
iOS: through Swift Package Manager only, not CocoaPods. Pushes go straight from Bubbl to APNs, without Firebase.
Runs on Android 8.1 (API 27) and iOS 17 or later. It installs down to Android 6 (API 23) and iOS 13, where start logs one line and every call does nothing; check with Bubbl.isSupported.
Events are typed, and new event types arrive in minor releases: Android's BubblEvent is an open interface and Flutter's an abstract class (no longer sealed), so a when or switch over events needs a default branch.
Flutter needs Flutter 3.32 or later. React Native needs React Native 0.76 or later with the New Architecture: the package is a TurboModule only.
Added
Consent, opt-out and deletion: BubblOptions.requireConsent, setConsent, optOut and deleteMyData.
Bubbl.permissions, with requestNotifications, requestLocation, status and openSettings. Bubbl shows its privacy view before the system prompt when the dashboard's privacy notice calls for it.
Drawing notifications yourself: setNotificationListener, then reportDisplayed, reportOpened, reportCtaClicked, reportDismissed, reportMediaViewed, reportMediaCompleted and reportSurveyStarted; present shows a message in Bubbl's screen and openCta follows its call to action.
isBubblMessage, so an app's own push handling can skip Bubbl's pushes.
Starting with a device credential from pairing a phone with a code: start(context, credential, options) on Android, start(credential:options:) on iOS, and startWithCredential on Flutter and React Native, with a credential-rejected event when the server refuses it.
Sandbox and Production workspaces with pk_test_… and pk_live_… keys: registerTestDevice(code) approves a Sandbox install, diagnostics report environment and testDevice, and messages carry isSandbox.
diagnostics(), including installId (to find the install under Active users in the dashboard), credentialRejected and supported.
Android: google-services.json is optional. Upload it under Configuration › Firebase › Android apps and the SDK starts Firebase for you.
iOS: pictures on Bubbl's pushes through your app's notification service extension (the BubblNotificationService product), and the SDK's privacy manifest (PrivacyInfo.xcprivacy).
iOS: setPushToken, willPresent and didReceive for apps that turn the automatic push integration off with BubblAutoIntegrationEnabled.
Flutter: events as a Dart stream (Bubbl.events) or through addEventListener. A notification handed to Dart that Dart can't take is shown by Bubbl instead of being lost.
Flutter: pictures on iOS pushes through the BubblFlutterNotificationService pod, with Swift Package Manager on or off.
React Native: an Expo config plugin (Expo SDK 52 or later) for the push entitlement, location usage strings, pictures on iOS pushes (ios.imageNotifications), background refresh (ios.backgroundRefresh) and plain http for local development.
React Native: a Jest mock, BubblReactNativeNotificationService for an iOS notification service extension, and BubblPush for an Objective-C AppDelegate.
React Native: where there's no native module (the web, Expo Go, Jest, or a build from before the install), calls do nothing and say why once instead of throwing, and diagnostics() resolves as not started.
Read the migration guide →