# ByteBrew > ByteBrew is an all-in-one mobile app and game growth platform organized around three pillars — **Analyze** (real-time engagement, retention, monetization, LTV, funnels, breakdowns, cohorts, mechanics, journeys), **Operate** (Live Ops with Remote Configs, A/B Tests, push notifications, attribution), and **Grow** (ByteBrew Ads cross-promotion powered by the Ctrl AI behavioral targeting engine and the Alt creative-serving engine). Developers integrate a single lightweight SDK to unlock every tool on the dashboard for free, with real-time data streaming, server-side IAP validation, impression-level ad revenue tracking, free attribution measurement across integrated networks, SKAN support, and a 24-month historical query window. Supported platforms: Unity, iOS (Swift), Android, Godot, GameMaker, Flutter, React Native, Unreal, .NET MAUI, Cordova, and JavaScript (Web). All dashboard data operates in UTC. > **For agents and LLMs:** A companion file with the full expanded content of every page below — including the complete Unity guidance, dashboard metric tables, setup walkthroughs, FAQs, and video transcript timestamps — is available at [llms-full.txt](https://docs.bytebrew.io/llms-full.txt). For anything not covered in either file, fetch the canonical docs page directly from [docs.bytebrew.io](https://docs.bytebrew.io). The marketing site at [bytebrew.io](https://bytebrew.io) describes the platform around the three product pillars: [Analyze](https://bytebrew.io/analyze), [Operate](https://bytebrew.io/operate), and [Grow](https://bytebrew.io/grow). ## Getting Started - [Developer Hub](https://docs.bytebrew.io/): Welcome to the ByteBrew Developer Hub with guides, docs, and tutorial videos. - [Setup Apps](https://docs.bytebrew.io/startup/home): Create your ByteBrew account, add an app, and retrieve your Game ID and SDK Key. - [Create Account](https://docs.bytebrew.io/startup/createaccount): Register for the ByteBrew dashboard. - [Add Apps](https://docs.bytebrew.io/startup/addgames): Add a new app with title, bundle identifier, genre, App ID, and Shared Secret. - [Manage Studio Account](https://docs.bytebrew.io/startup/managestudio): Invite team members and transfer apps between studios. - [App Settings](https://docs.bytebrew.io/dashboard/gamesettings): Configure App Store Shared Secret and Google License Key for purchase validation. ## SDK Integration ### Unity SDK (priority) - [Unity SDK Overview](https://docs.bytebrew.io/sdk/unity): Integrate the ByteBrew SDK for Unity covering analytics, ads, IAP validation, remote configs, and ATT. *For the full Unity walkthrough including Overview notes, all FAQs, and the expanded antipattern reasoning, see the Unity section of [llms-full.txt](https://docs.bytebrew.io/llms-full.txt) or the live page at [docs.bytebrew.io/sdk/unity](https://docs.bytebrew.io/sdk/unity).* **Install / Setup** ```csharp // source: https://docs.bytebrew.io/sdk/unity // Import ByteBrew Unity SDK to your project. (Android Only) If you don't use Auto-Resolve on your External Dependency Manager, then after importing the SDK, go to Assets, find External Dependency Manager, select Android Resolver, and click Force Resolve. ``` **Unity Settings Inspector** 1. Go to Window -> ByteBrew -> Choose "Create ByteBrew GameObject". 2. Go to Window -> ByteBrew -> Choose "Select ByteBrew settings". 3. Enable which platforms (iOS, Android and Web) you want to track on the Unity ByteBrew settings inspector panel. 4. Input the platform specific Game IDs and SDK Key from your game on the ByteBrew dashboard into the Unity ByteBrew settings inspector panel. *Note: When updating the ByteBrew SDK, make sure to re-input your Game Keys and SDK Key after updating.* **Initialize** ```csharp // source: https://docs.bytebrew.io/sdk/unity // Initialize ByteBrew and ByteBrew Ads ByteBrew.InitializeByteBrew(); ByteBrewAds.InitializeAds(); ``` **App Tracking Transparency (iOS) — wrap Initialize in the ATT callback** ```csharp // source: https://docs.bytebrew.io/sdk/unity // Call ByteBrew ATT Wrapper ByteBrew.RequestForAppTrackingTransparency((status) => { //case 0: ATTrackingManagerAuthorizationStatusAuthorized //case 1: ATTrackingManagerAuthorizationStatusDenied //case 2: ATTrackingManagerAuthorizationStatusRestricted //case 3: ATTrackingManagerAuthorizationStatusNotDetermined Debug.Log("ByteBrew got a status of: " + status); ByteBrew.InitializeByteBrew(); }); ``` **Track a custom event** ```csharp // source: https://docs.bytebrew.io/sdk/unity //Basic Custom Event without any sub-parameters ByteBrew.NewCustomEvent("eventName"); ``` **Track a custom event with parameters using Dictionary** ```csharp // source: https://docs.bytebrew.io/sdk/unity //Example Event var mapCheckpointParameters = new Dictionary() { { "earned", "KARMA" }, { "amount", "500" } }; ByteBrew.NewCustomEvent("eventName", mapCheckpointParameters); ``` *Note: Do not use special characters, such as (1) spaces, (2) periods ".", or (3) colons ":" in your custom events or parameters. As an alternative to spaces, use "_".* **Set user attribute (Data Attributes)** ```csharp // source: https://docs.bytebrew.io/sdk/unity ByteBrew.SetCustomData("dundees", 3); ByteBrew.SetCustomData("loves_the_office", true); ``` *Note: Data Attributes should not be spammed or used to continuously update a set of values for a single user (e.g. updating multiple times per second).* **Log ad revenue** ```csharp // source: https://docs.bytebrew.io/sdk/unity // Record the Placement Type, Provider of the ad, ad unit name, and revenue of the impression (all revenue must be real dollar/pennies amount and in USD) ByteBrew.TrackAdEvent(ByteBrewAdType.Interstitial, "Google AdMob", "Interstitial_Unit_Name", 0.00074145); //Add your ad units placement location in your game to breakdown your impression more. (all revenue must be real dollar/pennies amount and in USD) ByteBrew.TrackAdEvent(ByteBrewAdType.Interstitial, "Google AdMob", "Interstitial_Unit_Name", "Interstitial_EndOfLevel", 0.0024145); ``` **Setup Ads (Listeners and Loading)** ```csharp // source: https://docs.bytebrew.io/sdk/unity#SetupAds // Gotcha: Important Do not oversubscribe to unnecessary ad event listeners or subscribe multiple times to the same listeners. // Init ByteBrewAds.OnAdsInitSuccess += OnAdsInitSuccess; ByteBrewAds.OnAdsInitFailure += OnAdsInitFailed; // Interstitial // Load ByteBrewAds.OnInterstitialAdLoaded += OnInterstitialAdLoaded; ByteBrewAds.OnInterstitialAdLoadError += OnInterstitialAdLoadError; // Events ByteBrewAds.OnInterstitialAdStarted += OnInterstitialAdStarted; ByteBrewAds.OnInterstitialAdClicked += OnInterstitialAdClicked; ByteBrewAds.OnInterstitialAdCompleted += OnInterstitialAdCompleted; ByteBrewAds.OnInterstitialAdDismissed += OnInterstitialAdDismissed; ByteBrewAds.OnInterstitialAdError += OnInterstitialAdError; // Rewarded // Load ByteBrewAds.OnRewardedAdLoaded += OnRewardedAdLoaded; ByteBrewAds.OnRewardedAdLoadError += OnRewardedAdLoadError; // Events ByteBrewAds.OnRewardedAdStarted += OnRewardedAdStarted; ByteBrewAds.OnRewardedAdClicked += OnRewardedAdClicked; ByteBrewAds.OnRewardedAdCompleted += OnRewardedAdCompleted; ByteBrewAds.OnRewardedAdRewarded += OnRewardedAdRewarded; ByteBrewAds.OnRewardedAdDismissed += OnRewardedAdDismissed; ByteBrewAds.OnRewardedAdError += OnRewardedAdError; // Method Signatures private static void OnAdsInitSuccess() { // We can now start loading ads (See next section for more details) ByteBrewAds.LoadInterstitialCrossPromoAd(_BBInterstitialAdUnitId, true); ByteBrewAds.LoadInterstitialCrossPromoAd(_BBInterstitialAdUnitId); ByteBrewAds.LoadRewardedCrossPromoAd(_BBRewardedAdUnitId, true); ByteBrewAds.LoadRewardedCrossPromoAd(_BBRewardedAdUnitId); } private static void OnAdsInitFailed() {} // Interstitial private static void OnInterstitialAdLoaded(ByteBrewAdDataCommon adData) {} private static void OnInterstitialAdLoadError(string error, ByteBrewAdDataCommon adData) {} private static void OnInterstitialAdStarted(ByteBrewAdDataCommon adData) {} private static void OnInterstitialAdClicked(ByteBrewAdDataCommon adData) {} private static void OnInterstitialAdCompleted(ByteBrewAdDataCommon adData) {} private static void OnInterstitialAdDismissed(ByteBrewAdDataCommon adData) {} private static void OnInterstitialAdError(string error, ByteBrewAdDataCommon adData) {} // Rewarded private static void OnRewardedAdLoaded(ByteBrewAdDataCommon adData) {} private static void OnRewardedAdLoadError(string error, ByteBrewAdDataCommon adData) {} private static void OnRewardedAdStarted(ByteBrewAdDataCommon adData) {} private static void OnRewardedAdClicked(ByteBrewAdDataCommon adData) {} private static void OnRewardedAdCompleted(ByteBrewAdDataCommon adData) {} private static void OnRewardedAdRewarded(ByteBrewAdDataCommon adData) {} private static void OnRewardedAdDismissed(ByteBrewAdDataCommon adData) {} private static void OnRewardedAdError(string error, ByteBrewAdDataCommon adData) {} ``` **Setup Ads (Showing Interstitial / Ctrl Engine)** ```csharp // source: https://docs.bytebrew.io/sdk/unity#SetupAds // Gotcha: Use ctrlOnly: true to capture high-value targeted users first. // Omit ctrlOnly (or set false) as a fallback to fill empty ad space if your primary monetization partner fails to load. //Call Ctrl targetted ad to capture high-value users if (ByteBrewAds.IsCrossPromoAdLoaded(_BBInterstitialAdUnitId, ctrlOnly: true)) { ByteBrewAds.ShowInterstitialCrossPromoAd(_BBInterstitialAdUnitId, ctrlOnly: true); } else if(YOUR_MONETIZATION_PARTNER_STATUS) { //SHOW YOUR MONETIZATION PARTNER } else if (ByteBrewAds.IsCrossPromoAdLoaded(_BBInterstitialAdUnitId)) //Check and show an ad { //Call to fill empty ad space ByteBrewAds.ShowInterstitialCrossPromoAd(_BBInterstitialAdUnitId); } ``` **In-App Purchase Tracking with Server-Side Validation** ```csharp // source: video Server-Side Purchase Validation at 01:00 // Gotcha: Make sure the receipts have correct JSON string formatting. // Do not reward users for purchases until the receipt is explicitly validated as true via the callback to prevent fraud. // Use MiniJson to correctly deserialize the Unity IAP payload inside your ProcessPurchase method. public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e) { // Decode the initial receipt payload var dictionary = (Dictionary)MiniJson.JsonDecode(e.purchasedProduct.receipt); string receiptPayload = (string)dictionary["Payload"]; #if UNITY_ANDROID // Android requires parsing the payload again to extract the JSON and signature var payloadDict = (Dictionary)MiniJson.JsonDecode(receiptPayload); string googleReceipt = (string)payloadDict["json"]; string googleSignature = (string)payloadDict["signature"]; ByteBrew.ValidateGoogleInAppPurchaseEvent("Google Play Store", e.purchasedProduct.metadata.isoCurrencyCode, (float)e.purchasedProduct.metadata.localizedPrice, e.purchasedProduct.definition.storeSpecificId, e.purchasedProduct.definition.id, googleReceipt, googleSignature, (purchaseResultData) => { if (purchaseResultData.purchaseProcessed) { if (purchaseResultData.isValid) { Debug.Log("ByteBrew Purchase is valid"); // Reward user here } else { Debug.Log("ByteBrew Purchase Message: " + purchaseResultData.message); } } }); #elif UNITY_IOS // For Apple the receiptPayload is the base64 encoded ASN.1 receipt string iosReceipt = receiptPayload; ByteBrew.ValidateiOSInAppPurchaseEvent("Apple App Store", e.purchasedProduct.metadata.isoCurrencyCode, (float)e.purchasedProduct.metadata.localizedPrice, e.purchasedProduct.definition.storeSpecificId, e.purchasedProduct.definition.id, iosReceipt, (purchaseResultData) => { if (purchaseResultData.purchaseProcessed) { if (purchaseResultData.isValid) { Debug.Log("ByteBrew Purchase is valid"); // Reward user here } else { Debug.Log("ByteBrew Purchase Message: " + purchaseResultData.message); } } }); #endif return PurchaseProcessingResult.Complete; } ``` **Remote Configs** ```csharp // source: https://docs.bytebrew.io/sdk/unity#RemoteConfigs&A/BTests // Gotcha: The SDK must be initialized before calling Remote Configs updated. // To correctly check for initialization call: https://docs.bytebrew.io/sdk/unity#InitializationCallback // It is not recommended to wait your entire game on the initialization. You should build a polling // mechanism to check for the initialization or they can do a WaitUntil, but make sure to exit // after 2-3 seconds so your game does not experience a memory leak. float InitTimeoutSeconds = 3f; IEnumerator LoadRemoteConfigsWithTimeout() { float timer = 0f; // Poll IsByteBrewInitialized() every frame; exit as soon as it's true OR after 3s. yield return new WaitUntil(() => { timer += Time.deltaTime; return ByteBrew.IsByteBrewInitialized() || timer > InitTimeoutSeconds; }); if (!ByteBrew.IsByteBrewInitialized()) { Debug.LogWarning( $"[ByteBrew] Initialization timed out after {InitTimeoutSeconds}s. " + "Falling back to default config values."); yield break; } // SDK is up: ask the server to refresh, then read values from the local cache. // Always supply sensible defaults in case the user is in a control group or offline. ByteBrew.RemoteConfigsUpdated(() => { string difficulty = ByteBrew.GetRemoteConfigForKey("difficulty", "normal"); string bossHealth = ByteBrew.GetRemoteConfigForKey("boss_health", "1000"); Debug.Log($"[ByteBrew] Remote configs loaded. difficulty={difficulty}, boss_health={bossHealth}"); // TODO: apply these values to your game state (e.g. parse boss_health to int, etc.) }); } ``` --- ### Unity Advanced Patterns & Antipatterns **Antipattern: do not wrap the ByteBrew GameObject in your own MonoBehaviour** ```csharp // source: clarification — common Unity integration antipattern observed in the wild // Gotcha: The ByteBrew GameObject created via Window -> ByteBrew -> Create // ByteBrew GameObject is a managed prefab. It already handles its own // lifetime, including DontDestroyOnLoad across scene loads. You do NOT need // to write a singleton MonoBehaviour that: // (1) re-applies DontDestroyOnLoad to that GameObject, // (2) owns an Instance static field, or // (3) proxies the SDK's static methods through instance helpers like // MyByteBrewManager.Instance.TrackEvent(...). // // ByteBrew.InitializeByteBrew, ByteBrew.NewCustomEvent, ByteBrew.SetCustomData, // ByteBrew.TrackAdEvent, and the ByteBrewAds.* APIs are all static. Call them // directly from wherever in your code makes sense -- typically a Loading or // Launch script for InitializeByteBrew, and inline at the relevant gameplay // site for event tracking. // // Wrapping the SDK in a custom manager adds redundant indirection, duplicates // the prefab's lifetime management, forces every caller to null-check the // wrapper, and makes future SDK updates harder to apply. // WRONG -- redundant wrapper that duplicates work the SDK prefab already does public class ByteBrewManager : MonoBehaviour { public static ByteBrewManager Instance { get; private set; } private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void Start() { ByteBrew.InitializeByteBrew(); } public void TrackEvent(string name) { ByteBrew.NewCustomEvent(name); } } // ...callers then have to do: ByteBrewManager.Instance?.TrackEvent("foo"); // RIGHT -- call the static SDK directly from your existing scripts public class LoadGame : MonoBehaviour { private void Start() { // The ByteBrew prefab persists itself; we just call the static init. #if UNITY_IOS && !UNITY_EDITOR ByteBrew.RequestForAppTrackingTransparency((status) => { ByteBrew.InitializeByteBrew(); ByteBrewAds.InitializeAds(); }); #else ByteBrew.InitializeByteBrew(); ByteBrewAds.InitializeAds(); #endif } public void StartNewGame() { ByteBrew.NewCustomEvent("new_game_started"); // static, no wrapper needed // ...load scene, reset state, etc. } } public class GameManager : MonoBehaviour { public void TriggerGameOver() { // Static calls live happily inside whatever class needs them. ByteBrew.NewCustomEvent("game_over", new Dictionary { { "final_score", currentScore.ToString() } }); ByteBrew.SetCustomData("last_score", currentScore); } } ``` *Exception:* a thin MonoBehaviour is still appropriate for things that genuinely need an instance — for example, a dedicated ads-handling script that subscribes to `ByteBrewAds.OnInterstitialAdLoaded` and the other ad event listeners. That class exists to own listener lifetime (subscribe in `Awake`, unsubscribe in `OnDestroy`), not to wrap the SDK. The static `ByteBrew.*` and `ByteBrewAds.*` calls inside it are still called directly, not through a wrapper. **Where to call `ByteBrewAds.InitializeAds()` when you have a dedicated ads script with other ad-partner SDKs** ```csharp // source: clarification — co-locate ad-listener subscription with InitializeAds // Gotcha: If your project has a dedicated ads-handling script -- the name and // location of this script vary by project (e.g. AdsController.cs, // MonetizationManager.cs, AdHandler.cs, or whatever your team has called it) -- // call ByteBrewAds.InitializeAds() from THAT script, alongside your other // ad-SDK initializations such as MobileAds.Initialize(). Do NOT call it from // the launch/loading script that handles ByteBrew.InitializeByteBrew(). // // Why: ByteBrewAds.OnAdsInitSuccess (and the other ad listeners) are subscribed // on the ads script. Subscribing on one script and initializing on another // introduces script-execution-order risk -- if the loading script's Start runs // before the ads script has finished its own subscription pass, // OnAdsInitSuccess fires before anyone is listening and your cross-promo ads // silently never preload. The bug is invisible at runtime because no exception // is thrown; ads just don't show. // // Co-locating subscription and initialization in the same script removes the // ordering dependency entirely. // CORRECT -- your dedicated ads script (whatever it's called) owns both the // listeners AND the InitializeAds call. The class name here is illustrative. public class YourAdsScript : MonoBehaviour { private void Awake() { // Subscribe first -- guaranteed to complete before any Start runs. ByteBrewAds.OnAdsInitSuccess += OnBBAdsInitSuccess; // ... other listeners ... } private void Start() { MonetizationAds.Initialize(_ => { /* Ads SDK Partner ready */ }); // ByteBrewAds.InitializeAds lives here, next to MobileAds.Initialize, // because the listeners are also here. The OnAdsInitSuccess callback // is guaranteed to land on a subscribed handler. ByteBrewAds.InitializeAds(); } private void OnBBAdsInitSuccess() { /* load cross-promo ads here */ } } // The launch/loading script only handles ByteBrew core init: public class LoadGame : MonoBehaviour { private void Start() { #if UNITY_IOS && !UNITY_EDITOR ByteBrew.RequestForAppTrackingTransparency(_ => ByteBrew.InitializeByteBrew()); #else ByteBrew.InitializeByteBrew(); #endif // No ByteBrewAds.InitializeAds() here -- that's your ads script's job // if you have a separate one. } } ``` *Note:* if you have no dedicated ads script (you're only using ByteBrew analytics with no ads at all), calling `ByteBrewAds.InitializeAds()` from your loading script next to `ByteBrew.InitializeByteBrew()` is fine and correct — there's nothing to co-locate with. The co-location rule only matters when someone else owns the ad-event subscriptions. ### iOS SDK (Swift) - [iOS SDK Overview](https://docs.bytebrew.io/sdk/ios): Integrate the ByteBrew Swift SDK with native iOS apps and games. *The iOS, Android, Godot, GameMaker, Flutter, React Native, Unreal, .NET MAUI, and Cordova SDKs share the conceptual model demonstrated in the Unity section above (initialize once, then call static-style APIs for events, custom data, ad revenue, IAP validation, and remote configs). For verbatim per-platform method signatures and platform-specific setup, fetch the canonical docs page linked under each SDK below. The [llms-full.txt](https://docs.bytebrew.io/llms-full.txt) file has additional context per SDK.* ### Android SDK - [Android SDK Overview](https://docs.bytebrew.io/sdk/android): Integrate the ByteBrew SDK with native Android apps and games. ### Godot SDK - [Godot SDK Overview](https://docs.bytebrew.io/sdk/godot): Integrate ByteBrew with your Godot project. **Initialize** ```gdscript # source: video How to initialize ByteBrew SDK in your Godot Game at 04:30 if OS.get_name() == "Android": ByteBrew.initialize_bytebrew() elif OS.get_name() == "iOS": ByteBrew.initialize_bytebrew() ``` ### GameMaker SDK - [GameMaker SDK Overview](https://docs.bytebrew.io/sdk/gamemaker): Integrate ByteBrew into your GameMaker projects. ### Flutter SDK - [Flutter SDK Overview](https://docs.bytebrew.io/sdk/flutter): Integrate ByteBrew into your Flutter mobile apps. ### React Native SDK - [React Native SDK Overview](https://docs.bytebrew.io/sdk/react-native): Integrate ByteBrew into your React Native projects. ### Unreal SDK - [Unreal SDK Overview](https://docs.bytebrew.io/sdk/unreal): Integrate ByteBrew into your Unreal Engine games. ### .NET MAUI SDK - [.NET MAUI SDK Overview](https://docs.bytebrew.io/sdk/netmaui): Integrate ByteBrew into your .NET MAUI cross-platform apps. ### Cordova SDK - [Cordova SDK Overview](https://docs.bytebrew.io/sdk/cordova): Integrate ByteBrew into your Cordova hybrid apps. ### JavaScript SDK (Web) - [JavaScript SDK Overview](https://docs.bytebrew.io/sdk/javascript): Integrate ByteBrew into your web games and applications. **Initialize** ```js // source: https://docs.bytebrew.io/sdk/javascript import { ByteBrew } from "bytebrew-web-sdk"; // Initialize the ByteBrew SDK ByteBrew.initializeByteBrew('WEB_APP_ID', 'WEB_SDK_KEY', 'APP_VERSION_HERE'); ``` **Track event** ```js // source: https://docs.bytebrew.io/sdk/javascript //Basic Custom Event without any sub-parameters ByteBrew.newCustomEvent("eventName"); //Basic Custom Event with a sub-parameter ByteBrew.newCustomEvent("test_sub_param_event", { "test_key": "HelloWorld" }); ``` ## Ads Dashboard ByteBrew Ads is the **Grow** product — an AI-layered cross-promotion network for scaling app portfolios with performance-targeted growth. It is powered by **Ctrl**, ByteBrew's AI behavioral targeting engine that delivers real-time acquisition decisions, and **Alt**, the AI vision engine that dynamically serves the creative most likely to drive engagement. Built-in self-reporting attribution measures campaign performance automatically. Use it for cross-promotion across your own portfolio, LTV Campaigns that target valuable users, Retention Campaigns that target retaining players, and standard acquisition campaigns regionally or globally. *For per-page detail (what each dashboard does, when to use it, and how it connects to the SDK ad-unit IDs you create), see the Ads Dashboard section of [llms-full.txt](https://docs.bytebrew.io/llms-full.txt).* - [Ads Dashboard Overview](https://docs.bytebrew.io/adsdashboard/adsdashboardgeneral): Hub for ByteBrew Ads — create, manage, and analyze campaigns, creatives, ad units, and finance. - [Create Campaigns](https://docs.bytebrew.io/adsdashboard/createcampaigns): Launch new acquisition, cross-promotion, LTV, or retention campaigns. - [Manage Campaigns](https://docs.bytebrew.io/adsdashboard/managecampaigns): Edit, pause, and adjust live campaigns. - [Campaigns](https://docs.bytebrew.io/adsdashboard/campaigns): View all running campaigns across your apps. - [Performance](https://docs.bytebrew.io/adsdashboard/performance): Break down and analyze campaign performance metrics. - [Creatives](https://docs.bytebrew.io/adsdashboard/creatives): Upload and manage creative assets served by Alt's AI vision engine. - [Ad Units](https://docs.bytebrew.io/adsdashboard/adunits): Create and manage interstitial and rewarded ad units served in your apps. - [Finance](https://docs.bytebrew.io/adsdashboard/finance): View billing, spend, and earnings on ByteBrew Ads. ## App Dashboard The **Analyze** and **Operate** products. Analyze gives real-time engagement, retention, monetization, LTV, funnels, breakdowns, cohorts, mechanics, and journeys. Operate ships live updates with Remote Configs and A/B Tests, sends global push notifications, and measures attributed installs across integrated networks (including SKAN for iOS). All charts and reports operate in UTC, query up to 24 months of history, and are exportable as CSV via the three-dot icon on each chart. *Each dashboard page below has a much more thorough write-up in [llms-full.txt](https://docs.bytebrew.io/llms-full.txt) — chart-by-chart breakdowns, setup walkthroughs (e.g. how to build a Funnel step-by-step), the LTV prediction methodology, Remote Config caps and types, A/B Test filter immutability, attribution metric definitions, and FAQ answers. Use the links below to fetch the canonical docs page directly when full live content is needed.* ### Analytics - [Engagement](https://docs.bytebrew.io/dashboard/analytics): Real-time engagement dashboard with New Users, DAU, Sessions, Session Length, Playtime, Geo, and Retention charts. - [Retention Analytics](https://docs.bytebrew.io/dashboard/retention): Daily retention chart and heatmap up to 30 days, plus session-length, session-count, playtime, and cumulative-playtime broken down by retention day. ### Monetization - [Monetization Hub](https://docs.bytebrew.io/dashboard/monetization): Landing page linking the three monetization tools. - [Monetization Overview](https://docs.bytebrew.io/dashboard/monetizationoverview): High-level Total Revenue, IAP Revenue, Ad Revenue, ARPDAU, and ARPU from combined purchase and ad-event sources. - [Revenue Reports](https://docs.bytebrew.io/dashboard/monetizationrevenuereports): Build custom revenue tables across ARPDAU, Ad ARPDAU, IAP ARPDAU, Revenue, ARPU, ARPPU, Purchases, Purchase Conversion Rate, Impressions Per User, and Ad eCPM with up to two breakdowns. - [LTV](https://docs.bytebrew.io/dashboard/monetizationltv): Cohorted lifetime-value analysis with up to three revenue events (Purchase, Ad, Custom), Date/Build/OS/GEO breakdowns, and a logarithmic-regression LTV prediction window. ### Live Ops - [Remote Configs](https://docs.bytebrew.io/dashboard/remoteconfig): Ship live key/value updates without an app store release — supports Single, Conditional (up to 50 per app), and Grouped configs, with a 250-config-per-app cap and JSON payload support. - [A/B Tests](https://docs.bytebrew.io/dashboard/abtesting): Split users into variant groups powered by Remote Configs, measure with conversion goals, and apply country/build/OS filters at test creation. ### Custom Workspace - [Custom Workspace Overview](https://docs.bytebrew.io/dashboard/customworkspace): Hub for Funnels, Breakdowns, Cohorts, and Mechanics. - [Funnels](https://docs.bytebrew.io/customworkspace/customfunnels): Build up to 20-step real-time funnels from custom events and subparameters to visualize conversion and drop-off. - [Breakdowns](https://docs.bytebrew.io/customworkspace/custombreakdowns): Expand one custom event by its subparameter values with Group By dimensions and Average/Median/Sum/Min/Max aggregates. - [Cohorts](https://docs.bytebrew.io/customworkspace/customcohorts): Plot how users transition from a start event to an end event with optional subparameter filters and aggregate calculations. - [Mechanics](https://docs.bytebrew.io/customworkspace/custommechanics): Build fully customized queries combining events, user segments, breakdowns, formulas, and chart types — the developer's data playground. ### Journeys - [Journeys](https://docs.bytebrew.io/dashboard/journeys): Visualize every path players take by setting a Start Event, End Event, or both, with optional user segments to refine the population. ### Push Notifications - [Push Notifications Overview](https://docs.bytebrew.io/dashboard/pushnotifications): Design, automate, and deliver cross-platform push campaigns globally or to specific user cohorts. - [Add Push App](https://docs.bytebrew.io/pushdashboard/addapp): Register an app to start sending push. - [Setup Push App](https://docs.bytebrew.io/pushdashboard/settings): Upload APNs/FCM credentials. - [Create Segment](https://docs.bytebrew.io/pushdashboard/segments): Build user segments to target. - [Create Notifications](https://docs.bytebrew.io/pushdashboard/notifications): Compose and schedule notifications. - [Push Users](https://docs.bytebrew.io/pushdashboard/users): View opted-in users and tokens. - [Push Analytics](https://docs.bytebrew.io/pushdashboard/analytics): Track delivery, open, and conversion metrics. ### Attribution - [Attribution Dashboard](https://docs.bytebrew.io/dashboard/attribution): Real-time attribution overview with Non-Organic Installs, Spend, Impressions, Clicks, and CTR by network, free across all integrated partners. - [Attribution Breakdowns](https://docs.bytebrew.io/dashboard/attributionbreakdowns): Break down acquisition performance by Impressions, Clicks, CVR, CTR, eCPI, Spend, IPM, and Impressions Per Install. - [SKAN Attribution](https://docs.bytebrew.io/dashboard/skanattribution): iOS SKAdNetwork attribution measurement. - [Network List](https://docs.bytebrew.io/attribution-setup/networks): All supported attribution networks. - [Google Ads Setup](https://docs.bytebrew.io/attribution-setup/attribution-googleads): Configure Google Ads attribution. - [Apple Search Ads Setup](https://docs.bytebrew.io/attribution-setup/attribution-applesearchads): Configure Apple Search Ads attribution. - [Unity Ads Setup](https://docs.bytebrew.io/attribution-setup/attribution-unityads): Configure Unity Ads attribution. ## APIs - [ALE Metrics API](https://docs.bytebrew.io/services/ale): Pull aggregate ByteBrew metrics programmatically for external dashboards or pipelines. ## Video Tutorials - [How to integrate ByteBrew Unity SDK in 5 Minutes!](https://youtu.be/PZ9hLFJlBnM): Import the SDK, add Game IDs and SDK Key in the inspector, and initialize tracking — covers Unity SDK / Setup. - [In-App Purchase Tracking with Receipt Validation](https://youtu.be/Z18FClrIdTc): Track in-app purchases and implement server-side receipt validation — covers Unity SDK / Monetization. - [Server-Side Purchase Validation in Unity](https://www.youtube.com/@bytebrew): Deep dive into Unity IAP's `ProcessPurchase` to correctly deserialize JSON and send validation payloads — covers Unity SDK / Monetization. (Note: short URL pending verification on the ByteBrew channel.) - [Remote Configs + A/B Testing](https://youtu.be/CfipoK2B7rI): Create configs via the dashboard to dynamically change in-game variables and launch A/B test groups — covers App Dashboard / Live Ops. - [Remote Configs (overview)](https://www.youtube.com/watch?v=-hDxbQC608U): Ship live updates without an app store release — covers App Dashboard / Live Ops. - [A/B Testing (overview)](https://www.youtube.com/watch?v=l-Pd-rNrmlk): Set up variant groups and goals on the A/B Tests dashboard — covers App Dashboard / Live Ops. - [Engagement Dashboard](https://www.youtube.com/watch?v=5rIy-Pf1_xU): Tour of the real-time Engagement Analytics dashboard — covers App Dashboard / Analytics. - [Retention Analytics](https://www.youtube.com/watch?v=WEUYOYdlefo): Tour of the Retention Analytics dashboard — covers App Dashboard / Analytics. - [Custom Funnels](https://www.youtube.com/watch?v=xqFh2q_-h_4): Build up to 20-step real-time funnels — covers Custom Workspace. - [Custom Breakdowns](https://www.youtube.com/watch?v=HBmBZr2Z55o): Group and aggregate custom-event subparameters — covers Custom Workspace. - [Custom Cohorts](https://www.youtube.com/watch?v=LUHyxEZhi7I): Plot user transitions between start and end events — covers Custom Workspace. - [Mechanics + Revenue Reports](https://www.youtube.com/watch?v=qzrty59M1s4): Build custom queries with events, segments, breakdowns, and formulas — covers Custom Workspace / Monetization. - [YouTube Channel](https://www.youtube.com/@bytebrew): All ByteBrew video tutorials. ## Optional - [Contact Us](https://docs.bytebrew.io/BBSettings/contactus): Support contact form. - [Book Demo](https://calendly.com/bytebrew-success/bytebrew-demo-walkthrough): Schedule a walkthrough with the ByteBrew team. - [Terms of Service](https://docs.bytebrew.io/BBSettings/termsservice): Platform terms. - [Privacy Policy](https://docs.bytebrew.io/BBSettings/privacypolicy): Privacy policy. - [Ad Network Terms](https://docs.bytebrew.io/BBSettings/adsterms): Ad network terms and conditions. - [GitHub: ByteBrewIO](https://github.com/ByteBrewIO/): Open-source SDKs and sample projects.