You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
v1.1.0: dedicated /v1/purchases endpoint with shared common envelope
- Purchases now ship to POST /v1/purchases via BoostOpsPurchaseClient with
retry-until-acked persistence and server-side idempotency on
(project_id, store, transaction_id).
- BoostOpsCommonPayload module is the single source of truth for the
envelope (schema, identifiers, routing flags, consent, context). Both
/v1/events and /v1/purchases serialize through it so the two endpoints
cannot drift in what they collect.
- IAnalyticsProvider.TrackPurchase removed from the interface;
BoostOpsAnalyticsContract.TrackPurchase calls Unity Analytics and
Firebase directly for third-party mirroring.
- Public BoostOpsSDK.TrackPurchase signatures unchanged; Unity IAP
TrackPurchase(Product) overload now flows through the new pipeline.
See CHANGELOG.md for full details.
Made-with: Cursor
Copy file name to clipboardExpand all lines: Assets/BoostOps/CHANGELOG.md
+29Lines changed: 29 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,35 @@
2
2
3
3
All notable changes to the BoostOps Unity SDK will be documented in this file.
4
4
5
+
## [1.1.0] - 2026-04-28
6
+
7
+
### Changed (BREAKING wire change)
8
+
9
+
-**Purchases now use the dedicated `/v1/purchases` endpoint instead of the generic event log.** This matches the industry pattern (AppsFlyer Purchase Connector / `validateAndSendInAppPurchase`, Adjust `VerifyAndTrackPurchase`, Branch `logEvent(PURCHASE, SKPaymentTransaction)`) and gives revenue events:
10
+
- Idempotency on `(project_id, store, transaction_id)` — replays and reinstalls collapse cleanly.
11
+
- Synchronous bronze persistence on the server — the ack means "durable."
12
+
- A typed wire shape with field-level validation (store enum, ISO 4217 currency, ≤32KB receipt, sandbox flag, sub/trial flags, `original_transaction_id`).
13
+
-**`/v1/events` and `/v1/purchases` now share an identical common envelope.** Schema metadata, the four-tier identifier hierarchy (`boostops_id`, `install_id`, `custom_user_id`, `session_id`, plus `install_time_ms`), routing flags (`is_unity_editor`, `is_debug_build`, `is_testflight`, `is_emulator`), the `consent` block, and the device/platform `context` block are populated by a single builder and serialized by a single emitter, so the two endpoints can never drift in what they collect.
14
+
-`BoostOps-SDK` no longer emits the `boostops_purchase` event on `/v1/events`. The events client will refuse to enqueue it and log an error pointing at the new path. Only `boostops_impression`, `boostops_click`, `boostops_open`, and `boostops_install_attribution_update` flow through `/v1/events`.
15
+
-`IAnalyticsProvider.TrackPurchase` removed from the interface. `BoostOpsAnalyticsContract.TrackPurchase` calls Unity Analytics and Firebase Analytics directly for third-party mirroring; their concrete `TrackPurchase` methods remain in place. `BoostOpsAnalyticsProvider.TrackPurchase` is deleted (purchases no longer go through the BoostOps event provider).
16
+
17
+
### Added
18
+
19
+
-`BoostOps.Analytics.BoostOpsPurchaseClient` — dedicated singleton that ships purchases to `POST /v1/purchases`. Per-purchase JSON files under `persistentDataPath/BoostOps/purchases/` give us crash-safe, retry-until-acked durability. Exponential backoff with jitter, capped at 10 minutes. 4xx validation errors are non-recoverable and dropped; 5xx and network errors retry.
20
+
-`BoostOps.BoostOpsPurchaseInfo` — typed input for the advanced `BoostOpsAnalyticsContract.TrackPurchase(BoostOpsPurchaseInfo)` overload. Use it when you need subscription/trial flags, original transaction IDs, sandbox overrides, or stable client event IDs across retries.
21
+
-`BoostOps.Analytics.BoostOpsCommonPayload` + `BoostOpsCommonPayloadBuilder` + `BoostOpsCommonPayloadJson` — single source of truth for the shared envelope that both endpoints carry. The events serializer's `consent` and `context` rendering now delegates to this module so adding a new envelope field is a one-edit change instead of a two-pipeline change.
22
+
-`BoostOps.Analytics.BoostOpsPurchaseRequest` — internal wire-shape mirror of the server's `PurchaseRequest`. Holds the shared `Common` envelope alongside the purchase-specific fields, so `bronze.raw_purchase.raw_payload` ends up structurally identical to `bronze.raw_event.raw_payload` (modulo the purchase-specific tail).
23
+
24
+
### Removed
25
+
26
+
-`BoostOpsEventBuilder.CreatePurchaseEvent` and the `EventBuilder.Purchase` factory — dead code now that purchases bypass the event log.
27
+
- Purchase-specific install_id recovery branch in `BoostOpsAnalyticsClient.ValidateEventData` — the new client carries the identifier in its own request payload.
28
+
29
+
### Compatibility
30
+
31
+
- Public `BoostOpsSDK.TrackPurchase(...)` and `BoostOpsAnalyticsContract.TrackPurchase(...)` signatures are unchanged. Existing app code does not need to be updated.
32
+
- The Unity IAP `TrackPurchase(Product)` overload continues to work and now delivers through the new pipeline.
33
+
5
34
## [1.0.5] - 2026-04-21
6
35
7
36
- Fix UPM package name to match Unity Asset Store listing (`io.boostops.attribution-sdk`)
0 commit comments