billdog_flutter 1.0.2-beta.3 copy "billdog_flutter: ^1.0.2-beta.3" to clipboard
billdog_flutter: ^1.0.2-beta.3 copied to clipboard

BillDog SDK for Flutter — monetization, paywalls, subscriptions and BillDog Auth sign-in. Thin bridge over the native iOS/Android SDKs with inline native paywall rendering.

Changelog #

All notable changes to the BillDog Flutter SDK will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

1.0.2-beta.3 - 2026-10-03 #

Added #

  • Purchase recording as store evidence (purchase-recording proposal r3.1 §6.4): StoreEvidence (with fromInAppPurchase, which maps a StoreKit 1 restore to the original transaction id), PurchaseRecording, BillDog.recordPurchase, syncStorePurchases, purchaseRecordingIssues, storeAccountToken, and observePurchaseResult(evidence:, transactionId:).
  • PurchaseController.purchase(PurchaseRequest) and restore(), defaulted to the per-store methods, return PurchaseOutcome / RestoreOutcome with the purchase's evidence. capabilities and storeKitVersion declare what the controller can honour.

Changed (breaking) #

  • The native forwarding controllers send the full purchase request (offer token, upgrade, quantity, the customer's store-account token) and carry the evidence back. Android used to send only the product id and a hardcoded store.
  • A host purchase Dart does not answer within five minutes, or one in flight when the engine detaches, is Pending, not a failure or a hang.
  • A PurchaseController subclass may no longer declare its own members named purchase, restore, capabilities or storeKitVersion.
  • An embedded paywall's failed restore is reported as an error, not a restore (iOS).
  • OfferingResult carries the placement as the server describes it: placementInfo (PlacementInfo), presentation (PlacementPresentation: gated, holdout, withheld, withheldReason), experiment (PlacementExperiment, with variantName) and campaign (PlacementCampaign), on every outcome. gated, placementId, experimentId and variantId are read from them. The plugins used to send null for every display field, the variant name and the campaign.
  • Every failure a channel method reports is a typed BillDogError carrying the server's wire code: PlacementError.error, PresentError.error, RestoreFailed.error, WebCheckoutResult.failure, Failed.error; getCustomerInfo, getPaywall, identify, setUserAttributes and hasAccessForPlacement throw one; BillDogAuth.deleteAccount() throws ReauthRequiredError / ProofRequiredError / ProofInvalidError. BillDogDelegate.onPurchaseFailed receives a BillDogError, not a string.
  • A missing native plugin is a failure for restorePurchases (RestoreFailed), register (PlacementError) and getPresentationResult (PresentError); an empty native answer to getOffering is OfferingFailed. These used to read as an empty restore, a dismissal, "no paywall" and "nothing configured".
  • presentSurvey on an unconfigured SDK is an error, not a silent success.
  • showInAppMessages returns whether they were shown (false on iOS, which has no equivalent); it used to answer as if it had worked everywhere.
  • setSandboxMode is removed: it was a no-op on both platforms (sandbox is decided by the API-key prefix).
  • getOffering(placement) returns an OfferingResult (OfferingAvailable, OfferingHoldout, OfferingWithheld, OfferingNotConfigured, OfferingFailed) instead of Offering?. A holdout, a withheld placement and a refusal are reported as themselves; no other offering is substituted.
  • hasAccessForPlacement is asynchronous and asks the native SDK. It used to read a value nothing wrote, and answered true for every placement.
  • PurchaseController.restorePurchases returns RestoreResult. The deprecated RestorationResult alias is removed.
  • Headless paywall events carry no paywall_id. placement_identifier holds the placement identifier; placement_id is sent only when the placement's server id is known.

Added #

  • getOfferings(): the project's default offering. No placement identifier is sent.
  • purchase(productId), purchasePackage(package), purchaseViaWeb(productId) and completeWebCheckout(uri).
  • BillDogAuth.deleteAccount().
  • Typed server refusals: ProofRequiredError, ProofInvalidError (proof), ReauthRequiredError (maxAgeSeconds), AccessDeniedError (selector), PurchaseOwnerConflictError (retryable), PlacementAccessWithheldError, PlacementNotFoundError.
  • BillDogDelegate.onWebCheckoutRedeemed(RedemptionOutcome): the native onDidRedeemLink, every outcome included (RedemptionRefused carries the server's typed refusal).
  • integrations/billdog_superwall: an optional Superwall purchase controller backed by BillDog.

Fixed #

  • Every BillDogAuth and BillDogOrganizations call threw MissingPluginException: Dart invoked them on the billdog channel while both plugins handle them on io.billdog.flutter/sdk.
  • iOS: reset() tore the native SDK down (it called native reset()); every call after a logout failed until configure ran again. It now calls native logOut(), as Android does.

Removed #

  • The unused pigeon schema (pigeons/billdog_api.dart) and the pigeon dev-dependency. No generated code existed; the channels are hand-written.
  • The Dart journey action poller. It invoked checkPendingActions and completeAction, which neither plugin handled. The native SDKs fetch, execute and report journey actions themselves.

1.0.1-beta.2 #

Fixes iOS dependency resolution. The published podspec declared s.dependency 'BillDog' — a pod that has never existed on the CocoaPods trunk — so pod install failed with "Unable to find a specification for BillDog". It now depends on BillDogFull (which the Swift sources already imported) with a version floor naming the pre-release (>= 1.0.0-beta.2), since CocoaPods will not select a pre-release for an unversioned or ~> requirement.

No Dart API or behaviour changes.

1.0.0-beta.2 #

Initial public beta. Thin bridge over the native BillDog iOS/Android SDKs, with inline native paywall rendering via a PlatformView.

Added #

  • Paywall presentation and inline native paywall view (PaywallView).
  • Purchases: purchase, restore, and host-driven PurchaseController bridge.
  • Identity: logIn / logOut / identify with attribute support and persistence across configure.
  • Analytics event tracking.
  • Customer info stream, offerings, packages, entitlements, and subscription status models.
  • Localization helpers, including CLDR-parity RTL locale detection.
  • Delegate dispatch for paywall/purchase lifecycle callbacks.
  • Hand-written MethodChannel bridge (io.billdog.flutter/sdk) to the native SDKs. (This entry used to claim pigeon-generated channels; no pigeon output was ever generated or consumed, and the unused schema has been removed.)
0
likes
150
points
398
downloads

Documentation

Documentation
API reference

Publisher

verified publisherbilldog.io

Weekly Downloads

BillDog SDK for Flutter — monetization, paywalls, subscriptions and BillDog Auth sign-in. Thin bridge over the native iOS/Android SDKs with inline native paywall rendering.

Homepage
Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

flutter, shared_preferences

More

Packages that depend on billdog_flutter

Packages that implement billdog_flutter