Shop rewards and server-backed reminders
- Purchases grant their contents server-side, and the SDK tells you what was granted.
Purchasecompletes withFFlockPurchaseResult— the rewards handed out, the wallet afterwards, and the inventory entry if the item created one. See Shops & Inventory. - New:
Consume(InventoryId)spends an owned item and returns what it granted, with the same money safety as a purchase: an ambiguous failure surfaces instead of being re-sent, so a reward is never granted twice. In Blueprint, Flock Consume Inventory Item. Rewardson a catalog item advertises what it will give before it is bought, andTypedistinguishes a currency pack from a consumable or a standard item.- Breaking:
Purchasecompletes withFFlockPurchaseResultinstead ofFFlockPlayerInventory. The inventory entry moved to.Inventory, and it is empty for a currency pack, which hands its contents over outright and creates nothing to own — use Has Inventory Row before reading it. A generatedPurchasemacro’s output pin is renamed; regenerate after upgrading. - New: Flock Cancel All Scheduled Notifications and Flock Get Pending Schedules Blueprint nodes. Both were C++-only, so a “clear my reminders” button could not be built in a graph — and the obvious substitute, a ForEach over Flock Cancel Scheduled Notification, fires every cancel in one frame where they race over the stored list. The node walks them sequentially.
- New pure nodes for reward kinds — Is Currency Reward, Flock Currency Reward Type — because a reward’s type is a string the server owns. Comparing it to a hand-typed value risks a typo reading as “not a currency reward” and silently skipping the grant.
GetScheduled()asks the server which reminders a player has pending, so it sees reminders set before a reinstall or on another device. Filter withFlockScheduledNotificationStatuses::Pending/::Delivered/::Canceled, or the Flock Schedule Status nodes in Blueprint. See Game Notifications.CancelAllScheduled()now cancels everything the player has pending, wherever it was scheduled. It falls back to the local record only when the server cannot be reached.GetPendingSchedules()is unchanged and still synchronous and network-free; it is now the offline fallback rather than the primary list.
Read a player's scheduled reminders
GetScheduledAsync()asks the server which reminders a player has pending. Until now the only list was the SDK’s own record of what this install had scheduled, so a reinstall or a second device lost the handle and the player could not cancel their own reminders. See Game Notifications.- Filter by state with
ScheduledNotificationStatuses.Pending,.Deliveredor.Canceled. Pending is the default. CancelAllScheduledAsync()now cancels everything the player has pending, wherever it was scheduled — not just what the current install tracked. It falls back to the local record when the server cannot be reached, so an offline caller still cancels what it knows about.GetPendingSchedules()is unchanged and still synchronous and network-free; it is now the offline fallback rather than the primary list.
Shop items that grant rewards
- Purchases grant their contents server-side, and the SDK tells you what was granted. A
purchase returns
PurchaseResult— the rewards handed out, the wallet afterwards, and the inventory entry if the item created one — so a game can show “+500 Gold” without a second call. See Shops & Inventory. - New:
ConsumeAsync(inventoryId)spends an owned item and returns what it granted. Consuming moves currency, so it carries a purchase’s money safety: an ambiguous failure surfaces instead of being re-sent, and a reward is never granted twice. ShopItem.Rewardsadvertises what an item will give before it is bought, andShopItem.Typedistinguishes a currency pack from a consumable or a standard item.- Breaking:
PurchaseAsyncreturnsPurchaseResultinstead ofPlayerInventory. The inventory entry moved toresult.Inventory. Call sites that used the return value directly need that one change; the compiler will point at each of them. GrantedandRewardsare never null — an item that grants nothing yields an empty list.
Errors that name the fix
- Errors say what to do, not just what broke. A failed call used to read
Validation failed (HTTP 400), with the server’s own explanation buried in the raw response body.FlockException.Messagenow carries the call that failed, the server’s reason, the coded identifier, and aFix:line — a device login against an unregistered device namesRegisterWithDeviceAsyncoutright. See Error handling. - The fix is specific to the credential: the same
player.invalid_login_credentialsreads as “register this device first” on device sign-in and “wrong password” on email sign-in. - New on the exception:
ServerMessage,HintandOperation, so you can compose your own text instead of parsing the message.FlockErrorHints.For(errorCode)returns the same next-step wording for any code. Keep branching onErrorCode— codes are stable, wording is not. - Malformed-request errors are readable. Responses that name an offending field now surface as
body.player_data: Input should be a valid dictionaryinstead of a bare “Validation failed”. - A missing generated accessor now explains itself. Calling a codegen accessor before running Sync Schemas is a compile error, so no SDK error could ever fire for it. The SDK now watches compilation and prints the missing step, and the Code Generation tab shows whether a sync has ever run. See Work with your game data.
Game notifications
- Game notifications. A per-player inbox with unread counts and read/mark-all-read, reminders your game schedules and cancels server-side, the readable template catalog, and push device-token registration. Every call has a Blueprint node. See Game Notifications.
- Scheduling is addressed by the template’s name — what you see on the dashboard — with the ID resolved for you.
- Push tokens are registered, not fetched. Get the token from your push plugin (Firebase Cloud
Messaging, OneSignal) and hand it to
RegisterDeviceToken. Unreal ships no way to obtain an Android token itself, so a plugin is required there rather than optional. - Registering on a platform push does not support fails with a validation error rather than
guessing one — check
Flock Get Current Device Platformbefore offering the option. - Inbox reads are offline-cached; read receipts are never queued, and scheduling is never retried after an ambiguous failure, so a network blip cannot double-book a reminder.
Leaderboards
- Leaderboards. Read the top of a board, the signed-in player’s own rank, and the players around them, filtered by window and country. Boards are addressed by name. Scores need no submit call — they come from the player data field the board is configured against. See Leaderboards.
- Standings, board configuration and placements are offline-cached, so a leaderboard screen shows the last-known board when the network is down.
Leaderboards, notifications, and account linking
- Leaderboards. Read the top of a board, the signed-in player’s own rank, and the players around them, filtered by window and country. Scores need no submit call — they come from the player data field the board is configured against. See Leaderboards.
- Game notifications. A per-player inbox with unread counts, read/mark-all-read, push device
registration, and locally scheduled reminders your game can cancel. The template catalog is
readable from the game, and
FlockEvents.OnNotificationReceivedfires as new items arrive. See Game Notifications. - Account linking. One player can hold several credentials — device, email, Google, Apple, Facebook, Steam, Discord — and link or unlink them at runtime. Every call returns the updated credential list. See Account Linking.
- Breaking:
Notification.ScheduleAsyncnow takes the template’s name, not its ID. The parameter is still a string in the same position, so existing calls keep compiling and fail at runtime instead. Migration: pass the name you gave the template on the dashboard. - Auth surface completed — password reset, email verification, server-side token revocation, and a display-name availability preflight.
- Every error now carries a code. Catch
FlockExceptionand branch on the typedErrorCode, e.g.FlockErrorCode.ShopInsufficientFunds, instead of matching message text. - Fixed:
Commands.UpdatePlayerDataAsyncfailing with HTTP 422, and a stray space in the configured API URL breaking every request on WebGL.
Verified engine range 5.5–5.8
- The Unreal SDK is available — player auth, save data, economy, remote config, downloadable assets, and analytics as a native plugin. Every feature works from Blueprint as a self-contained async node, with no Target pin to wire. See the Unreal SDK guide.
- Typed code generation from your own schemas. One click turns templates, configs, and shops into typed Blueprint structs, enums, and one-node reads, writes, and purchases — no C++ and no compile step. Projects that prefer C++ can switch the target and get a generated module instead.
- Offline-safe by design. Config, game, shop-catalog and template reads are cached to disk and served without a connection; player-data writes queue and replay. Currency grants deliberately do not queue, so they cannot double-credit.
- Engine support is a verified range: UE 5.5 to 5.8 — every version in the range is compiled and run against the full test suite before release. Newer engines warn rather than block.
- Leaderboards, notifications, and account linking are Unity-only for now.
Termination tracking & synchronous log API
- Unexpected-termination detection. A run that dies without a clean quit is reported on the
next launch as an automatic
app_terminationevent, classifiedbackground_killorabnormal— see Analytics & Events. - Breaking:
LogExceptionAsync/LogErrorAsync/LogEventAsyncare now synchronousLogException/LogError/LogEvent. They only ever enqueued locally, so the oldawaitresolved on enqueue, not delivery. Migration: drop theawaitand theAsyncsuffix. - New
Analytics.FlushAsync()— a real await that drains everything queued to the server, for the rare moment delivery must be confirmed. Automatic flushing still runs as before. - Unreal SDK: matching update in progress.
Dashboard features
- Leaderboards — rank players on any numeric player-data field, with weekly and seasonal windows, country scopes, and player exclusions.
- Game Notifications — templates, campaigns (all players or a segment; now, scheduled, or recurring), and a per-player inbox across in-app, email, and push.
- Developer Alerts — log-threshold alert rules with severities, cooldowns, and a trigger history in the Alert Center.
- Public developer documentation portal, with Unity and Unreal SDK guides.