[{"data":1,"prerenderedAt":12217},["ShallowReactive",2],{"navigation-en":3,"header-toc-links--reports-and-dashboards-daily-report-ua-report":1096,"search-en":1106,"article-page--reports-and-dashboards-daily-report-ua-report":12179,"related-articles--reports-and-dashboards-daily-report-ua-report":12195,"docs-surround--reports-and-dashboards-daily-report-ua-report":12208,"breadcrumbs--reports-and-dashboards-daily-report-ua-report":12213},[4,16,31,340,346,352,461,485,963,969,979,989,999,1005,1011,1076,1082,1092],{"title":5,"path":6,"stem":7,"children":8},"What Is Magify","/what-is-magify","01.What Is Magify",[9,12],{"title":10,"path":6,"stem":11},"What Is Magify?","01.What Is Magify/index",{"title":13,"path":14,"stem":15},"Getting Started","/what-is-magify/getting-started","01.What Is Magify/Getting Started",{"title":17,"path":18,"stem":19,"children":20},"Create New Application","/create-new-application","02.Create New Application",[21,23,27],{"title":17,"path":18,"stem":22},"02.Create New Application/index",{"title":24,"path":25,"stem":26},"Application Version Verification","/create-new-application/application-version-verification","02.Create New Application/02.Application Version Verification",{"title":28,"path":29,"stem":30},"Withdrawing An Application From Sale","/create-new-application/withdrawing-an-application-from-sale","02.Create New Application/03.Withdrawing an Application from Sale",{"title":32,"path":33,"stem":34,"children":35},"Magify Basic Integration Setup","/magify-basic-integration-setup","03.Magify Basic Integration Setup/01.index",[36,37,326],{"title":32,"path":33,"stem":34},{"title":38,"path":39,"stem":40,"children":41},"Step 1 Configure Data Grabbers","/magify-basic-integration-setup/step-1-configure-data-grabbers","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/01.index",[42,43,57,179,193],{"title":38,"path":39,"stem":40},{"title":44,"path":45,"stem":46,"children":47},"MMP","/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/01.MMP/01.index",[48,49,53],{"title":44,"path":45,"stem":46},{"title":50,"path":51,"stem":52},"Adjust","/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/01.MMP/Adjust",{"title":54,"path":55,"stem":56},"AppsFlyer","/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/appsflyer","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/01.MMP/AppsFlyer",{"title":58,"path":59,"stem":60,"children":61},"User Acquisition (UA) Cost Tracking","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/01.index",[62,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175],{"title":58,"path":59,"stem":60},{"title":64,"path":65,"stem":66},"Aarki","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Aarki",{"title":68,"path":69,"stem":70},"Adjoe","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Adjoe",{"title":72,"path":73,"stem":74},"Adjust Cost","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Adjust Cost",{"title":76,"path":77,"stem":78},"Almedia","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Almedia",{"title":80,"path":81,"stem":82},"Appier","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Appier",{"title":84,"path":85,"stem":86},"Apple Search Ads","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Apple Search Ads",{"title":88,"path":89,"stem":90},"AppLovin","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Applovin",{"title":92,"path":93,"stem":94},"Aura from Unity","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Aura",{"title":96,"path":97,"stem":98},"BIGO Ads","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/BIGO Ads",{"title":100,"path":101,"stem":102},"Chartboost","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Chartboost",{"title":104,"path":105,"stem":106},"Exmox","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Exmox",{"title":108,"path":109,"stem":110},"Facebook","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Facebook",{"title":112,"path":113,"stem":114},"Fluent","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Fluent",{"title":116,"path":117,"stem":118},"Gamelight","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Gamelight",{"title":120,"path":121,"stem":122},"Google Ads","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Google-ads",{"title":124,"path":125,"stem":126},"ironSource","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/ironsource","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/IronSource",{"title":128,"path":129,"stem":130},"Mintegral","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Mintegral",{"title":132,"path":133,"stem":134},"Mistplay","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Mistplay",{"title":136,"path":137,"stem":138},"Mobvista","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Mobvista",{"title":140,"path":141,"stem":142},"Moloco","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Moloco",{"title":144,"path":145,"stem":146},"Persona.ly","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Persona Ly",{"title":148,"path":149,"stem":150},"Prodege","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Prodege",{"title":152,"path":153,"stem":154},"Smadex","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Smadex",{"title":156,"path":157,"stem":158},"Tapjoy","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Tapjoy",{"title":160,"path":161,"stem":162},"TikTok","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/TikTok",{"title":164,"path":165,"stem":166},"Unity Ads","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Unity Ads",{"title":168,"path":169,"stem":170},"Vungle","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/Vungle",{"title":172,"path":173,"stem":174},"Kashkick","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/kashkich",{"title":176,"path":177,"stem":178},"Zucks","/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/02. UA Cost Tracking/zucks",{"title":180,"path":181,"stem":182,"children":183},"Ads Mediation Data","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/03.Ads Mediation Data/01.index",[184,185,189],{"title":180,"path":181,"stem":182},{"title":186,"path":187,"stem":188},"Applovin Max","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/03.Ads Mediation Data/Applovin Max",{"title":190,"path":191,"stem":192},"LevelPlay","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/03.Ads Mediation Data/level-play",{"title":194,"path":195,"stem":196,"children":197},"Ads Monetization Data","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/01.index",[198,199,203,207,211,215,218,222,225,228,232,235,239,243,246,250,254,258,261,265,268,272,276,280,284,288,292,295,299,303,307,311,314,318,322],{"title":194,"path":195,"stem":196},{"title":200,"path":201,"stem":202},"AdMob","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/admob",{"title":204,"path":205,"stem":206},"AlgoriX","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/algori-x",{"title":208,"path":209,"stem":210},"Amazon Ads","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/amazon-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/amazon-ads",{"title":212,"path":213,"stem":214},"AppBroda","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/app-broda",{"title":88,"path":216,"stem":217},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/app-lovin",{"title":219,"path":220,"stem":221},"BidMachine","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/bid-machine",{"title":96,"path":223,"stem":224},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/bigo-ads",{"title":100,"path":226,"stem":227},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/chartboost",{"title":229,"path":230,"stem":231},"DT Exchange","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/dt-exchange",{"title":108,"path":233,"stem":234},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/facebook",{"title":236,"path":237,"stem":238},"HyprMX","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/hyprmx",{"title":240,"path":241,"stem":242},"InMobi","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/inmobi",{"title":124,"path":244,"stem":245},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/iron-source",{"title":247,"path":248,"stem":249},"Liftoff","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/liftoff",{"title":251,"path":252,"stem":253},"LINE","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/line",{"title":255,"path":256,"stem":257},"Maio","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/maio",{"title":128,"path":259,"stem":260},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/mintegral",{"title":262,"path":263,"stem":264},"MobileFuse","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/mobile-fuse",{"title":140,"path":266,"stem":267},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/moloco",{"title":269,"path":270,"stem":271},"Next Millennium","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/next-millennium",{"title":273,"path":274,"stem":275},"Odeeo","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/odeeo",{"title":277,"path":278,"stem":279},"Ogury","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/ogury",{"title":281,"path":282,"stem":283},"Pangle (TikTok Audience Network)","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/pangle-tik-tok",{"title":285,"path":286,"stem":287},"Premium Ads","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/premium-ads",{"title":289,"path":290,"stem":291},"PubNative","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/pub-matic",{"title":289,"path":293,"stem":294},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/pub-native",{"title":296,"path":297,"stem":298},"ReklamUp","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/reklam-up",{"title":300,"path":301,"stem":302},"Smaato","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/smaato",{"title":304,"path":305,"stem":306},"Tappx","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/tappx",{"title":308,"path":309,"stem":310},"Tencent","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/tencent",{"title":164,"path":312,"stem":313},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/unity-ads",{"title":315,"path":316,"stem":317},"Verve","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/verve","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/verve",{"title":319,"path":320,"stem":321},"VK (myTarget)","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/vk-my-target","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/vk-my-target",{"title":323,"path":324,"stem":325},"Yandex","/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/yandex","03.Magify Basic Integration Setup/Step 1  Configure Data Grabbers/04.Ads Monetization Data/yandex",{"title":327,"path":328,"stem":329,"children":330},"Step 2 Install and Configure the Magify SDK","/magify-basic-integration-setup/step-2-install-and-configure-the-sdk","03.Magify Basic Integration Setup/Step 2 Install and Configure the SDK/1.index",[331,332,336],{"title":327,"path":328,"stem":329},{"title":333,"path":334,"stem":335},"Transaction Validator","/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator","03.Magify Basic Integration Setup/Step 2 Install and Configure the SDK/1.Transaction Validator",{"title":337,"path":338,"stem":339},"RevenueCat","/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/revenuecat","03.Magify Basic Integration Setup/Step 2 Install and Configure the SDK/RevenueCat",{"title":341,"path":342,"stem":343,"children":344},"Step by Step","/step-by-step","04.Step-by-step/index",[345],{"title":341,"path":342,"stem":343},{"title":347,"path":348,"stem":349,"children":350},"Sandbox and Production Environments","/sandbox-and-production-environments","06.Sandbox and Production Environments/index",[351],{"title":347,"path":348,"stem":349},{"title":353,"path":354,"stem":355,"children":356},"Reports And Dashboards","/reports-and-dashboards","07.Reports and Dashboards",[357,360,364,368,372,376,380,384,388,392,396,400,404,408,412,450,454,457],{"title":358,"path":354,"stem":359},"Reports and Dashboards","07.Reports and Dashboards/02.index",{"title":361,"path":362,"stem":363},"Understanding Parent And Nested Campaigns","/reports-and-dashboards/understanding-parent-and-nested-campaigns","07.Reports and Dashboards/01.Understanding Parent and Nested Campaigns ",{"title":365,"path":366,"stem":367},"A∕B Test Cohort Report And Dashboard","/reports-and-dashboards/ab-test-cohort-report-and-dashboard","07.Reports and Dashboards/03.A∕B Test Cohort Report and Dashboard",{"title":369,"path":370,"stem":371},"Active Users Report","/reports-and-dashboards/active-users-report","07.Reports and Dashboards/04.Active Users Report",{"title":373,"path":374,"stem":375},"Ads Monetization Report and Dashboard","/reports-and-dashboards/ads-monetization-report-and-dashboard","07.Reports and Dashboards/05.Ads Monetization Report and Dashboard ",{"title":377,"path":378,"stem":379},"Game Economy Daily and Cohort Report","/reports-and-dashboards/game-economy-daily-and-cohort-report","07.Reports and Dashboards/06.Game Economy Daily and Cohort Report",{"title":381,"path":382,"stem":383},"In-Apps Report and In-Apps Dashboard","/reports-and-dashboards/inapp-report-and-dashboard","07.Reports and Dashboards/07.inApp Report and Dashboard",{"title":385,"path":386,"stem":387},"Level Progress Report and Dashboard","/reports-and-dashboards/level-progress-report","07.Reports and Dashboards/08.Level Progress Report",{"title":389,"path":390,"stem":391},"Mediation Report","/reports-and-dashboards/mediation-report","07.Reports and Dashboards/09.Mediation Report",{"title":393,"path":394,"stem":395},"Monetization Insights Report and Dashboard","/reports-and-dashboards/monetization-insights","07.Reports and Dashboards/10.Monetization Insights",{"title":397,"path":398,"stem":399},"Product Dashboard and All Product Dashboard","/reports-and-dashboards/product-dashboard-and-all-product-dashboard","07.Reports and Dashboards/11.Product dashboard and All Product dashboard",{"title":401,"path":402,"stem":403},"Retention Report","/reports-and-dashboards/retention-report","07.Reports and Dashboards/12.Retention Report",{"title":405,"path":406,"stem":407},"UA Cohort Report And Dashboard","/reports-and-dashboards/ua-cohort-report-and-dashboard","07.Reports and Dashboards/13.UA Cohort Report and Dashboard",{"title":409,"path":410,"stem":411},"Daily Marketing Profit & Loss Report","/reports-and-dashboards/daily-marketing-profit-and-loss-report","07.Reports and Dashboards/Daily Marketing Profit & Loss Report",{"title":413,"path":414,"stem":415,"children":416},"Product Report","/reports-and-dashboards/daily-report","07.Reports and Dashboards/Daily Report/index",[417,418,422,426,430,434,438,442,446],{"title":413,"path":414,"stem":415},{"title":419,"path":420,"stem":421},"Ad Revenue","/reports-and-dashboards/daily-report/ad-revenue","07.Reports and Dashboards/Daily Report/Ad Revenue",{"title":423,"path":424,"stem":425},"Campaign Analysis","/reports-and-dashboards/daily-report/campaign-analysis","07.Reports and Dashboards/Daily Report/Campaign Analysis",{"title":427,"path":428,"stem":429}," Game Analytics","/reports-and-dashboards/daily-report/game-analytics","07.Reports and Dashboards/Daily Report/Game Analytics",{"title":431,"path":432,"stem":433},"In-App Purchases & Subscriptions","/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions","07.Reports and Dashboards/Daily Report/In-App Purchases & Subscriptions",{"title":435,"path":436,"stem":437},"Product Report: Methodology and FAQ","/reports-and-dashboards/daily-report/methodology-and-faq","07.Reports and Dashboards/Daily Report/Methodology and FAQ",{"title":439,"path":440,"stem":441},"Metrics and Dimensions","/reports-and-dashboards/daily-report/metrics-and-dimensions","07.Reports and Dashboards/Daily Report/Metrics and Dimensions",{"title":443,"path":444,"stem":445},"UA Report","/reports-and-dashboards/daily-report/ua-report","07.Reports and Dashboards/Daily Report/UA Report",{"title":447,"path":448,"stem":449},"User Activity","/reports-and-dashboards/daily-report/user-activity","07.Reports and Dashboards/Daily Report/User Activity",{"title":451,"path":452,"stem":453},"Revenue Type Cohorts Report","/reports-and-dashboards/revenue-type-cohorts-report","07.Reports and Dashboards/Revenue Type Cohorts Report",{"title":443,"path":455,"stem":456},"/reports-and-dashboards/ua-report","07.Reports and Dashboards/UA Report",{"title":458,"path":459,"stem":460},"Daily & Monthly Product Overview Dashboards","/reports-and-dashboards/daily-and-monthly-product-overview","07.Reports and Dashboards/daily-and-monthly-product-overview",{"title":462,"path":463,"stem":464,"children":465},"Campaign","/campaign","08.Campaign",[466,469,473,477,481],{"title":467,"path":463,"stem":468},"","08.Campaign/03.index",{"title":470,"path":471,"stem":472},"Campaign Statuses","/campaign/campaign-status","08.Campaign/01.Campaign Status",{"title":474,"path":475,"stem":476},"Filters And Payment Statuses","/campaign/filters-and-payment-statuses","08.Campaign/02.Filters And Payment Statuses",{"title":478,"path":479,"stem":480},"Campaign Priority","/campaign/campaign-priority","08.Campaign/04.Campaign Priority",{"title":482,"path":483,"stem":484},"Banner Campaign","/campaign/banner-campaign","08.Campaign/05.Banner Campaign",{"title":486,"path":487,"stem":488,"children":489},"Unity SDK","/unity-sdk","10.Unity SDK/01.index",[490,491,495,505,551,561,582,586,590,594,612,626,645],{"title":486,"path":487,"stem":488},{"title":492,"path":493,"stem":494},"Introduction","/unity-sdk/introduction","10.Unity SDK/02.Introduction",{"title":496,"path":497,"stem":498,"children":499},"Installation","/unity-sdk/installation","10.Unity SDK/03.Installation/1.index",[500,501],{"title":496,"path":497,"stem":498},{"title":502,"path":503,"stem":504},"Releases","/unity-sdk/installation/releases","10.Unity SDK/03.Installation/2.Releases",{"title":506,"path":507,"stem":508,"children":509},"Configuration","/unity-sdk/configuration","10.Unity SDK/04.Configuration/1.index",[510,511,515,519,523],{"title":506,"path":507,"stem":508},{"title":512,"path":513,"stem":514},"SDK Initialization","/unity-sdk/configuration/sdkinitialization","10.Unity SDK/04.Configuration/2.SdkInitialization",{"title":516,"path":517,"stem":518},"Magify settings","/unity-sdk/configuration/magifysettings","10.Unity SDK/04.Configuration/3.MagifySettings",{"title":520,"path":521,"stem":522},"Magify Service agruments","/unity-sdk/configuration/magifyservicearguments","10.Unity SDK/04.Configuration/4.MagifyServiceArguments",{"title":524,"path":525,"stem":526,"children":527},"Integration with other SDK","/unity-sdk/configuration/integration-with-other-sdk","10.Unity SDK/04.Configuration/5.Integration with other SDK/1.index",[528,529,533,537,541,544,547],{"title":524,"path":525,"stem":526},{"title":530,"path":531,"stem":532},"ApplovinMax","/unity-sdk/configuration/integration-with-other-sdk/applovinmax","10.Unity SDK/04.Configuration/5.Integration with other SDK/2.ApplovinMax",{"title":534,"path":535,"stem":536},"LevelPlay/IronSource","/unity-sdk/configuration/integration-with-other-sdk/levelplay","10.Unity SDK/04.Configuration/5.Integration with other SDK/3.LevelPlay",{"title":538,"path":539,"stem":540},"UnityPurchasing","/unity-sdk/configuration/integration-with-other-sdk/unitypurchasing","10.Unity SDK/04.Configuration/5.Integration with other SDK/4.UnityPurchasing",{"title":50,"path":542,"stem":543},"/unity-sdk/configuration/integration-with-other-sdk/adjust","10.Unity SDK/04.Configuration/5.Integration with other SDK/5.Adjust",{"title":337,"path":545,"stem":546},"/unity-sdk/configuration/integration-with-other-sdk/revenuecat","10.Unity SDK/04.Configuration/5.Integration with other SDK/6.RevenueCat",{"title":548,"path":549,"stem":550},"Your own integration","/unity-sdk/configuration/integration-with-other-sdk/yourownintegration","10.Unity SDK/04.Configuration/5.Integration with other SDK/7.YourOwnIntegration",{"title":552,"path":553,"stem":554,"children":555},"Analytics","/unity-sdk/analytics","10.Unity SDK/05.Analytics/1.index",[556,557],{"title":552,"path":553,"stem":554},{"title":558,"path":559,"stem":560},"Advanced","/unity-sdk/analytics/advanced","10.Unity SDK/05.Analytics/2.Advanced",{"title":562,"path":563,"stem":564,"children":565},"Purchases","/unity-sdk/purchases","10.Unity SDK/06.Purchases/1.index",[566,567,570,574,578],{"title":562,"path":563,"stem":564},{"title":558,"path":568,"stem":569},"/unity-sdk/purchases/advanced","10.Unity SDK/06.Purchases/2.Advanced",{"title":571,"path":572,"stem":573},"Validation","/unity-sdk/purchases/validation","10.Unity SDK/06.Purchases/3.Validation",{"title":575,"path":576,"stem":577},"External validation","/unity-sdk/purchases/externalvalidation","10.Unity SDK/06.Purchases/4.ExternalValidation",{"title":579,"path":580,"stem":581},"Aghanim purchases","/unity-sdk/purchases/aghanim","10.Unity SDK/06.Purchases/5.Aghanim",{"title":583,"path":584,"stem":585},"Advertisement","/unity-sdk/advertisement","10.Unity SDK/07.Advertisement",{"title":587,"path":588,"stem":589},"App features","/unity-sdk/appfeatures","10.Unity SDK/08.AppFeatures",{"title":591,"path":592,"stem":593},"Content","/unity-sdk/content","10.Unity SDK/09.Content",{"title":595,"path":596,"stem":597,"children":598},"Campaigns","/unity-sdk/campaigns","10.Unity SDK/10.Campaigns/1.index",[599,600,604,608],{"title":595,"path":596,"stem":597},{"title":601,"path":602,"stem":603},"Limited Time Offers (LTO)","/unity-sdk/campaigns/lto","10.Unity SDK/10.Campaigns/2.LTO",{"title":605,"path":606,"stem":607},"Visual customization","/unity-sdk/campaigns/visialcustomization","10.Unity SDK/10.Campaigns/3.VisialCustomization",{"title":609,"path":610,"stem":611},"Campaigns usage examples","/unity-sdk/campaigns/campaignexamples","10.Unity SDK/10.Campaigns/4.CampaignExamples",{"title":613,"path":614,"stem":615,"children":616},"Customization","/unity-sdk/customization","10.Unity SDK/11.Customization/1.index",[617,618,622],{"title":613,"path":614,"stem":615},{"title":619,"path":620,"stem":621},"Request config by scopes","/unity-sdk/customization/requestconfigbyscopes","10.Unity SDK/11.Customization/2.RequestConfigByScopes",{"title":623,"path":624,"stem":625},"Bundle creatives","/unity-sdk/customization/bundlecreatives","10.Unity SDK/11.Customization/6.BundleCreatives",{"title":627,"path":628,"stem":629,"children":630},"Magify Manager","/unity-sdk/magify-manager","10.Unity SDK/12.Magify Manager/1.index",[631,632,635,638,642],{"title":627,"path":628,"stem":629},{"title":552,"path":633,"stem":634},"/unity-sdk/magify-manager/analytics","10.Unity SDK/12.Magify Manager/2.Analytics",{"title":562,"path":636,"stem":637},"/unity-sdk/magify-manager/purchases","10.Unity SDK/12.Magify Manager/3.Purchases",{"title":639,"path":640,"stem":641},"App Features","/unity-sdk/magify-manager/appfeatures","10.Unity SDK/12.Magify Manager/4.AppFeatures",{"title":595,"path":643,"stem":644},"/unity-sdk/magify-manager/campaigns","10.Unity SDK/12.Magify Manager/5.Campaigns",{"title":646,"path":647,"stem":648,"children":649},"API Collection","/unity-sdk/api-collection","10.Unity SDK/14.API Collection/01.index",[650,651,661,665,722,739,743,776,818,844,866,880,884,893,907,911,925],{"title":646,"path":647,"stem":648},{"title":652,"path":653,"stem":654,"children":655},"Magify Service","/unity-sdk/api-collection/magify-service","10.Unity SDK/14.API Collection/02.Magify Service/1.index",[656,657],{"title":652,"path":653,"stem":654},{"title":658,"path":659,"stem":660},"IServicePrefs","/unity-sdk/api-collection/magify-service/iserviceprefs","10.Unity SDK/14.API Collection/02.Magify Service/2.IServicePrefs",{"title":662,"path":663,"stem":664},"Analytics Service","/unity-sdk/api-collection/analyticsservice","10.Unity SDK/14.API Collection/03.AnalyticsService",{"title":562,"path":666,"stem":667,"children":668},"/unity-sdk/api-collection/purchases","10.Unity SDK/14.API Collection/04.Purchases/01.index",[669,670,674,678,682,686,690,694,698,702,706,710,714,718],{"title":562,"path":666,"stem":667},{"title":671,"path":672,"stem":673},"PurchaserService","/unity-sdk/api-collection/purchases/purchaserservice","10.Unity SDK/14.API Collection/04.Purchases/02.PurchaserService",{"title":675,"path":676,"stem":677},"SubscriptionService","/unity-sdk/api-collection/purchases/subscriptionservice","10.Unity SDK/14.API Collection/04.Purchases/03.SubscriptionService",{"title":679,"path":680,"stem":681},"IMinimalInAppStore","/unity-sdk/api-collection/purchases/iminimalinappstore","10.Unity SDK/14.API Collection/04.Purchases/04.IMinimalInAppStore",{"title":683,"path":684,"stem":685},"IInAppStore","/unity-sdk/api-collection/purchases/iinappstore","10.Unity SDK/14.API Collection/04.Purchases/05.IInAppStore",{"title":687,"path":688,"stem":689},"PurchaseInfo","/unity-sdk/api-collection/purchases/purchaseinfo","10.Unity SDK/14.API Collection/04.Purchases/06.PurchaseInfo",{"title":691,"path":692,"stem":693},"TrustedPurchaseRecord","/unity-sdk/api-collection/purchases/trustedpurchaserecord","10.Unity SDK/14.API Collection/04.Purchases/07.TrustedPurchaseRecord",{"title":695,"path":696,"stem":697},"PurchaseType","/unity-sdk/api-collection/purchases/purchasetype","10.Unity SDK/14.API Collection/04.Purchases/08.PurchaseType",{"title":699,"path":700,"stem":701},"PeriodType","/unity-sdk/api-collection/purchases/periodtype","10.Unity SDK/14.API Collection/04.Purchases/09.PeriodType",{"title":703,"path":704,"stem":705},"ProductIdType","/unity-sdk/api-collection/purchases/productidtype","10.Unity SDK/14.API Collection/04.Purchases/10.ProductIdType",{"title":707,"path":708,"stem":709},"PurchaseStore","/unity-sdk/api-collection/purchases/purchasestore","10.Unity SDK/14.API Collection/04.Purchases/11.PurchaseStore",{"title":711,"path":712,"stem":713},"AghanimStore","/unity-sdk/api-collection/purchases/aghanimstore","10.Unity SDK/14.API Collection/04.Purchases/12.AghanimStore",{"title":715,"path":716,"stem":717},"AghanimProductCounting","/unity-sdk/api-collection/purchases/aghanimproductcounting","10.Unity SDK/14.API Collection/04.Purchases/13.AghanimProductCounting",{"title":719,"path":720,"stem":721},"AghanimOrderStatus","/unity-sdk/api-collection/purchases/aghanimorderstatus","10.Unity SDK/14.API Collection/04.Purchases/14.AghanimOrderStatus",{"title":583,"path":723,"stem":724,"children":725},"/unity-sdk/api-collection/advertisement","10.Unity SDK/14.API Collection/05.Advertisement/1.index",[726,727,731,735],{"title":583,"path":723,"stem":724},{"title":728,"path":729,"stem":730},"AdvertiserService","/unity-sdk/api-collection/advertisement/advertiserservice","10.Unity SDK/14.API Collection/05.Advertisement/2.AdvertiserService",{"title":732,"path":733,"stem":734},"IMinimalAdsMediator","/unity-sdk/api-collection/advertisement/iminimaladsmediator","10.Unity SDK/14.API Collection/05.Advertisement/3.IMinimalAdsMediator",{"title":736,"path":737,"stem":738},"IAdsMediator","/unity-sdk/api-collection/advertisement/iadsmediator","10.Unity SDK/14.API Collection/05.Advertisement/4.IAdsMediator",{"title":740,"path":741,"stem":742},"Features Provider","/unity-sdk/api-collection/featuresprovider","10.Unity SDK/14.API Collection/06.FeaturesProvider",{"title":595,"path":744,"stem":745,"children":746},"/unity-sdk/api-collection/campaigns","10.Unity SDK/14.API Collection/07.Campaigns/1.index",[747,748,752,756,760,764,768,772],{"title":595,"path":744,"stem":745},{"title":749,"path":750,"stem":751},"CampaignsProvider","/unity-sdk/api-collection/campaigns/campaignsprovider","10.Unity SDK/14.API Collection/07.Campaigns/2.CampaignsProvider",{"title":753,"path":754,"stem":755},"LimitedTimeOfferProvider","/unity-sdk/api-collection/campaigns/limitedtimeofferprovider","10.Unity SDK/14.API Collection/07.Campaigns/3.LimitedTimeOfferProvider",{"title":757,"path":758,"stem":759},"ICampaign","/unity-sdk/api-collection/campaigns/icampaign","10.Unity SDK/14.API Collection/07.Campaigns/4.ICampaign",{"title":761,"path":762,"stem":763},"ICampaignWithCreative","/unity-sdk/api-collection/campaigns/icampaignwithcreative","10.Unity SDK/14.API Collection/07.Campaigns/5.ICampaignWithCreative",{"title":765,"path":766,"stem":767},"ICampaignWithProducts","/unity-sdk/api-collection/campaigns/icampaignwithproducts","10.Unity SDK/14.API Collection/07.Campaigns/6.ICampaignWithProducts",{"title":769,"path":770,"stem":771},"LimitedTimeOfferBase","/unity-sdk/api-collection/campaigns/limitedtimeofferbase","10.Unity SDK/14.API Collection/07.Campaigns/7.LimitedTimeOfferBase",{"title":773,"path":774,"stem":775},"ICampaignHandler","/unity-sdk/api-collection/campaigns/icampaignhandler","10.Unity SDK/14.API Collection/07.Campaigns/8.ICampaignHandler",{"title":777,"path":778,"stem":779,"children":780},"Products","/unity-sdk/api-collection/products","10.Unity SDK/14.API Collection/08.Products/1.index",[781,782,786,790,794,798,802,806,810,814],{"title":777,"path":778,"stem":779},{"title":783,"path":784,"stem":785},"CrossPromoProduct","/unity-sdk/api-collection/products/crosspromoproduct","10.Unity SDK/14.API Collection/08.Products/10.CrossPromoProduct",{"title":787,"path":788,"stem":789},"ProductDef","/unity-sdk/api-collection/products/productdef","10.Unity SDK/14.API Collection/08.Products/2.ProductDef",{"title":791,"path":792,"stem":793},"InAppProduct","/unity-sdk/api-collection/products/inappproduct","10.Unity SDK/14.API Collection/08.Products/3.InAppProduct",{"title":795,"path":796,"stem":797},"SubscriptionProduct","/unity-sdk/api-collection/products/subscriptionproduct","10.Unity SDK/14.API Collection/08.Products/4.SubscriptionProduct",{"title":799,"path":800,"stem":801},"RewardProduct","/unity-sdk/api-collection/products/rewardproduct","10.Unity SDK/14.API Collection/08.Products/5.RewardProduct",{"title":803,"path":804,"stem":805},"BonusProduct","/unity-sdk/api-collection/products/bonusproduct","10.Unity SDK/14.API Collection/08.Products/6.BonusProduct",{"title":807,"path":808,"stem":809},"InfoProduct","/unity-sdk/api-collection/products/infoproduct","10.Unity SDK/14.API Collection/08.Products/7.InfoProduct",{"title":811,"path":812,"stem":813},"ExternalLinkProduct","/unity-sdk/api-collection/products/externallinkproduct","10.Unity SDK/14.API Collection/08.Products/8.ExternalLinkProduct",{"title":815,"path":816,"stem":817},"InternalLinkProduct","/unity-sdk/api-collection/products/internallinkproduct","10.Unity SDK/14.API Collection/08.Products/9.InternalLinkProduct",{"title":819,"path":820,"stem":821,"children":822},"Creatives","/unity-sdk/api-collection/creatives","10.Unity SDK/14.API Collection/09.Creatives/1.index",[823,824,828,832,836,840],{"title":819,"path":820,"stem":821},{"title":825,"path":826,"stem":827},"ICreative","/unity-sdk/api-collection/creatives/icreative","10.Unity SDK/14.API Collection/09.Creatives/2.ICreative",{"title":829,"path":830,"stem":831},"ImageCreative","/unity-sdk/api-collection/creatives/imagecreative","10.Unity SDK/14.API Collection/09.Creatives/3.ImageCreative",{"title":833,"path":834,"stem":835},"CustomCreative","/unity-sdk/api-collection/creatives/customcreative","10.Unity SDK/14.API Collection/09.Creatives/4.CustomCreative",{"title":837,"path":838,"stem":839},"BundleCreative","/unity-sdk/api-collection/creatives/bundlecreative","10.Unity SDK/14.API Collection/09.Creatives/5.BundleCreative",{"title":841,"path":842,"stem":843},"CreativeBackground","/unity-sdk/api-collection/creatives/creativebackground","10.Unity SDK/14.API Collection/09.Creatives/6.CreativeBackground",{"title":845,"path":846,"stem":847,"children":848},"Popups","/unity-sdk/api-collection/popups","10.Unity SDK/14.API Collection/10.Popups/1.index",[849,850,854,858,862],{"title":845,"path":846,"stem":847},{"title":851,"path":852,"stem":853},"IPopupBase","/unity-sdk/api-collection/popups/ipopupbase","10.Unity SDK/14.API Collection/10.Popups/2.IPopupBase",{"title":855,"path":856,"stem":857},"IPopup","/unity-sdk/api-collection/popups/ipopup","10.Unity SDK/14.API Collection/10.Popups/3.IPopup",{"title":859,"path":860,"stem":861},"IPopupWithProducts","/unity-sdk/api-collection/popups/ipopupwithproducts","10.Unity SDK/14.API Collection/10.Popups/4.IPopupWithProducts",{"title":863,"path":864,"stem":865},"IPopupsProvider","/unity-sdk/api-collection/popups/ipopupsprovider","10.Unity SDK/14.API Collection/10.Popups/5.IPopupsProvider",{"title":867,"path":868,"stem":869,"children":870},"Obtainers","/unity-sdk/api-collection/obtainers","10.Unity SDK/14.API Collection/11.Obtainers/1.index",[871,872,876],{"title":867,"path":868,"stem":869},{"title":873,"path":874,"stem":875},"ProductsObtainer","/unity-sdk/api-collection/obtainers/productsobtainer","10.Unity SDK/14.API Collection/11.Obtainers/2.ProductsObtainer",{"title":877,"path":878,"stem":879},"IProductObtainer","/unity-sdk/api-collection/obtainers/iproductobtainer","10.Unity SDK/14.API Collection/11.Obtainers/3.IProductObtainer",{"title":881,"path":882,"stem":883},"Service Time","/unity-sdk/api-collection/servicetime","10.Unity SDK/14.API Collection/12.ServiceTime",{"title":591,"path":885,"stem":886,"children":887},"/unity-sdk/api-collection/content","10.Unity SDK/14.API Collection/13.Content/01.index",[888,889],{"title":591,"path":885,"stem":886},{"title":890,"path":891,"stem":892},"ContentItem","/unity-sdk/api-collection/content/contentitem","10.Unity SDK/14.API Collection/13.Content/02.ContentItem",{"title":894,"path":895,"stem":896,"children":897},"Network","/unity-sdk/api-collection/network","10.Unity SDK/14.API Collection/14.Network/1.index",[898,899,903],{"title":894,"path":895,"stem":896},{"title":900,"path":901,"stem":902},"INetworkStatusProvider","/unity-sdk/api-collection/network/inetworkstatusprovider","10.Unity SDK/14.API Collection/14.Network/2.INetworkStatusProvider",{"title":904,"path":905,"stem":906},"NetworkStatus","/unity-sdk/api-collection/network/networkstatus","10.Unity SDK/14.API Collection/14.Network/3.NetworkStatus",{"title":908,"path":909,"stem":910},"IAppNavigator","/unity-sdk/api-collection/iappnavigator","10.Unity SDK/14.API Collection/15.IAppNavigator",{"title":912,"path":913,"stem":914,"children":915},"Utils","/unity-sdk/api-collection/utils","10.Unity SDK/14.API Collection/16.Utils/1.index",[916,917,921],{"title":912,"path":913,"stem":914},{"title":918,"path":919,"stem":920},"ConfigScope","/unity-sdk/api-collection/utils/configscope","10.Unity SDK/14.API Collection/16.Utils/2.ConfigScope",{"title":922,"path":923,"stem":924},"MagifyPresenter","/unity-sdk/api-collection/utils/magifypresenter","10.Unity SDK/14.API Collection/16.Utils/3.MagifyPresenter",{"title":926,"path":927,"stem":928,"children":929},"MagifyManager","/unity-sdk/api-collection/magify-manager","10.Unity SDK/14.API Collection/17.Magify Manager/01.index",[930,931,935,939,943,947,951,955,959],{"title":926,"path":927,"stem":928},{"title":932,"path":933,"stem":934},"MagifyManager․Features","/unity-sdk/api-collection/magify-manager/magifymanager-features","10.Unity SDK/14.API Collection/17.Magify Manager/02.MagifyManager Features",{"title":936,"path":937,"stem":938},"MagifyManager․Storage","/unity-sdk/api-collection/magify-manager/magifymanager-storage","10.Unity SDK/14.API Collection/17.Magify Manager/03.MagifyManager Storage",{"title":940,"path":941,"stem":942},"MagifyManager․Content","/unity-sdk/api-collection/magify-manager/magifymanager-content","10.Unity SDK/14.API Collection/17.Magify Manager/04.MagifyManager Content",{"title":944,"path":945,"stem":946},"MagifyManager․Lto","/unity-sdk/api-collection/magify-manager/magifymanager-lto","10.Unity SDK/14.API Collection/17.Magify Manager/05.MagifyManager Lto",{"title":948,"path":949,"stem":950},"MagifyManager․GameState","/unity-sdk/api-collection/magify-manager/magifymanager-gamestate","10.Unity SDK/14.API Collection/17.Magify Manager/06.MagifyManager GameState",{"title":952,"path":953,"stem":954},"MagifyManager․Logging","/unity-sdk/api-collection/magify-manager/magifymanager-logging","10.Unity SDK/14.API Collection/17.Magify Manager/07.MagifyManager Logging",{"title":956,"path":957,"stem":958},"MagifyManager․Aghanim","/unity-sdk/api-collection/magify-manager/magifymanager-aghanim","10.Unity SDK/14.API Collection/17.Magify Manager/08.MagifyManager Aghanim",{"title":960,"path":961,"stem":962},"MagifyConfig","/unity-sdk/api-collection/magify-manager/magifyconfig","10.Unity SDK/14.API Collection/17.Magify Manager/09.MagifyConfig",{"title":964,"path":965,"stem":966,"children":967},"Aghanim Integration","/aghanim-integration","Aghanim Integration/index",[968],{"title":964,"path":965,"stem":966},{"title":970,"path":971,"stem":970,"children":972},"App Config","/app-config",[973,975],{"title":970,"path":971,"stem":974},"App Config/index",{"title":976,"path":977,"stem":978},"App Config: Parameters, Logic, and Use Cases","/app-config/app-config-parameters-logic-and-use-cases","App Config/app-config-parameters-logic-and-use-cases",{"title":980,"path":981,"stem":982,"children":983},"App Version","/app-version","App Version/1.index",[984,985],{"title":980,"path":981,"stem":982},{"title":986,"path":987,"stem":988},"App Version: Configuration Download and Usage","/app-version/app-version-configuration-download-and-usage","App Version/app-version-configuration-download-and-usage",{"title":990,"path":991,"stem":990,"children":992},"Application Feature","/application-feature",[993,995],{"title":990,"path":991,"stem":994},"Application Feature/index",{"title":996,"path":997,"stem":998},"Segmented and A/B Test Features","/application-feature/segmented-and-ab-features","Application Feature/Segmented and AB Features",{"title":1000,"path":1001,"stem":1002,"children":1003},"Custom Event","/custom-event","Custom Event/index",[1004],{"title":1000,"path":1001,"stem":1002},{"title":1006,"path":1007,"stem":1008,"children":1009},"Native Element Group","/native-element-group","Native Element Group/index",[1010],{"title":1006,"path":1007,"stem":1008},{"title":1012,"path":1013,"stem":1014,"children":1015},"Native Element","/native-elements","Native Elements/1.index",[1016,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053,1057,1060,1064,1068,1072],{"title":1012,"path":1013,"stem":1014},{"title":1018,"path":1019,"stem":1020},"Info Product ID","/native-elements/info-product-id","Native Elements/Info Product ID",{"title":1022,"path":1023,"stem":1024},"Non-consumable Product ID","/native-elements/non-sonsumable-product-id","Native Elements/Non-сonsumable Product ID",{"title":1026,"path":1027,"stem":1028},"Banner Placement","/native-elements/banner-placement","Native Elements/banner-placement",{"title":1030,"path":1031,"stem":1032},"Bonus Product ID","/native-elements/bonus-product-id","Native Elements/bonus-product-id",{"title":1034,"path":1035,"stem":1036},"Consumable Product ID","/native-elements/consumable-product-id","Native Elements/consumable-product-id",{"title":1038,"path":1039,"stem":1040},"Cross-Promo Product ID","/native-elements/cross-promo-product-id","Native Elements/cross-promo-product-id",{"title":1042,"path":1043,"stem":1044},"Deeplink Product ID","/native-elements/deeplink-product-id","Native Elements/deeplink-product-id",{"title":1046,"path":1047,"stem":1048},"Event","/native-elements/event","Native Elements/event",{"title":1050,"path":1051,"stem":1052},"External Product ID","/native-elements/external-product-id","Native Elements/external-product-id",{"title":1054,"path":1055,"stem":1056},"Importing In-App Products from Google Play via API","/native-elements/importing-in-app-products-from-google-play-via-api","Native Elements/importing-in-app-products-from-google-play-via-api",{"title":1054,"path":1058,"stem":1059},"/native-elements/importing-in-app-products-from-google-play-via-api-new","Native Elements/importing-in-app-products-from-google-play-via-api-new",{"title":1061,"path":1062,"stem":1063},"Importing In-App Products from the App Store via API","/native-elements/importing-in-app-products-from-the-app-store-via-api","Native Elements/importing-in-app-products-from-the-app-store-via-api",{"title":1065,"path":1066,"stem":1067},"Rewarded Product ID","/native-elements/rewarded-product-id","Native Elements/rewarded-product-id",{"title":1069,"path":1070,"stem":1071},"Spot","/native-elements/spot","Native Elements/spot",{"title":1073,"path":1074,"stem":1075},"Subscription Product ID","/native-elements/subscription-product-id","Native Elements/subscription-product-id",{"title":1077,"path":1078,"stem":1079,"children":1080},"Segmentation","/segmentation","Segmentation/index",[1081],{"title":1077,"path":1078,"stem":1079},{"title":1083,"path":1084,"stem":1085,"children":1086},"UA Configurations","/ua-configurations","UA Configurations/index",[1087,1088],{"title":1083,"path":1084,"stem":1085},{"title":1089,"path":1090,"stem":1091},"UA Campaign","/ua-configurations/ua-campaign","UA Configurations/ua-campaign ",{"title":1093,"path":1094,"stem":1095},"Magify Documentation","/","index",{"body":1097},{"type":1098,"value":1099,"toc":1103},"minimark",[1100],[1101,1102],"h1",{"id":467},{"title":467,"searchDepth":1104,"depth":1104,"links":1105},2,[],[1107,1111,1115,1121,1126,1131,1134,1138,1143,1148,1150,1153,1158,1163,1168,1171,1174,1178,1183,1188,1192,1197,1202,1207,1212,1217,1222,1227,1232,1237,1242,1247,1252,1257,1260,1264,1269,1274,1279,1282,1286,1289,1293,1297,1302,1307,1312,1317,1322,1326,1331,1336,1341,1346,1351,1356,1361,1366,1369,1373,1375,1379,1384,1389,1394,1396,1400,1403,1407,1410,1414,1417,1421,1424,1429,1433,1437,1440,1444,1447,1451,1454,1459,1462,1466,1469,1473,1476,1480,1483,1487,1492,1497,1500,1504,1507,1510,1513,1517,1520,1524,1528,1531,1536,1539,1544,1549,1554,1559,1563,1566,1570,1573,1577,1580,1584,1587,1591,1594,1597,1602,1606,1611,1616,1621,1624,1628,1632,1637,1642,1647,1652,1657,1662,1667,1672,1676,1681,1686,1691,1696,1700,1705,1708,1712,1715,1719,1722,1726,1729,1734,1739,1742,1746,1749,1752,1756,1759,1763,1766,1770,1773,1777,1780,1784,1787,1791,1794,1799,1802,1806,1809,1813,1816,1820,1824,1827,1832,1837,1841,1844,1848,1851,1855,1858,1862,1865,1869,1872,1875,1879,1882,1886,1889,1893,1898,1902,1905,1909,1912,1916,1920,1923,1928,1931,1936,1941,1945,1949,1952,1955,1959,1962,1966,1969,1973,1976,1980,1983,1987,1991,1994,1998,2003,2008,2013,2018,2023,2026,2030,2034,2037,2042,2045,2049,2052,2056,2059,2063,2066,2071,2074,2078,2081,2084,2088,2091,2095,2098,2103,2106,2110,2113,2116,2120,2123,2127,2130,2135,2138,2142,2145,2148,2152,2155,2159,2162,2166,2171,2174,2178,2181,2185,2188,2192,2195,2200,2203,2207,2210,2213,2216,2220,2223,2227,2231,2234,2238,2241,2245,2248,2252,2256,2259,2262,2266,2269,2273,2276,2281,2284,2288,2291,2295,2298,2302,2305,2309,2312,2316,2319,2322,2326,2329,2333,2337,2340,2345,2350,2354,2359,2364,2369,2373,2376,2380,2383,2387,2390,2395,2400,2405,2408,2412,2415,2418,2422,2425,2429,2433,2436,2440,2444,2449,2453,2457,2460,2463,2467,2470,2474,2478,2481,2485,2488,2492,2495,2499,2503,2506,2510,2513,2517,2521,2524,2528,2531,2535,2539,2543,2547,2550,2554,2557,2561,2564,2568,2572,2575,2579,2584,2589,2594,2597,2601,2604,2608,2612,2615,2619,2624,2628,2632,2635,2640,2644,2647,2651,2654,2658,2662,2665,2670,2674,2679,2684,2687,2691,2694,2698,2701,2705,2708,2713,2716,2720,2723,2727,2731,2734,2739,2742,2746,2749,2753,2756,2760,2764,2767,2772,2775,2779,2782,2786,2789,2792,2795,2799,2803,2806,2809,2812,2816,2819,2823,2826,2830,2833,2836,2839,2843,2846,2849,2852,2857,2862,2865,2868,2871,2875,2878,2882,2885,2888,2891,2896,2900,2904,2908,2911,2914,2918,2921,2925,2929,2932,2937,2942,2945,2950,2954,2957,2960,2963,2967,2971,2976,2981,2985,2990,2995,2998,3001,3005,3008,3012,3016,3019,3023,3026,3030,3034,3037,3040,3043,3047,3050,3054,3058,3061,3066,3071,3076,3079,3083,3088,3091,3095,3098,3102,3105,3108,3111,3115,3118,3121,3124,3128,3131,3135,3139,3142,3146,3150,3153,3157,3161,3164,3167,3170,3174,3177,3181,3184,3188,3191,3194,3197,3201,3204,3208,3212,3215,3220,3223,3227,3231,3234,3238,3241,3245,3248,3252,3256,3259,3264,3268,3271,3275,3279,3282,3286,3289,3292,3296,3300,3303,3307,3310,3313,3316,3319,3323,3326,3330,3333,3336,3341,3346,3349,3353,3357,3360,3363,3366,3370,3373,3377,3381,3384,3388,3391,3395,3399,3402,3406,3409,3413,3416,3420,3423,3427,3430,3433,3436,3440,3443,3447,3451,3454,3458,3461,3465,3469,3472,3477,3481,3484,3488,3491,3495,3499,3502,3507,3510,3514,3518,3521,3524,3527,3531,3534,3538,3542,3545,3549,3552,3556,3560,3563,3566,3569,3573,3576,3580,3583,3587,3591,3594,3598,3601,3605,3608,3612,3615,3619,3622,3626,3629,3632,3636,3639,3643,3646,3651,3654,3658,3661,3665,3668,3672,3675,3679,3682,3686,3689,3693,3696,3700,3704,3707,3712,3715,3719,3723,3726,3730,3733,3737,3740,3744,3748,3751,3756,3761,3764,3768,3772,3775,3778,3781,3785,3788,3792,3796,3799,3804,3808,3813,3817,3822,3825,3830,3834,3838,3841,3845,3849,3852,3855,3858,3862,3866,3869,3874,3877,3880,3883,3887,3891,3894,3898,3901,3904,3907,3911,3915,3918,3923,3926,3929,3932,3936,3940,3945,3950,3955,3960,3965,3970,3974,3977,3980,3984,3989,3994,3999,4004,4006,4010,4015,4020,4025,4030,4033,4037,4042,4047,4052,4057,4062,4067,4072,4076,4081,4086,4091,4096,4101,4106,4110,4113,4117,4121,4125,4128,4133,4137,4141,4144,4148,4152,4157,4162,4166,4171,4175,4178,4183,4188,4193,4198,4203,4208,4213,4218,4223,4228,4233,4238,4243,4248,4251,4254,4258,4263,4268,4273,4278,4283,4288,4293,4298,4301,4305,4310,4315,4317,4320,4325,4330,4335,4340,4345,4350,4355,4359,4363,4366,4369,4373,4377,4381,4386,4389,4392,4396,4401,4406,4410,4414,4419,4424,4429,4434,4438,4441,4444,4448,4453,4458,4463,4468,4473,4478,4483,4488,4493,4497,4502,4507,4511,4514,4517,4521,4525,4530,4535,4539,4543,4548,4553,4557,4561,4564,4567,4571,4574,4580,4585,4590,4595,4600,4605,4610,4615,4620,4624,4629,4634,4638,4643,4648,4652,4655,4660,4665,4670,4675,4678,4681,4685,4690,4694,4698,4703,4708,4713,4717,4722,4727,4730,4732,4736,4741,4746,4751,4755,4759,4764,4769,4774,4779,4784,4788,4793,4797,4800,4803,4806,4810,4814,4818,4821,4825,4829,4834,4839,4841,4845,4850,4854,4858,4863,4868,4873,4878,4883,4888,4893,4896,4899,4903,4907,4912,4917,4921,4925,4928,4932,4937,4942,4947,4951,4956,4959,4963,4967,4971,4975,4978,4983,4988,4993,4998,5003,5006,5010,5014,5018,5022,5025,5030,5035,5040,5043,5047,5051,5055,5059,5062,5067,5072,5075,5079,5083,5088,5093,5098,5103,5107,5111,5116,5121,5125,5130,5135,5140,5145,5150,5154,5158,5162,5167,5172,5176,5181,5186,5190,5194,5199,5204,5209,5214,5219,5224,5228,5233,5237,5240,5244,5248,5253,5258,5263,5268,5273,5278,5283,5288,5293,5297,5301,5306,5310,5315,5320,5325,5330,5334,5339,5344,5349,5354,5359,5364,5369,5374,5379,5384,5389,5394,5398,5403,5406,5409,5412,5416,5420,5424,5428,5431,5436,5441,5444,5448,5453,5458,5462,5466,5470,5475,5480,5485,5490,5494,5497,5500,5504,5509,5514,5519,5524,5529,5534,5539,5544,5549,5554,5559,5564,5569,5574,5579,5584,5589,5594,5599,5604,5609,5614,5619,5623,5628,5633,5638,5643,5648,5653,5658,5660,5664,5669,5674,5679,5683,5688,5692,5697,5702,5707,5711,5716,5721,5726,5731,5736,5741,5746,5751,5756,5761,5764,5768,5772,5776,5780,5783,5786,5790,5795,5800,5805,5807,5812,5817,5822,5827,5832,5837,5842,5847,5852,5857,5862,5867,5872,5877,5882,5884,5889,5894,5899,5904,5909,5914,5919,5924,5927,5930,5934,5939,5944,5949,5954,5959,5964,5969,5974,5977,5980,5984,5989,5994,5999,6003,6008,6013,6018,6023,6028,6031,6034,6039,6044,6049,6052,6057,6062,6067,6072,6077,6082,6087,6092,6097,6100,6104,6109,6114,6119,6124,6129,6134,6139,6144,6149,6154,6159,6163,6168,6173,6178,6183,6188,6193,6198,6203,6207,6212,6217,6222,6227,6232,6237,6242,6247,6252,6257,6262,6267,6272,6277,6282,6286,6291,6295,6300,6305,6310,6314,6319,6323,6328,6332,6337,6342,6347,6352,6355,6358,6363,6368,6373,6378,6383,6386,6390,6395,6400,6405,6410,6415,6420,6425,6430,6433,6438,6442,6445,6448,6453,6458,6461,6465,6469,6472,6476,6481,6486,6490,6493,6498,6501,6505,6508,6512,6515,6520,6525,6530,6535,6540,6545,6550,6553,6557,6562,6567,6572,6577,6580,6584,6589,6594,6599,6604,6609,6614,6616,6619,6623,6627,6630,6634,6639,6644,6649,6654,6657,6661,6666,6671,6674,6678,6682,6687,6690,6693,6697,6702,6707,6712,6715,6719,6723,6728,6733,6738,6741,6744,6748,6752,6755,6759,6764,6769,6774,6779,6784,6789,6794,6799,6802,6806,6811,6816,6821,6826,6829,6833,6838,6843,6848,6853,6858,6863,6866,6871,6876,6881,6886,6890,6894,6899,6904,6909,6914,6919,6923,6926,6929,6934,6938,6943,6948,6953,6957,6962,6967,6970,6974,6978,6983,6988,6993,6996,7001,7004,7008,7013,7017,7020,7024,7029,7032,7036,7040,7043,7046,7050,7053,7057,7060,7064,7069,7073,7076,7080,7084,7088,7092,7095,7098,7102,7106,7109,7112,7116,7120,7123,7126,7129,7134,7138,7143,7148,7153,7158,7162,7167,7172,7177,7182,7187,7192,7197,7202,7206,7211,7216,7221,7226,7231,7236,7240,7245,7250,7255,7260,7265,7268,7273,7278,7283,7288,7293,7298,7303,7308,7312,7317,7322,7326,7331,7336,7339,7344,7349,7352,7356,7361,7366,7371,7376,7381,7386,7391,7396,7401,7404,7407,7412,7417,7422,7426,7429,7434,7439,7443,7448,7452,7457,7462,7467,7470,7475,7480,7483,7486,7490,7494,7499,7504,7509,7514,7518,7522,7526,7531,7536,7539,7543,7548,7553,7558,7561,7565,7569,7573,7578,7582,7587,7591,7596,7599,7603,7607,7610,7615,7620,7625,7628,7633,7638,7643,7646,7651,7656,7661,7664,7668,7673,7678,7683,7688,7693,7698,7703,7707,7712,7715,7719,7722,7727,7731,7735,7740,7744,7748,7753,7758,7763,7768,7773,7777,7781,7786,7790,7793,7797,7801,7806,7811,7816,7821,7824,7828,7831,7836,7840,7843,7847,7850,7855,7860,7865,7868,7872,7875,7879,7883,7888,7893,7896,7900,7903,7907,7911,7915,7919,7922,7927,7932,7936,7941,7944,7948,7952,7956,7961,7966,7971,7976,7981,7986,7991,7994,7998,8001,8005,8010,8013,8017,8021,8026,8031,8036,8040,8045,8048,8051,8055,8059,8064,8069,8074,8077,8082,8087,8092,8097,8101,8106,8111,8116,8121,8124,8129,8134,8139,8144,8148,8151,8154,8159,8162,8167,8170,8175,8178,8182,8185,8190,8193,8196,8201,8206,8211,8216,8221,8224,8227,8232,8237,8242,8247,8252,8257,8262,8267,8272,8275,8279,8284,8289,8294,8299,8304,8309,8314,8319,8322,8326,8329,8332,8337,8342,8347,8352,8355,8360,8365,8369,8374,8379,8384,8388,8393,8398,8403,8407,8412,8417,8422,8425,8428,8432,8437,8442,8447,8452,8457,8462,8467,8472,8477,8482,8487,8490,8494,8499,8504,8509,8514,8517,8521,8526,8530,8533,8537,8542,8545,8549,8553,8556,8560,8564,8569,8574,8579,8584,8589,8592,8597,8602,8607,8612,8616,8621,8626,8631,8634,8639,8644,8649,8654,8659,8664,8669,8674,8677,8681,8685,8690,8695,8699,8703,8707,8712,8716,8719,8722,8726,8731,8736,8741,8744,8748,8753,8758,8762,8767,8770,8774,8777,8781,8784,8788,8791,8795,8798,8802,8805,8809,8813,8816,8820,8825,8828,8831,8835,8840,8843,8847,8851,8856,8861,8866,8871,8876,8879,8883,8886,8891,8894,8899,8902,8906,8909,8912,8915,8919,8924,8929,8934,8937,8940,8944,8949,8954,8959,8962,8966,8971,8974,8978,8982,8987,8992,8995,8999,9004,9009,9014,9019,9024,9029,9034,9039,9044,9047,9050,9054,9058,9063,9068,9073,9077,9082,9087,9090,9094,9098,9102,9107,9111,9116,9120,9124,9128,9132,9136,9140,9145,9148,9152,9157,9162,9167,9172,9175,9178,9182,9187,9191,9196,9201,9204,9207,9211,9216,9221,9224,9228,9232,9235,9239,9242,9245,9249,9252,9256,9261,9266,9271,9276,9279,9283,9287,9292,9296,9301,9306,9311,9316,9320,9324,9328,9333,9336,9341,9346,9351,9356,9360,9364,9368,9373,9377,9381,9385,9389,9394,9399,9404,9409,9413,9418,9422,9425,9429,9434,9438,9443,9448,9453,9457,9461,9466,9471,9476,9481,9486,9490,9495,9499,9504,9508,9512,9517,9522,9527,9532,9536,9541,9545,9550,9555,9560,9565,9570,9575,9578,9583,9588,9593,9598,9603,9608,9613,9618,9623,9628,9633,9638,9643,9648,9653,9658,9663,9668,9673,9678,9683,9688,9692,9696,9701,9706,9711,9716,9719,9724,9728,9733,9738,9743,9746,9751,9755,9759,9764,9769,9774,9778,9782,9786,9789,9793,9798,9802,9806,9810,9814,9818,9822,9826,9830,9834,9839,9842,9846,9851,9856,9861,9865,9870,9875,9879,9884,9889,9894,9897,9901,9906,9911,9916,9919,9923,9928,9932,9937,9941,9946,9949,9952,9956,9960,9964,9968,9971,9975,9979,9984,9989,9994,9999,10004,10008,10011,10015,10018,10022,10027,10030,10035,10040,10045,10050,10055,10060,10063,10067,10070,10075,10080,10085,10090,10095,10099,10104,10109,10114,10118,10123,10128,10132,10136,10140,10144,10148,10152,10156,10161,10166,10171,10176,10181,10186,10190,10194,10199,10204,10209,10211,10215,10220,10224,10229,10234,10238,10242,10247,10252,10257,10261,10266,10271,10276,10280,10285,10290,10295,10300,10305,10310,10315,10320,10325,10330,10335,10339,10344,10349,10354,10359,10364,10367,10371,10376,10381,10386,10391,10396,10401,10406,10410,10415,10420,10425,10430,10435,10440,10445,10450,10455,10460,10465,10468,10471,10476,10481,10486,10491,10496,10500,10503,10507,10511,10515,10520,10525,10530,10535,10540,10545,10550,10555,10560,10565,10570,10575,10579,10584,10589,10594,10599,10603,10607,10612,10616,10621,10624,10628,10633,10638,10643,10646,10650,10655,10659,10664,10669,10674,10679,10684,10689,10694,10699,10702,10706,10711,10716,10721,10726,10731,10736,10741,10744,10749,10753,10758,10763,10768,10773,10778,10783,10788,10793,10798,10803,10807,10810,10815,10820,10825,10830,10833,10838,10843,10848,10853,10858,10862,10866,10871,10876,10880,10885,10890,10894,10897,10901,10905,10909,10913,10918,10923,10928,10933,10938,10941,10945,10950,10955,10959,10962,10966,10970,10974,10978,10983,10988,10991,10996,11000,11004,11007,11011,11014,11018,11022,11026,11030,11034,11038,11042,11045,11049,11052,11056,11060,11064,11069,11073,11077,11080,11084,11087,11091,11095,11099,11104,11108,11112,11115,11119,11124,11128,11132,11135,11139,11142,11146,11150,11154,11159,11163,11167,11170,11174,11179,11184,11189,11194,11199,11202,11207,11212,11217,11222,11227,11232,11237,11242,11246,11251,11256,11261,11263,11266,11269,11272,11275,11278,11281,11284,11287,11290,11293,11296,11299,11302,11305,11309,11312,11315,11318,11321,11324,11328,11333,11336,11339,11342,11345,11349,11354,11359,11364,11369,11373,11378,11382,11386,11390,11393,11398,11402,11406,11410,11415,11419,11423,11427,11431,11435,11440,11444,11448,11451,11455,11460,11464,11468,11471,11476,11480,11484,11488,11493,11497,11501,11505,11509,11513,11517,11522,11526,11530,11533,11537,11542,11547,11552,11557,11562,11567,11571,11576,11581,11586,11590,11595,11600,11605,11610,11615,11620,11625,11630,11635,11640,11644,11649,11654,11658,11662,11666,11671,11675,11680,11684,11689,11694,11699,11703,11708,11713,11718,11723,11728,11733,11738,11743,11747,11752,11757,11762,11767,11772,11776,11780,11784,11789,11794,11799,11804,11809,11813,11818,11823,11828,11833,11837,11841,11846,11851,11856,11861,11866,11870,11874,11878,11882,11886,11891,11895,11900,11904,11909,11914,11918,11923,11926,11931,11936,11941,11946,11950,11955,11960,11965,11969,11973,11978,11983,11988,11993,11998,12003,12008,12013,12016,12021,12025,12028,12032,12037,12042,12046,12050,12054,12058,12063,12068,12073,12078,12082,12085,12090,12095,12100,12105,12110,12115,12120,12125,12130,12135,12140,12145,12150,12154,12158,12163,12168,12173,12177],{"id":14,"title":13,"titles":1108,"content":1109,"level":1110},[],"Welcome to Magify! This guide will walk you through the process of registering a new account, setting up your organization, and inviting teammates to collaborate",1,{"id":1112,"title":467,"titles":1113,"content":1114,"level":1110},"/what-is-magify/getting-started#",[],"Welcome to Magify! This guide will walk you through the process of registering a new account, setting up your organization, and inviting teammates to collaborate.",{"id":1116,"title":1117,"titles":1118,"content":1119,"level":1120},"/what-is-magify/getting-started#_1-creating-a-new-account","1. Creating a New Account",[467],"To start using Magify, follow these steps: Go to the Magify Registration Page – Visit hereEnter Your Details – Provide your name, email address, create a password, and agree to the terms of service.Verify Your Email – Check your inbox for a verification email and click the confirmation link.Login – Use your credentials to sign in to Magify or Google Auth.",3,{"id":1122,"title":1123,"titles":1124,"content":1125,"level":1120},"/what-is-magify/getting-started#_2-setting-up-your-organization","2. Setting Up Your Organization",[467],"Once you've signed up, it's time to configure your organization: Create a New Organization – Enter your organization's name, website, and your position.Add Organization Details – Fill in key information, such as company size and primary contact details.Add Teammates – You can invite your colleagues and assign them access levels.Confirm Setup – Review your information and complete the setup process.",{"id":1127,"title":1128,"titles":1129,"content":1130,"level":1120},"/what-is-magify/getting-started#_3-next-steps","3. Next Steps",[467],"Now that your organization is set up, the next step is to add your first application to Magify. This will allow you to start tracking performance, analyzing player behavior, and leveraging LiveOps tools for optimization... Follow our guide on Adding Your First Application to get started! Need help? Visit our Support Center or reach out to our team.",{"id":6,"title":10,"titles":1132,"content":1133,"level":1110},[],"This article explains how Magify helps gaming studios leverage analytics to improve player retention, optimize monetization, and enhance overall game performance.",{"id":1135,"title":467,"titles":1136,"content":1137,"level":1110},"/what-is-magify#",[],"Magify is an advanced analytics platform designed specifically for gaming studios. It provides powerful tools to help developers, product managers, and LiveOps teams make data-driven decisions that enhance player retention, optimize monetization, and improve overall game performance. Your journey to unlocking your app's growth and maximizing LTV starts here. Magify is a platform for game developers & publishers designed to manage and scale mobile games revenues by combining analytics and LiveOps.",{"id":1139,"title":1140,"titles":1141,"content":1142,"level":1104},"/what-is-magify#key-features","Key Features",[467],"1. Comprehensive Analytics Magify collects and processes real-time data from your game, presenting clear and actionable insights that help you understand player behavior, engagement trends, and monetization patterns. It also includes user acquisition (UA) analytics, allowing you to track campaign performance, measure key marketing metrics, and optimize spend efficiency. Additionally, Magify provides predictive models for Return on Ad Spend (ROAS), enabling studios to forecast revenue potential and make informed budgeting decisions. 2. User-Friendly Dashboard The platform offers an intuitive dashboard where teams can access key performance metrics, set custom KPIs, and track game performance over time. 3. Retention & Monetization Optimization With predictive analytics and A/B testing capabilities, Magify helps studios fine-tune retention strategies and maximize revenue through data-backed decisions. 4. Segmentation Magify includes powerful segmentation tools, enabling developers to create targeted player groups for personalized experiences and marketing strategies. 5. Remote Configurations With remote configuration capabilities, Magify allows studios to make real-time adjustments to game settings without requiring app updates, ensuring a dynamic and responsive gaming experience. 6. LiveOps Magify includes LiveOps tools that allow studios to test and deploy in-game events, promotions, and content updates dynamically, ensuring a personalized experience for players. 7. Payment Validation Magify provides robust payment validation features to secure in-game transactions, prevent fraud, and maintain revenue integrity. 8. GDPR Compliance Magify offers built-in GDPR compliance tools, helping studios manage user data securely, adhere to regulatory requirements, and maintain users profiles.",{"id":1144,"title":1145,"titles":1146,"content":1147,"level":1104},"/what-is-magify#why-choose-magify","Why Choose Magify?",[467],"For Studios of Any Size – Whether you’re an indie developer or a large gaming company, Magify adapts to your needs. Cost-Effective – Provides deep analytics & LiveOps with minimal operational costs (Pay as you go).Real Data, Clear Metrics – No guesswork, just accurate and reliable data-driven insights.Unlock the True Potential of LTV - A personalized approach to monetization and game balance. On this website, you'll discover how to get started with our platform in just a few simple steps. Magify is here to help you scale smarter and faster. Magify is your trusted partner in making successful games through data. Start optimizing your game’s performance today with Magify! Let’s Getting started",{"id":25,"title":24,"titles":1149,"content":467,"level":1110},[],{"id":1151,"title":467,"titles":1152,"content":467,"level":1110},"/create-new-application/application-version-verification#",[],{"id":1154,"title":1155,"titles":1156,"content":1157,"level":1120},"/create-new-application/application-version-verification#version-management-published-at-and-is-verified-fields","Version Management: \"Published at\" and \"Is Verified\" Fields",[467],"This section explains the purpose and functionality of the \"Published at\" and \"Is verified\" fields in version management within the Application section, as well as their impact on reporting and dashboards. When an application version is released to the app store, it can be verified. You can use this feature to view version release date data in reports and dashboards. Navigate to the Application section > locate and open the application > go to the Version subsection > expand the required version..",{"id":1159,"title":1160,"titles":1161,"content":1162,"level":1120},"/create-new-application/application-version-verification#published-at","Published at",[467],"The \"Published at\" field records the version's publication date. When a version is added manually, this field is automatically populated with the date of its addition.If the version is released to the app store at a later date, update this field to reflect the actual release date.This ensures that reports and dashboards display accurate data about when the version became available to users.",{"id":1164,"title":1165,"titles":1166,"content":1167,"level":1120},"/create-new-application/application-version-verification#is-verified","Is verified",[467],"This checkbox confirms the verification of the version. It is required for rendering the version's start date on reports and dashboards.When enabled, a dotted line appears on dashboards, indicating the date when the version became active for real users. Example: Dashboard with the \"Published at\" Line The dashboard displays a dotted line representing the \"Published at\" date.",{"id":29,"title":28,"titles":1169,"content":1170,"level":1110},[],"If you need to withdraw an application from sale, navigate to the Application section, locate and open the application. Check the Withdrawn from Sale box if the application is no longer available for purchase in app stores. This change will modify the application's behavior in the system as follows: URL Schemas: The application's URL schema will no longer be included in responses to the get URL schemas API request.Campaign Visibility:In the Application list for campaign creation, applications with Withdraw from sale = true will not be displayed.In cross-promotion campaigns, applications with Withdraw from sale (= true) will not appear in the Promoted application list. NoteYou cannot set Withdraw from sale (= true) if there are any active cross-promo campaigns (statuses: running, paused, or draft) associated with the application.To enable withdrawal:Change the status of all related cross-promotion campaigns to archived.Once the campaigns are archived, you can set Withdraw from sale (= true)",{"id":18,"title":17,"titles":1172,"content":1173,"level":1110},[],"This article explains how to create an application in the system and provides a detailed guide on each field.",{"id":1175,"title":467,"titles":1176,"content":1177,"level":1110},"/create-new-application#",[],"Creating an application in the system is an essential step for managing, scaling, and optimizing revenue from mobile games or applications. You can add your application through the onboarding process (read the Quick Start Guide), or you can access the application creation form directly from the main dashboard.",{"id":1179,"title":1180,"titles":1181,"content":1182,"level":1104},"/create-new-application#step-1-navigate-to-the-application-creation-page","Step 1: Navigate to the Application Creation Page",[467],"Log in to your Magify account at board.magify.com.In the menu or on the main page, click Add Application. Or go to the Configuration > Application section from the main menu and click Add Application.",{"id":1184,"title":1185,"titles":1186,"content":1187,"level":1104},"/create-new-application#step-2-fill-out-the-required-fields","Step 2: Fill Out the Required Fields",[467],"On the application creation page, you'll see several fields to complete. Fields marked with a red asterisk (*) are mandatory.",{"id":1189,"title":1190,"titles":1191,"content":467,"level":1104},"/create-new-application#details-section","Details Section",[467],{"id":1193,"title":1194,"titles":1195,"content":1196,"level":1120},"/create-new-application#_1-short-name","1. Short Name",[467,1190],"Short Name is a unique application identifier used by the client. It is essential for system configuration and must be entered correctly. Once saved, it cannot be changed. Ensure the Short Name matches the name in the code, as mismatches will prevent the client from receiving the correct configuration, even if it is available in the admin panel. Enter a short name for the application. Allowed characters: letters (a-z, A-Z), numbers (0-9), spaces, and underscores (_).Recommendation: Use lowercase letters and append the platform identifier as a suffix. Examples of Short Names: demo gpdemo ios Recommendations for Removing Unused Applications or requires a new Short NameIf the application is no longer in use or requires a new Short Name, follow these steps:Remove all associated parameters from the application card, including:\nBundle IDStore LinkStore IDThis will prevent issues with data synchronization from grabbers, which may fail to link to the current application if outdated parameters remain.",{"id":1198,"title":1199,"titles":1200,"content":1201,"level":1120},"/create-new-application#_2-name","2. Name",[467,1190],"The Name field is used to specify the application name for the admin panel. The Name field can be changed after saving the application card, but this is rarely necessary. Allowed characters: letters (a-z, A-Z), numbers (0-9), spaces, and underscores (_).Recommendation: Format the Name in uppercase letters and include a platform prefix for iOS applications. Examples of Names: Demo (without the \"GP\" (Google Play) suffix for Android applications)Demo iOS",{"id":1203,"title":1204,"titles":1205,"content":1206,"level":1120},"/create-new-application#_4-platform","4. Platform",[467,1190],"Choose between iOS or AndroidThis field can be auto-filled from the Store link.",{"id":1208,"title":1209,"titles":1210,"content":1211,"level":1120},"/create-new-application#_5-store-link","5. Store Link",[467,1190],"The Store link is the application’s URL in the app store. It is used to identify data from advertising networks. If the store link is not yet available, you can temporarily use a placeholder link, such as https://test.com/.Do not use links from other applications as placeholders. NotesMake sure to update the store link to the correct URL as soon as it becomes available.Under no circumstances should a temporary link be reused from an active application.",{"id":1213,"title":1214,"titles":1215,"content":1216,"level":1120},"/create-new-application#_6-store-id","6. Store ID",[467,1190],"The Store ID is used to identify data from advertising networks. For iOS applications, the Store ID can be found in App Store Connect or extracted from the application’s store link. NotesThe Store ID is not the same as the Bundle ID for iOS applications. For Android applications, duplicate the value of the Bundle ID in this field.",{"id":1218,"title":1219,"titles":1220,"content":1221,"level":1120},"/create-new-application#_7-bundle-id","7. Bundle ID",[467,1190],"The Bundle ID is a unique application identifier used to identify data from advertising networks. For iOS applications, the Bundle ID is available in App Store Connect.For Android applications, the Bundle ID is derived from the application’s package name. NotesThe Bundle ID should not contain http:// or any other URL format.",{"id":1223,"title":1224,"titles":1225,"content":1226,"level":1120},"/create-new-application#_8-package-name","8. Package Name",[467,1190],"A Package Name is a unique identifier for a mobile application used by Google Play Store (Android) and Apple App Store (iOS) to distinguish apps. On Android, it follows a reverse domain format (e.g., com.companyname.appname).On iOS, a similar identifier is called Bundle ID.",{"id":1228,"title":1229,"titles":1230,"content":1231,"level":1120},"/create-new-application#_9-development-stage","9. Development Stage",[467,1190],"Development Stage is a field used to indicate the current phase of an application's development.",{"id":1233,"title":1234,"titles":1235,"content":1236,"level":1120},"/create-new-application#_10-application-genre","10. Application Genre",[467,1190],"Select the genre that best represents your application.",{"id":1238,"title":1239,"titles":1240,"content":1241,"level":1120},"/create-new-application#_11-mmp-model","11. MMP Model",[467,1190],"Choose between the available options: AppsflyerAdjust When selecting Adjust as the MMP Model, an additional mandatory field, Adjust media source ID, becomes available. This field requires the unique media source identifier for the cross-promotion application used in Adjust. If cross-promotion tracking is not required, temporarily enter any placeholder value.",{"id":1243,"title":1244,"titles":1245,"content":1246,"level":1120},"/create-new-application#steps-for-setting-up-cross-promotion-tracking","Steps for Setting Up Cross-Promotion Tracking",[467,1190],"If you plan to use cross-promotion, follow these steps to create a tracker for Adjust: Navigate to Adjust > Campaign Lab > Custom Link > + New Link.Name the link (e.g., \"Cross Promo\") or use any name that is clear and relevant for cross-promotion tracking.Configure the attribution settings for the link.Copy the Link Token from the created tracker and enter it into the Adjust media source ID field in Magify.",{"id":1248,"title":1249,"titles":1250,"content":1251,"level":1104},"/create-new-application#step-3-save-your-application","Step 3: Save Your Application",[467],"Click the Save button in the bottom-right corner of the screen to finalize the application creation.",{"id":1253,"title":1254,"titles":1255,"content":1256,"level":1104},"/create-new-application#next-steps-magify-basic-integration-setup","Next Steps: Magify Basic Integration Setup",[467],"Now that you have added your first application, the next step is to proceed with the Magify Basic Integration Setup. Refer to our Magify Basic Integration Setup to begin the process. For assistance, visit our Support Center or contact our team.",{"id":33,"title":32,"titles":1258,"content":1259,"level":1110},[],"This article explains how to sync UA spend in Magify to track marketing efficiency and optimize ad budgets through automatic cost tracking.",{"id":1261,"title":467,"titles":1262,"content":1263,"level":1110},"/magify-basic-integration-setup#",[],"Setting up Magify Basic Integration is essential for unlocking powerful analytics and monetization insights for your game. This guide walks you through the step-by-step process of configuring data grabbers via the web interface and integrating the Magify SDK to ensure you capture all the key data points necessary for deep analytics, A/B testing, and further in LiveOps (remote configs, segmentation, monetization strategies).",{"id":1265,"title":1266,"titles":1267,"content":1268,"level":1104},"/magify-basic-integration-setup#why-collecting-multiple-data-sources-matters","Why Collecting Multiple Data Sources Matters",[467],"To make informed decisions and maximize your game’s performance, it’s crucial to gather comprehensive data from multiple sources.",{"id":1270,"title":1271,"titles":1272,"content":1273,"level":1120},"/magify-basic-integration-setup#key-data-sources-for-effective-analytics","Key Data Sources for Effective Analytics",[467,1266],"🔹 MMPs (Mobile Measurement Partners) – Provide attribution data, helping track user acquisition (UA) effectiveness across traffic sources, campaigns, and creatives. 🔹 UA Networks – Deliver insights into user acquisition costs, allowing you to evaluate ROI and optimize marketing spend. 🔹 Ad Networks – Offer granular data on ad revenue per user, helping identify the most valuable audiences. 🔹 Ads Mediation Platforms – Supply data on waterfall performance and overall ad revenue, ensuring your monetization strategy is optimized. By integrating all these data sources, Magify enables studios to gain a full picture of player behavior, optimize user acquisition strategies, and maximize revenue streams. Once your Basic integration is complete, you will gain end-to-end analytics and user-level insights into monetization and product performance. Explore Magify's dashboards and reports to start making data-driven decisions.",{"id":1275,"title":1276,"titles":1277,"content":1278,"level":1120},"/magify-basic-integration-setup#dashboards-and-reports-available-with-basic-sdk-integration","Dashboards and Reports Available with Basic SDK Integration",[467,1266],"Once the basic integration is complete, you'll gain access to several key dashboards and reports within the Magify platform. Below is a list of available analytics tools along with SDK requirements for each: Dashboard / ReportStatus with Basic SDKNotesRetention Report✅ Fully supportedNo additional SDK features required.Active Users Report⚠️ Limited supportOnly main metric (Active Users) works. Other metrics need Advanced SDK.Ads Monetization Report and Dashboard✅ Fully supportedBuilt on ad grabber data + SDK events (impressions, clicks).Installs MMP Report✅ Fully supportedRequires data from MMP grabbers like Adjust, Appsflyer.Daily Marketing Profit & Loss Report✅ Fully supportedRevenue is ad-based only (from monetization grabbers). No IAP yet.",{"id":45,"title":44,"titles":1280,"content":1281,"level":1110},[],"This article explains how to integrate a Mobile Measurement Partner (MMP) to track user acquisition, installs, and campaign performance in Magify.",{"id":1283,"title":467,"titles":1284,"content":1285,"level":1110},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp#",[],"Integrate your Mobile Measurement Partner (MMP) to track user acquisition, installs, and campaign performance. Supported MMPs: Adjust, Appsflyer, etcNavigate to Integrations > MMP GrabbersEnter your API credentials and enable data synchronization",{"id":51,"title":50,"titles":1287,"content":1288,"level":1110},[],"Step-by-step guide to setting up a Adjust grabber in Magify This guide explains how to set up an Adjust data grabber in the Magify analytics system. The grabber enables automated import of ad asset data, geo performance, and other account-level metrics into your analytics pipeline.",{"id":1290,"title":13,"titles":1291,"content":1292,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#getting-started",[50],"Navigate to: Configurations > Integration > MMP Grabbers and select Adjust from the list.Click the Add Grabber button to create a new data source.A configuration form will open. This form is used to configure the integration with Adjust, including linking to an organization and providing access credentials for Amazon S3 storage.",{"id":1294,"title":1295,"titles":1296,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#general-settings","General Settings",[50],{"id":1298,"title":1299,"titles":1300,"content":1301,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#form-overview","Form Overview",[50,1295],"Top Section – general connection parameters: integration name, organization, AWS credentials.Grabbers Section – list of individual Adjust applications for which data should be collected. Each field in the form is described below.",{"id":1303,"title":1304,"titles":1305,"content":1306,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#name","Name",[50,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Adjust Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1308,"title":1309,"titles":1310,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#organization","Organization",[50,1295],"Select your organization from the dropdown list.",{"id":1313,"title":1314,"titles":1315,"content":1316,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#aws-access-parameters","AWS Access Parameters",[50,1295],"These parameters are used by Adjust to upload exported data to your S3 bucket. Important: Write access is required to place files into the bucket, so the provided key must have write permissions. The Magify grabber acts as the data consumer and only requires read-only access to retrieve these files. AWS Access Key — Access Key ID with write access to the S3 bucket (used by Adjust to upload data).AWS Secret Key — Corresponding Secret Access Key. Ensure it is copied exactly.Bucket Name — Exact name of the S3 bucket configured in Adjust (e.g., my-adjust-bucket).Region Name — AWS region code where the bucket is located (e.g., eu-west-1). Note: All values can be found in your AWS dashboard. Contact us if you don't have S3 storage available.",{"id":1318,"title":1319,"titles":1320,"content":1321,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#grabbers-section","Grabbers Section",[50],"This section allows you to configure individual Adjust applications. For each application, add a new grabber with the following fields:",{"id":1323,"title":1304,"titles":1324,"content":1325,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#name-1",[50,1319],"Name of the grabber for this specific application (e.g., App X iOS, App X Android).",{"id":1327,"title":1328,"titles":1329,"content":1330,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#application","Application",[50,1319],"Select the corresponding application from the list. It must already be integrated with Adjust and added to Magify.",{"id":1332,"title":1333,"titles":1334,"content":1335,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#app-token","App Token",[50,1319],"Unique identifier of the application in Adjust (e.g., abc123xyz...). How to find it: Log in to your Adjust account.Navigate to AppView > All Apps.Locate the desired application.Copy the App Token shown next to the app name. Alternatively: Go to the App Information section of the application.Find and copy the App Token field displayed there",{"id":1337,"title":1338,"titles":1339,"content":1340,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#is-enabled","Is Enabled",[50,1319],"Enable this option to start collecting data immediately. If left unchecked, the configuration is saved but inactive. You can add multiple applications by clicking + Add Grabbers and repeating the above fields.",{"id":1342,"title":1343,"titles":1344,"content":1345,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#saving-the-configuration","Saving the Configuration",[50,1319],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will begin collecting data from Adjust based on the configured schedule.",{"id":1347,"title":1348,"titles":1349,"content":1350,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#additional-configuration-in-adjust","Additional Configuration in Adjust",[50],"The configuration above applies to the setup in Magify. However, to ensure the grabber functions correctly, additional settings must also be applied in your Adjust account.",{"id":1352,"title":1353,"titles":1354,"content":1355,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#storage-settings","Storage settings",[50,1348],"Click on the application name in Adjust.Go to the Data Management tab.In the Cloud Storage Upload section, click Configure. Choose one of the following options:\nNew Setup – for the first application.Copy Settings from an Existing App — for subsequent applications. Set the Storage Provider to Amazon S3and enter:\nAccess Key ID – Same as the AWS Access Key above.Secret Access Key – Corresponding secret key.Bucket Name – Must match the one used in Magify. Note: These values are all located in your AWS dashboard. Contact us if you don't have S3 storage available.",{"id":1357,"title":1358,"titles":1359,"content":1360,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#sending-data-settings","Sending Data Settings",[50,1348],"In this section, you need to configure the data export mode and select the event triggers. Set Export Data to Live to enable real-time exports. (Use \"Pause\" to temporarily disable exports.)Select activity types to export as event triggers.",{"id":1362,"title":1363,"titles":1364,"content":1365,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#format-your-csv-data","Format your CSV Data",[50,1348],"In this section, you need to define how the exported data will be structured in the CSV file. Each line you add creates a separate column in the file. You must add the following placeholders: For iOS Applications {activity_kind}, {adgroup_name}, {app_name}, {app_version}, {app_version_short}, {campaign_name}, {click_time}, {cost_amount}, {cost_currency}, {cost_type}, {country}, {created_at}, {creative_name}, {event_name}, {impression_time}, {installed_at}, {is_organic}, {language}, {network_name}, {os_name}, {sdk_version}, {publisher_parameters}, {device_name}, {device_type}, {google_ads_keyword}, {tracker_name}, {label}, {adid}, {reattributed_at}, {reinstalled_at}, {os_version}, {attribution_updated_at}, {sk_ts}, {sk_payload}, {sk_version}, {sk_network_id}, {sk_campaign_id}, {sk_transaction_id}, {sk_app_id}, {sk_attribution_signature}, {sk_invalid_signature}, {sk_redownload}, {sk_fidelity_type}, {sk_source_app_id}, {sk_conversion_value}, {sk_did_win}, {partner}, {gclid}, {gbraid}, {dcp_wbraid}, {idfa}, {reftag}, {reftags} For Android Applications {activity_kind}, {adgroup_name}, {app_name}, {app_version}, {app_version_short}, {campaign_name}, {click_time}, {cost_amount}, {cost_currency}, {cost_type}, {country}, {created_at}, {creative_name}, {event_name}, {impression_time}, {installed_at}, {is_organic}, {language}, {network_name}, {os_name}, {sdk_version}, {publisher_parameters}, {device_name}, {device_type}, {google_ads_keyword}, {tracker_name}, {label}, {adid}, {fb_install_referrer}, {fb_install_referrer_ad_id}, {fb_install_referrer_adgroup_id}, {fb_install_referrer_adgroup_name}, {fb_install_referrer_campaign_id}, {fb_install_referrer_campaign_name}, {fb_install_referrer_campaign_group_id}, {fb_install_referrer_campaign_group_name}, {fb_install_referrer_ad_objective_name}, {reattributed_at}, {reinstalled_at}, {os_version}, {attribution_updated_at}, {gclid}, {gbraid}, {dcp_wbraid}, {idfa}, {reftag}, {reftags}, {gps_adid} Click Save & Apply to confirm the settings.",{"id":1367,"title":467,"titles":1368,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#",[50,1348],{"id":1370,"title":467,"titles":1371,"content":1372,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/adjust#_1",[50,1348],"By default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":55,"title":54,"titles":1374,"content":467,"level":1110},[],{"id":1376,"title":1377,"titles":1378,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/appsflyer#setting-up-appsflyer-data-locker-integration","Setting Up AppsFlyer Data Locker Integration",[54],{"id":1380,"title":1381,"titles":1382,"content":1383,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/appsflyer#step-1-appsflyer-data-locker-setup","Step 1. AppsFlyer Data Locker Setup",[54],"Permissions The setup must be performed by an admin user. Create a Data Locker Connection. Navigate to AppsFlyer → Export → Data Locker.Click Add Connection and name your connection. Select AWS S3 Cloud Service from the options. Enter your AWS S3 bucket name: The bucket name must start with the prefix *_af-datalocker-_* (this prefix must be entered manually).Click Test Connection and ensure no error message about an invalid bucket path appears. If the test is successful, click Save.",{"id":1385,"title":1386,"titles":1387,"content":1388,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/appsflyer#step-2-configure-report-output-settings-set-the-following-configurations","Step 2. Configure Report Output Settings Set the following configurations:",[54],"Folder Structure: Unified Folder StructureFile Output Format: CSVCompression: GZIP CompressionMax Rows: 100,000Expected Path: Hourly Select All for Apps, Media Sources, and Fields. Choose the specific reports you want to upload. Save the connection: Click Save Connection to complete the setup.",{"id":1390,"title":1391,"titles":1392,"content":1393,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/mmp/appsflyer#step-3-magify-integration-setup","Step 3. Magify Integration Setup",[54],"Navigate to Magify → Integration → MMP Grabbers → AppsFlyer.Click Add AppsFlyer Grabber.Fill in the Required Information. Enter the following details from the previous AppsFlyer setup: Connection NameBucket PrefixEnter your AWS Access Key and Bucket Secret. Select the File Format: сhoose between CSV or Parquet. Add the necessary grabber types corresponding to the previously selected report types:Installs Af Data Locker GrabberIn Apps Af Data Locker GrabberImpressions Af Data Locker GrabberClicks GrabberSessions Af Data Locker Grabber Click Save to finalize the integration. By default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":39,"title":38,"titles":1395,"content":1259,"level":1110},[],{"id":1397,"title":467,"titles":1398,"content":1399,"level":1110},"/magify-basic-integration-setup/step-1-configure-data-grabbers#",[],"Magify allows you to set up various data grabbers directly through the web interface. These grabbers will collect and process data from external sources to provide you with comprehensive reports. You can set up the following data grabbers: MMP (Mobile Measurement Partner) IntegrationUser Acquisition (UA) Cost TrackingAds Mediation DataAds Monetization Data",{"id":59,"title":58,"titles":1401,"content":1402,"level":1110},[],"This article explains how to set up User Acquisition (UA) Cost Tracking to sync ad spend, measure marketing efficiency, and optimize budgets automatically.",{"id":1404,"title":467,"titles":1405,"content":1406,"level":1110},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking#",[],"Sync your UA spend to measure marketing efficiency and optimize ad budgets. Navigate to Integrations > UA GrabbersConnect supported ad platforms (Facebook Ads, Google Ads, Unity Ads, etc.)Set up automatic cost tracking",{"id":65,"title":64,"titles":1408,"content":1409,"level":1110},[],"Step-by-step guide for integrating the Aarki grabber in Magify This guide explains how to set up the Aarki UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Aarki account into your analytics pipeline.",{"id":1411,"title":13,"titles":1412,"content":1413,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki#getting-started",[64],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Aarki in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Aarki account by providing the required Access Token and a name for the integration. Each field in the form is described below.",{"id":1415,"title":1295,"titles":1416,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki#general-settings",[64],{"id":1418,"title":1304,"titles":1419,"content":1420,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki#name",[64,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Aarki Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1422,"title":1309,"titles":1423,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki#organization",[64,1295],{"id":1425,"title":1426,"titles":1427,"content":1428,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki#access-token","Access Token",[64,1295],"The Access Token, also referred to as the Account Token, is required to authenticate and access reporting data from Aarki via their API. How to obtain it: To receive your Access Token, contact your Aarki account manager. Tokens are issued individually and are not available directly in the dashboard interface.",{"id":1430,"title":1338,"titles":1431,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki#is-enabled",[64,1295],"Enable this option to start collecting data immediately. If left unchecked, the configuration is saved but inactive.",{"id":1434,"title":1343,"titles":1435,"content":1436,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aarki#saving-the-configuration",[64],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Aarki according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":69,"title":68,"titles":1438,"content":1439,"level":1110},[],"Step-by-step guide for integrating the Adjoe grabber in Magify This guide explains how to set up the Adjoe UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Adjoe account into your analytics pipeline.",{"id":1441,"title":13,"titles":1442,"content":1443,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe#getting-started",[68],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Adjoe in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Adjoe account by providing the required credentials (API Token) and a custom integration name. Each field in the form is described below.",{"id":1445,"title":1295,"titles":1446,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe#general-settings",[68],{"id":1448,"title":1304,"titles":1449,"content":1450,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe#name",[68,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Adjoe Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1452,"title":1309,"titles":1453,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe#organization",[68,1295],{"id":1455,"title":1456,"titles":1457,"content":1458,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe#api-token","API Token",[68,1295],"The API Token is required to authenticate access to your Adjoe advertising data, including performance metrics and campaign insights. How to find it: Log in to your Adjoe for Advertisers dashboard.In the left-hand menu, go to Advertisers. From the list, select the advertiser entity you want to connect. Scroll down to the API token field. Paste this token into the Magify interface when setting up the UA grabber for Adjoe.",{"id":1460,"title":1338,"titles":1461,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe#is-enabled",[68,1295],{"id":1463,"title":1343,"titles":1464,"content":1465,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjoe#saving-the-configuration",[68],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Adjoe according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":73,"title":72,"titles":1467,"content":1468,"level":1110},[],"Step-by-step guide to setting up an Adjust Cost grabber in Magify This guide explains how to set up an Adjust Cost grabber in the Magify analytics system. The grabber enables automated import of campaign costs, creatives, performance metrics, and other user acquisition data from Adjust into your analytics workflow.",{"id":1470,"title":13,"titles":1471,"content":1472,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#getting-started",[72],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Adjust Cost in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Adjust account by providing the required API Token, specifying any partners to exclude, and naming the integration. Each field in the form is described below.",{"id":1474,"title":1295,"titles":1475,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#general-settings",[72],{"id":1477,"title":1304,"titles":1478,"content":1479,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#name",[72,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Adjust Cost Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1481,"title":1309,"titles":1482,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#organization",[72,1295],{"id":1484,"title":1456,"titles":1485,"content":1486,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#api-token",[72,1295],"A personal API Token from Adjust, used to authenticate API requests and enable Magify to access cost data for your account. How to find it: Log in to your Adjust dashboard.Click on Account Settings. Navigate to the My Profile tab.Locate and copy your API Token.",{"id":1488,"title":1489,"titles":1490,"content":1491,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#partners-to-exclude","Partners to exclude",[72,1295],"A comma-separated list of Adjust partner names to be excluded from cost data import. This field allows you to filter out specific networks or traffic sources from the Adjust Cost Grabber. It is useful in cases where: The same partner is already connected via another direct integration (e.g., Unity Ads, Mintegral).A partner provides unreliable or test traffic.You want to avoid data duplication or inconsistency. Examples:Unity Ads,ironSource,MOLOCOImportant: Partner names must exactly match those used in Adjust. To ensure accuracy, export a list of partner names from Adjust reports or API before entering them here.",{"id":1493,"title":1494,"titles":1495,"content":1496,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#note-on-cost-and-revenue-data-availability","Note on Cost and Revenue Data Availability",[72,1295],"To enable access to ad spend, SKAN, and ad revenue data in Adjust, you must connect your measurement partners in the DataWorks section of the Adjust dashboard. This is especially relevant for self-attributing networks (e.g., Meta, Google Ads, TikTok), which require explicit connection before sharing cost and revenue data via the Adjust API. For detailed setup instructions, refer to the Adjust Help Center: Self-attributing network setup | Adjust Help Center",{"id":1498,"title":1338,"titles":1499,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#is-enabled",[72,1295],{"id":1501,"title":1343,"titles":1502,"content":1503,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#saving-the-configuration",[72],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will begin collecting data from Adjust based on the configured schedule.\nBy default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":1505,"title":467,"titles":1506,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#",[72],{"id":1508,"title":467,"titles":1509,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/adjust-cost#_1",[72,467],{"id":77,"title":76,"titles":1511,"content":1512,"level":1110},[],"Step-by-step guide for integrating the Almedia grabber in Magify This guide explains how to set up the Almedia UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Almedia account into your analytics pipeline.",{"id":1514,"title":13,"titles":1515,"content":1516,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#getting-started",[76],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Almedia in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Almedia account by providing the required credentials (API Key), Game Name, and a custom integration name.",{"id":1518,"title":1295,"titles":1519,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#general-settings",[76],{"id":1521,"title":1299,"titles":1522,"content":1523,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#form-overview",[76,1295],"Top Section – General connection parameters: integration name, organization, and API Key.Applications Section – A list of individual Almedia applications for which data should be collected. Each field in the form is described below",{"id":1525,"title":1304,"titles":1526,"content":1527,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#name",[76,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Almedia Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1529,"title":1309,"titles":1530,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#organization",[76,1295],{"id":1532,"title":1533,"titles":1534,"content":1535,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#api-key","API Key",[76,1295],"The API Key is required to authenticate and access reporting data from Almedia via their API. How to obtain it: Log in to your Almedia account.Go to Account Settings or API Access (depending on your interface).Locate the API Key section.Copy the key. If you cannot find the API Key or do not have access to this section, please contact your Almedia account manager to request the necessary credentials.",{"id":1537,"title":1338,"titles":1538,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#is-enabled",[76,1295],{"id":1540,"title":1541,"titles":1542,"content":1543,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#applications-section","Applications Section",[76],"This section is used to map your Almedia game to the corresponding source applications on Android and iOS platforms. This mapping ensures that performance data is correctly attributed and synchronized in Magify. Each application entry includes the following fields:",{"id":1545,"title":1546,"titles":1547,"content":1548,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#almedia-game-name","Almedia Game Name",[76,1541],"The internal name of the game in the Almedia system. Used to identify and link incoming data from Almedia to your application in Magify. To add more application mappings, click the + Add Applications button.",{"id":1550,"title":1551,"titles":1552,"content":1553,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#src-android-app","Src Android App",[76,1541],"Select the Android version of the app from the dropdown list. This should match the app name used in your analytics or attribution system. It will be used to associate Almedia data with the correct Android source app in Magify.",{"id":1555,"title":1556,"titles":1557,"content":1558,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#src-ios-app","Src iOS App",[76,1541],"Select the iOS version of the app from the dropdown list. This links Almedia data to the correct iOS source app for reporting and analysis in Magify.",{"id":1560,"title":1343,"titles":1561,"content":1562,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/almedia#saving-the-configuration",[76],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Almedia according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":81,"title":80,"titles":1564,"content":1565,"level":1110},[],"Step-by-step guide for integrating the Appier grabber in Magify This guide explains how to set up an Appier data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Appier account into your analytics pipeline.",{"id":1567,"title":13,"titles":1568,"content":1569,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#getting-started",[80],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Appier in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Appier account by providing the required API Key, App ID and a name for the integration. Each field in the form is described below.",{"id":1571,"title":1295,"titles":1572,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#general-settings",[80],{"id":1574,"title":1304,"titles":1575,"content":1576,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#name",[80,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: A Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1578,"title":1309,"titles":1579,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#organization",[80,1295],{"id":1581,"title":1426,"titles":1582,"content":1583,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#access-token",[80,1295],"The Access Token is used to authenticate and access reporting data from Appier via their API. How to obtain it: Contact your Appier account manager and request your Access Token.Be sure to mention that the token is needed for integration with an analytics system such as Magify. You can find additional details in the official Appier documentation.",{"id":1585,"title":1338,"titles":1586,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#is-enabled",[80,1295],{"id":1588,"title":1343,"titles":1589,"content":1590,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#saving-the-configuration",[80],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Appier according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":1592,"title":467,"titles":1593,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/appier#",[80,1343],{"id":85,"title":84,"titles":1595,"content":1596,"level":1110},[],"Apple Search Ads integration for Magify enables automatic import of spend, installs, campaigns, and search terms data from Apple Search Ads. This guide explains how to set up the Apple Search Ads integration in the Magify analytics system. The integration enables automated import of user acquisition data, including spend, impressions, taps, installs, campaigns, and search terms, directly from Apple Search Ads into Magify.",{"id":1598,"title":1599,"titles":1600,"content":1601,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#creating-an-apple-search-ads-grabber","Creating an Apple Search Ads Grabber",[84],"To create an Apple Search Ads grabber: In the Magify interface, go to Configurations > Integrations > UA Grabbers.Find Apple Search Ads in the list of available integrations.Click Connect. An Apple Search Ads UA Grabber will be created, and the integration card will open.",{"id":1603,"title":13,"titles":1604,"content":1605,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#getting-started",[84],"The Apple Search Ads card is used to connect Magify to your Apple Search Ads account using OAuth authentication. All required configuration parameters are described below.",{"id":1607,"title":1608,"titles":1609,"content":1610,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#apple-search-ads-account-setup-oauth","Apple Search Ads Account Setup (OAuth)",[84],"Apple Search Ads API uses OAuth 2.0 with JWT-based authentication. The complete OAuth setup process is described in the official Apple documentation: Implementing OAuth for the Apple Search Ads Follow the official instructions to generate all required credentials.",{"id":1612,"title":1613,"titles":1614,"content":1615,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#step-1-create-an-api-key","Step 1. Create an API Key",[84,1608],"Log in to your Apple Search Ads account.Go to Account Settings.Create a new API key.Download the generated Private Key (.pem file).Upload the Private Key in Account Settings. During this process, Apple provides: Key IDTeam ID",{"id":1617,"title":1618,"titles":1619,"content":1620,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#step-2-generate-oauth-credentials","Step 2. Generate OAuth Credentials",[84,1608],"According to the official Apple documentation, also generate: Client IDClient SecretPublic Key These values are used by Magify to generate the access token and authenticate API requests.",{"id":1622,"title":1295,"titles":1623,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#general-settings",[84],{"id":1625,"title":1304,"titles":1626,"content":1627,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#name",[84,1295],"A descriptive name for the grabber configuration. Recommended format:Apple Search Ads Grabber YourCompanyName",{"id":1629,"title":1309,"titles":1630,"content":1631,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#organization",[84,1295],"Select the organization associated with this integration.",{"id":1633,"title":1634,"titles":1635,"content":1636,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#client-id","Client ID",[84,1295],"The Apple Search Ads client identifier. Obtained from Account Settings.",{"id":1638,"title":1639,"titles":1640,"content":1641,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#team-id","Team ID",[84,1295],"Your Apple Developer Team identifier.",{"id":1643,"title":1644,"titles":1645,"content":1646,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#key-id","Key ID",[84,1295],"The identifier of the Apple Search Ads API key.",{"id":1648,"title":1649,"titles":1650,"content":1651,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#private-key","Private Key",[84,1295],"The .pem private key generated in Apple Search Ads.",{"id":1653,"title":1654,"titles":1655,"content":1656,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#public-key","Public Key",[84,1295],"The public key generated during OAuth setup.",{"id":1658,"title":1659,"titles":1660,"content":1661,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#client-secret","Client Secret",[84,1295],"OAuth client secret used for API authorization.",{"id":1663,"title":1664,"titles":1665,"content":1666,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#client-secret-expires-on","Client Secret Expires On",[84,1295],"The expiration date and time of the Client Secret. This value is defined by Apple and indicates how long the Client Secret remains valid. After the expiration date, a new Client Secret must be generated in Apple Search Ads and updated in the grabber settings. This field is informational and is not calculated automatically.",{"id":1668,"title":1669,"titles":1670,"content":1671,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#automatically-populated-fields","Automatically Populated Fields",[84],"The following fields are populated automatically after saving the configuration and the first successful grabber run.",{"id":1673,"title":1426,"titles":1674,"content":1675,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#access-token",[84,1669],"Generated automatically based on: Client IDKey IDTeam IDPrivate Key",{"id":1677,"title":1678,"titles":1679,"content":1680,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#expires-on","Expires On",[84,1669],"The expiration date and time of the Access Token.",{"id":1682,"title":1683,"titles":1684,"content":1685,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#org-ids","Org IDs",[84,1669],"A list of Organization IDs available in your Apple Search Ads account. ImportantIf any of the following fields are changed:Client IDKey IDTeam IDPrivate KeyMagify automatically re-authenticates and refreshes the Access Token and related values.",{"id":1687,"title":1688,"titles":1689,"content":1690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#additional-apple-search-ads-grabbers","Additional Apple Search Ads Grabbers",[84],"Additional grabbers are configured within the Apple Search Ads card and reuse the existing authorization.",{"id":1692,"title":1693,"titles":1694,"content":1695,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#apple-search-ads-campaign-grabber","Apple Search Ads Campaign Grabber",[84],"Used to load data at the campaign level. Recommended name:ASA YourCompanyName Campaign",{"id":1697,"title":1338,"titles":1698,"content":1699,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#is-enabled",[84,1693],"Enable this option to start data collection immediately.",{"id":1701,"title":1702,"titles":1703,"content":1704,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#apple-search-ads-search-terms-grabber","Apple Search Ads Search Terms Grabber",[84],"Used to load search terms–level data. Recommended name: ASA YourCompanyName Search Terms",{"id":1706,"title":1338,"titles":1707,"content":1699,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#is-enabled-1",[84,1702],{"id":1709,"title":1343,"titles":1710,"content":1711,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/apple-search-ads#saving-the-configuration",[84],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Apple Search Ads according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (for example, during initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":89,"title":88,"titles":1713,"content":1714,"level":1110},[],"Step-by-step guide for integrating the AppLovin grabber in Magify This guide explains how to set up an AppLovin data grabber in the Magify analytics system. The grabber enables automated import of campaign data, creatives, performance metrics, and other UA-related information from your AppLovin account into your analytics pipeline.",{"id":1716,"title":13,"titles":1717,"content":1718,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#getting-started",[88],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Applovin in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your AppLovin account by providing the required API Key (Report Key) and naming the integration. Each field in the form is described below.",{"id":1720,"title":1295,"titles":1721,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#general-settings",[88],{"id":1723,"title":1304,"titles":1724,"content":1725,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#name",[88,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: AppLovin Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1727,"title":1309,"titles":1728,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#organization",[88,1295],{"id":1730,"title":1731,"titles":1732,"content":1733,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#report-key","Report Key",[88,1295],"This is the key used to authenticate access to your AppLovin reports. How to find it: Log in to your AppLovin account.Navigate to Account > Keys.Locate and copy the Report Key. Paste the Report Key into the corresponding field in Magify.",{"id":1735,"title":1736,"titles":1737,"content":1738,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#api-endpoint","API Endpoint",[88,1295],"This is the base URL used by the grabber to fetch UA report data from AppLovin. When to use: Modify this only if your team requires advanced customisation or security-specific routing. In most cases, the default value should remain unchanged. Default: https://r.applovin.com/ What it does: Defines the AppLovin reporting server the integration will communicate with.",{"id":1740,"title":1338,"titles":1741,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#is-enabled",[88,1295],{"id":1743,"title":1343,"titles":1744,"content":1745,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#saving-the-configuration",[88,1295],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from AppLovin according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":1747,"title":467,"titles":1748,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/applovin#",[88],{"id":93,"title":92,"titles":1750,"content":1751,"level":1110},[],"Step-by-step guide for integrating the Aura from Unity grabber in Magify This guide explains how to set up the Aura from Unity UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Aura from Unity account into your analytics pipeline.",{"id":1753,"title":13,"titles":1754,"content":1755,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura#getting-started",[92],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Aura from Unity in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Aura from Unity account by providing the required credentials (API Token) and a custom integration name. Each field in the form is described below.",{"id":1757,"title":1295,"titles":1758,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura#general-settings",[92],{"id":1760,"title":1304,"titles":1761,"content":1762,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura#name",[92,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Aura from Unity Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1764,"title":1309,"titles":1765,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura#organization",[92,1295],{"id":1767,"title":1456,"titles":1768,"content":1769,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura#api-token",[92,1295],"The API Token is a unique static key used to authenticate with the Aura from Unity Reporting API. It is required for the UA grabber to connect to the Reporting API and retrieve data on campaigns, clicks, installs, and spend. How to obtain it: Contact your Aura from Unity account manager.The API Token cannot be generated by yourself in a dashboard. It is only issued by the account manager upon request.Once requested, you will receive a token in UUID format.",{"id":1771,"title":1338,"titles":1772,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura#is-enabled",[92,1295],{"id":1774,"title":1343,"titles":1775,"content":1776,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/aura#saving-the-configuration",[92],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Aura from Unity according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":97,"title":96,"titles":1778,"content":1779,"level":1110},[],"Step-by-step guide for integrating the BIGO Ads grabber in Magify This guide explains how to set up the BIGO Ads UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your BIGO Ads account into your analytics pipeline.",{"id":1781,"title":13,"titles":1782,"content":1783,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads#getting-started",[96],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find BIGO Ads in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your BIGO Ads account by providing the required credentials (Client ID, Client Secret, Access Token, Refresh Token, Expires On) and a custom integration name. Each field in the form is described below.",{"id":1785,"title":1295,"titles":1786,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads#general-settings",[96],{"id":1788,"title":1304,"titles":1789,"content":1790,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads#name",[96,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: BIGO Ads Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1792,"title":1309,"titles":1793,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads#organization",[96,1295],{"id":1795,"title":1796,"titles":1797,"content":1798,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads#client-id-client-secret-access-token-refresh-token-and-expires-on","Client ID, Client Secret, Access Token, Refresh Token, and Expires On",[96,1295],"To enable the UA grabber to connect with the BIGO Ads Reporting API, OAuth credentials are required. These credentials allow the grabber to authenticate and fetch campaign data such as impressions, clicks, installs, and spend. Contact your BIGO Ads account manager to receive: Client IDClient SecretAccess TokenRefresh TokenExpires On",{"id":1800,"title":1338,"titles":1801,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads#is-enabled",[96,1295],{"id":1803,"title":1343,"titles":1804,"content":1805,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/bigo-ads#saving-the-configuration",[96],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from BIGO Ads according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":101,"title":100,"titles":1807,"content":1808,"level":1110},[],"Step-by-step guide for integrating the Chartboost grabber in Magify This guide explains how to set up the Chartboost UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Chartboost platform into your analytics pipeline.",{"id":1810,"title":13,"titles":1811,"content":1812,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#getting-started",[100],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Chartboost in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Chartboost account by providing the required credentials (Client ID, Client Secret, Grabbers) and a custom integration name.",{"id":1814,"title":1295,"titles":1815,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#general-settings",[100],{"id":1817,"title":1299,"titles":1818,"content":1819,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#form-overview",[100,1295],"Top Section – General connection parameters: integration name, organization, and API credentials. This section is used to configure access for both grabbers: Chartboost UA Country Grabber – retrieves User Acquisition campaign data from the Chartboost API with metrics grouped by country. Used for geo-level performance analysis and cost tracking.Chartboost UA Creative Grabber – retrieves User Acquisition campaign data from the Chartboost API with metrics grouped by creative assets. Used for analyzing the performance of individual ad creatives.",{"id":1821,"title":1304,"titles":1822,"content":1823,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#name",[100,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Chartboost Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1825,"title":1309,"titles":1826,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#organization",[100,1295],{"id":1828,"title":1829,"titles":1830,"content":1831,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#client-id-and-client-secret","Client ID and Client Secret",[100,1295],"Client ID and Client Secret are authentication credentials used to securely connect to the Chartboost Reporting API. They are required to generate access tokens that allow authorized data retrieval from your Chartboost account. These credentials are essential for enabling automated data collection in systems like Magify. How to obtain them: Log in to your Chartboost dashboard.Click on your profile icon in the upper-right corner.Select Company Info & Settings from the dropdown.In the left-hand menu, click Access Management.Scroll to the API v5 section.Click Refresh API v5 Credentials to generate your new credentials. Client ID will be displayed in the input field.Client Secret will appear only once. Make sure to copy it. The screenshot below shows an example where only the Client ID is visible. Note: The Client Secret is only shown once after generation. If lost, you must regenerate the credentials.",{"id":1833,"title":1834,"titles":1835,"content":1836,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#ua-country-grabber-and-ua-creative-grabber","UA Country Grabber and UA Creative Grabber",[100,1295],"This section includes two grabbers responsible for fetching User Acquisition data from Chartboost: Chartboost UA Country Grabber – collects UA campaign metrics grouped by country (e.g., installs, spend, CPI, etc.) for geo-level performance analysis.Chartboost UA Creative Grabber – collects UA campaign metrics grouped by creative assets for analyzing the performance of individual ads. Each grabber form contains the following fields: Name – an internal name for the grabber configuration, used for reference in the system. Optional field – recommended to fill in for easier navigation. Example: MyCompanyName – Chartboost UA CreativeIs enabled – a toggle to activate or deactivate the grabber. Enable this option to start collecting data immediately. If left unchecked, the configuration is saved but inactive.",{"id":1838,"title":1343,"titles":1839,"content":1840,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/chartboost#saving-the-configuration",[100],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Chartboost according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":105,"title":104,"titles":1842,"content":1843,"level":1110},[],"Step-by-step guide for integrating the Exmox grabber in Magify This guide explains how to set up the Exmox UA data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Exmox account into your analytics pipeline.",{"id":1845,"title":13,"titles":1846,"content":1847,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#getting-started",[104],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Exmox in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Exmox account by providing the required API Key and a name for the integration.",{"id":1849,"title":1295,"titles":1850,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#general-settings",[104],{"id":1852,"title":1304,"titles":1853,"content":1854,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#name",[104,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Exmox Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1856,"title":1309,"titles":1857,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#organization",[104,1295],{"id":1859,"title":1533,"titles":1860,"content":1861,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#api-key",[104,1295],"This credential is required to authenticate access to your Exmox reporting data. Where to find it: To obtain your API Key, please contact the Exmox team: If you already have a partnership with Exmox, reach out directly to your account manager to request API access.If you do not have a direct contact, use the contact form available on the official website: https://exmox.com → Contact section. The API Key will be provided individually by the Exmox team based on your integration requirements.",{"id":1863,"title":1338,"titles":1864,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#is-enabled",[104,1295],{"id":1866,"title":1343,"titles":1867,"content":1868,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#saving-the-configuration",[104],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Exmox according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":1870,"title":467,"titles":1871,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/exmox#",[104,1343],{"id":109,"title":108,"titles":1873,"content":1874,"level":1110},[],"Step-by-step guide for integrating the Facebook grabber in Magify This guide explains how to set up the Facebook UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Facebook account into your analytics pipeline.",{"id":1876,"title":13,"titles":1877,"content":1878,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook#getting-started",[108],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Facebook UA in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Facebook account by providing the required credentials (App Token, Facebook Ads UA Grabber — by Country) and a custom integration name. Each field in the form is described below.",{"id":1880,"title":1295,"titles":1881,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook#general-settings",[108],{"id":1883,"title":1304,"titles":1884,"content":1885,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook#name",[108,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Facebook UA Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1887,"title":1309,"titles":1888,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook#organization",[108,1295],{"id":1890,"title":1333,"titles":1891,"content":1892,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook#app-token",[108,1295],"Go to the Facebook Developers website → Create a new app with Business type (e.g., App \"For grabbing\", \"Grabbing Tool\").Navigate to Business Settings > Under Users, click System Users > Click Add New System User > Select the Employee role > Give a name to the system user (e.g., \"uareports\") and click Create System User.Assign assets, such as your Ad Accounts, with View Performance permission > Assign Apps (just created App) with Develop App permission > Select ads_read and ads_management permissions.Click Generate New Token. Copy and save your Token. Go to Business Settings → Accounts → Apps → Locate your mobile app → Assign the System User with Develop App permission. Double-check the assigned assets for correctness.",{"id":1894,"title":1895,"titles":1896,"content":1897,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook#facebook-ads-ua-grabber-by-country","Facebook Ads UA Grabber — by Country",[108,1295],"Facebook Ads UA Grabber — by Country connects to the Meta Audience Network Optimization Report API v2 and retrieves campaign statistics grouped by country. When creating a new report: Name — enter the report name (e.g., Facebook UA — Country [CompanyName]),Is Enabled — switch on the flag to activate the grabber. Once saved, the UA grabber will start pulling data from Meta API and output country-level breakdowns.",{"id":1899,"title":1343,"titles":1900,"content":1901,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/facebook#saving-the-configuration",[108],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Facebook according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":113,"title":112,"titles":1903,"content":1904,"level":1110},[],"Step-by-step guide for integrating the Fluent grabber in Magify This guide explains how to set up a Fluent data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Fluent account into your analytics pipeline.",{"id":1906,"title":13,"titles":1907,"content":1908,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#getting-started",[112],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Fluent in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Fluent (Tune) account by providing the required API Key, API Network ID, and a name for the integration.",{"id":1910,"title":1295,"titles":1911,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#general-settings",[112],{"id":1913,"title":1299,"titles":1914,"content":1915,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#form-overview",[112,1295],"Top Section – General connection parameters: integration name, organization, API credentials, and API network.Mapping App Section – A list of individual Fluent applications for which data should be collected. Each field in the form is described below:",{"id":1917,"title":1304,"titles":1918,"content":1919,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#name",[112,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Fluent Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1921,"title":1309,"titles":1922,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#organization",[112,1295],{"id":1924,"title":1925,"titles":1926,"content":1927,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#api-key-and-api-network-id","API Key and API Network ID",[112,1295],"These credentials are used to authenticate access to your Fluent reports. How to find them: Log in to your Fluent account.Navigate to Support > API to retrieve the following:\nAPI Key – The API key for the advertiser API.API Network ID – The network ID of the network you are working with. More information: Getting your API key – Tune Documentation",{"id":1929,"title":1338,"titles":1930,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#is-enabled",[112,1295],{"id":1932,"title":1933,"titles":1934,"content":1935,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#mapping-app-section","Mapping App Section",[112],"This section allows you to configure individual Fluent applications for data collection. For each application, create a mapping entry with the following fields:",{"id":1937,"title":1938,"titles":1939,"content":1940,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#match-part","Match Part",[112,1933],"Enter the application name as it appears in the ad campaign name. For example, if the campaign name is \"AppName_iOS_*\", enter \"AppName_iOS\" in this field.",{"id":1942,"title":1328,"titles":1943,"content":1944,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#application",[112,1933],"Select the corresponding application from the list. It must already be integrated with Fluent and added to Magify.",{"id":1946,"title":1343,"titles":1947,"content":1948,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#saving-the-configuration",[112],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Fluent according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":1950,"title":467,"titles":1951,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/fluent#",[112,1343],{"id":117,"title":116,"titles":1953,"content":1954,"level":1110},[],"Step-by-step guide for integrating the Gamelight grabber in Magify This guide explains how to set up the Gamelight UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Gamelight account into your analytics pipeline.",{"id":1956,"title":13,"titles":1957,"content":1958,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight#getting-started",[116],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Gamelight in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Gamelight account by providing the required credentials (API Key) and a custom integration name. Each field in the form is described below.",{"id":1960,"title":1295,"titles":1961,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight#general-settings",[116],{"id":1963,"title":1304,"titles":1964,"content":1965,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight#name",[116,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Gamelight Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1967,"title":1309,"titles":1968,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight#organization",[116,1295],{"id":1970,"title":1533,"titles":1971,"content":1972,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight#api-key",[116,1295],"The API key is required to authenticate requests and enable access to Gamelight’s user acquisition data via the API. To obtain it: Contact your Gamelight Account Manager.Request an API Key for data integration.Use the provided key in the integration form for authentication and API access.",{"id":1974,"title":1338,"titles":1975,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight#is-enabled",[116,1295],{"id":1977,"title":1343,"titles":1978,"content":1979,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/gamelight#saving-the-configuration",[116],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Gamelight according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":121,"title":120,"titles":1981,"content":1982,"level":1110},[],"Step-by-step guide to setting up a Google Ads grabber in Magify This guide will help you connect a Google Ads data grabber to the Magify analytics system. The grabber collects data on ad assets, geo performance, and other account-level metrics, enabling automated data import into your analytics pipeline.",{"id":1984,"title":13,"titles":1985,"content":1986,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#getting-started",[120],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Google Ads in the list and click Add Grabber to create a new data source.A configuration form will open. This will open a configuration form where you can enter the required connection parameters. Below is a description of each field, along with instructions on where to find the necessary values.",{"id":1988,"title":1304,"titles":1989,"content":1990,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#name",[120,13],"The name of the grabber configuration in the Magify system. It helps you identify this data source among other integrations. Recommended format: Google Ads Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":1992,"title":1309,"titles":1993,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#organization",[120,13],{"id":1995,"title":1829,"titles":1996,"content":1997,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#client-id-and-client-secret",[120,13],"These are the two key parameters required for authorization via OAuth 2.0 — the protocol used by the grabber to access the Google Ads API on behalf of your project. Go to the Google Cloud Console. If you don't have a project in Google Cloud Console yet, follow these steps: Click New project in the top right corner of the project selection window.In the popup window, provide the following: Project name — enter any descriptive name (e.g., Your Application Name).Optionally, select your organization and folder, if applicable. Click Create. Choose the user type (Audience): External — select this if the integration will be used outside your organization. This is the default and most common option.Internal — only available for Google Workspace accounts within your organization. Enter the Developer contact information: This email will be used by Google to send important notifications related to your project.Enter a valid work email (e.g., magify.application@magify.com). Finalize the consent screen setup: Accept the Google API Services: User Data Policy.Click Create to complete the OAuth consent screen setup. On the Create OAuth client ID screen: In the Application type dropdown, select Web application.Provide a name for your app in the Name field. This name is internal and used only for your reference.In the Authorized redirect URIs section, you must enter the following URL:https://developers.google.com/oauthplayground . This is required for using OAuth 2.0 Playground to manually generate a refresh token. After clicking Create, a dialog window will appear (see screenshot above). Once done, you will be presented with your OAuth 2.0 Client ID and Client Secret. You can download these credentials in JSON format and save them for later use. For more details, refer to the Google Ads API Authentication Guide (Step 2). Note: Enable the Google Ads APIBefore proceeding, make sure that the Google Ads API is enabled in your Google Cloud project. If the API is not activated, you will not be able to obtain tokens or use the grabber correctly.How to enable Google Ads API:Go to Google Cloud Console > APIs & Services > LibraryType Google Ads API into the search barSelect the API from the listClick EnableDirect link (works only if you already have access to the project): https://console.cloud.google.com/apis/api/googleads.googleapis.com/overview",{"id":1999,"title":2000,"titles":2001,"content":2002,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#refresh-token","Refresh token",[120,13],"The refresh token is a key that allows the grabber to stay authorized in the Google Ads API without requiring repeated logins.It works together with your Client ID and Client Secret to automatically refresh the access token and maintain a persistent connection. How to get a refresh token using OAuth Playground Open the OAuth 2.0 PlaygroundClick the ⚙️ (gear icon) in the top-right corner and enable: ✔ Use your own OAuth credentialsSet the following option: Force prompt → No. This disables extra authorization prompts during token refresh. At Step 1: Select & authorize APIs, locate and expand the Google Ads API category.Check the box next to: https://www.googleapis.com/auth/adwords. This grants access to Google Ads data via the API.Click the Authorize APIs button.Sign in with your Google Ads account and confirm access when prompted. After successful authorization, click Exchange authorization code for tokens. The Playground will display both the Access Token and the Refresh Token.Copy the Refresh Token — you’ll need it when configuring the grabber in Magify.",{"id":2004,"title":2005,"titles":2006,"content":2007,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#developer-token","Developer token",[120,13],"The Developer Token is a unique key used to identify your application when making requests to the Google Ads API. Without it, no requests from the grabber will be accepted by Google. Where to get your Developer Token: Go to your Google Ads Manager (MCC) account.In the left-hand navigation menu, click Admin → then select API Center (or go directly to ads.google.com/aw/apicenter if you're already in the correct account)On the page, you’ll see the Developer Token field — copy the value shown there.",{"id":2009,"title":2010,"titles":2011,"content":2012,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#manager-customer-id","Manager Customer ID",[120,13],"The Manager Customer ID (or MCC ID) is a unique identifier of your Google Ads Manager Account. The grabber uses this ID to operate on behalf of your account when fetching data. Where to find your Manager Customer ID: Log in to Google Ads with the account you plan to use in Magify.Open the account you intend to connect. The ID will follow the format: 123-456-7890 This is your Manager Customer ID — copy and paste it into the corresponding field in Magify. Note:This must be a Manager Account (MCC) — the grabber will not work with a standard Google Ads account.By default, each grabber is configured to load data for 1 day when created.If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you.Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2014,"title":2015,"titles":2016,"content":2017,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#googleads-assets-grabber","GoogleAds Assets Grabber",[120],"Click the blue button + Add GoogleAds Assets Grabber — this form is used to create a new grabber of type GoogleAds Assets Grabber, which is designed to collect data about creative assets (images, videos, text ads) from Google Ads campaigns. These reports are essential for analyzing the performance of creatives. What to do: Enter a name in the Name field (for example, Assets).Enable the grabber by checking the Is Enabled box.",{"id":2019,"title":2020,"titles":2021,"content":2022,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/google-ads#googleads-geo-grabber","GoogleAds Geo Grabber",[120],"Click the blue button + Add GoogleAds Geo Grabber — this form is used to create a new grabber of type GoogleAds Geo Grabber, which collects data from Google Ads campaigns broken down by geography (countries). These reports help analyze budget allocation and CPI/CTR performance across different regions. What to do: Enter a name in the Name field (for example, Geo).Enable the grabber by checking the Is Enabled box.",{"id":125,"title":124,"titles":2024,"content":2025,"level":1110},[],"Step-by-step guide for integrating the ironSource grabber in Magify This guide explains how to set up the ironSource UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your ironSource platform into your analytics pipeline.",{"id":2027,"title":13,"titles":2028,"content":2029,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/ironsource#getting-started",[124],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find ironSource in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your ironSource platform by providing the required credentials (Secret Key, Refresh Token) and a custom integration name. Each field in the form is described below.",{"id":2031,"title":1304,"titles":2032,"content":2033,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/ironsource#name",[124,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: ironSource Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2035,"title":1309,"titles":2036,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/ironsource#organization",[124,13],{"id":2038,"title":2039,"titles":2040,"content":2041,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/ironsource#secret-key-and-refresh-token","Secret Key and Refresh Token",[124,13],"The Secret Key and Refresh Token are authorization credentials required for secure access to user acquisition (UA) data via the ironSource (LevelPlay) API. Secret Key – a unique key used to identify and authenticate the client making API requests.Refresh Token – used to obtain a valid Access Token, which is required for authenticated API requests. Since the Access Token has a limited lifespan, the Refresh Token ensures continued access. These credentials are required to configure a UA grabber in the Magify system for automated retrieval of advertising campaign metrics, including spend, impressions, and installs. How to find them: Go to the ironSource Platform.In the bottom-left corner, click the profile icon, then select Account.Navigate to the API tab at the top of the page.Copy the values from the following fields:\nSecret KeyRefresh TokenPaste these credentials into the corresponding fields in the Magify interface to complete UA grabber setup.",{"id":2043,"title":1338,"titles":2044,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/ironsource#is-enabled",[124,13],{"id":2046,"title":1343,"titles":2047,"content":2048,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/ironsource#saving-the-configuration",[124],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from ironSource according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":129,"title":128,"titles":2050,"content":2051,"level":1110},[],"Step-by-step guide to setting up an Mintegral grabber in Magify This guide describes how to configure a Mintegral data grabber in the Magify analytics platform. The grabber enables automated import of campaign data, creatives, performance metrics, and other UA-related information from your Mintegral account into your analytics pipeline.",{"id":2053,"title":13,"titles":2054,"content":2055,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#getting-started",[128],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Mintegral in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Mintegral account by providing the required Access Key and API Key, as well as naming the integration.",{"id":2057,"title":1295,"titles":2058,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#general-settings",[128],{"id":2060,"title":1304,"titles":2061,"content":2062,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#name",[128,1295],"Enter a descriptive name for the grabber configuration. This helps identify the data source among other integrations. Recommended format: Mintegral Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2064,"title":1309,"titles":2065,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#organization",[128,1295],{"id":2067,"title":2068,"titles":2069,"content":2070,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#access-key-and-api-key","Access Key and API Key",[128,1295],"To connect Mintegral to Magify, you need to provide an Access Key and an API Key. These credentials are used to authenticate requests and allow Magify to import campaign performance data from your Mintegral account. Log in to your Mintegral account.In the left-hand menu, navigate to Account → Basic Information. This section contains your account’s API credentials.Locate and copy the following values: Access Key — used to identify your account in API requestsAPI Key — used to authenticate requests",{"id":2072,"title":1338,"titles":2073,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#is-enabled",[128,1295],{"id":2075,"title":1343,"titles":2076,"content":2077,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#saving-the-configuration",[128,1295],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Mintegral according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2079,"title":467,"titles":2080,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mintegral#",[128],{"id":133,"title":132,"titles":2082,"content":2083,"level":1110},[],"Step-by-step guide to setting up a Mistplay grabber in Magify This guide explains how to set up a Mistplay data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Mistplay account into your analytics pipeline.",{"id":2085,"title":13,"titles":2086,"content":2087,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#getting-started",[132],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Mistplay in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Mistplay account by providing the required Account ID, API Token, Secret, and a name for the integration. Each field in the form is described below.",{"id":2089,"title":1295,"titles":2090,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#general-settings",[132],{"id":2092,"title":1304,"titles":2093,"content":2094,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#name",[132,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Mistplay Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2096,"title":1309,"titles":2097,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#organization",[132,1295],{"id":2099,"title":2100,"titles":2101,"content":2102,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#api-token-account-id-and-secret","API Token, Account ID, and Secret",[132,1295],"These credentials are required to authenticate and access reporting data from Mistplay via their API. Account ID – your Mistplay account identifier.API Token – used to authorize API requests.Secret – an additional security key used to verify the authenticity of requests. How to obtain them: To receive these credentials, contact your Mistplay account manager or reach out to their support team. Be sure to mention that you need API access for integration purposes.",{"id":2104,"title":1338,"titles":2105,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#is-enabled",[132,1295],{"id":2107,"title":1343,"titles":2108,"content":2109,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#saving-the-configuration",[132],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will begin collecting data from Mistplay based on the configured schedule.\nBy default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2111,"title":467,"titles":2112,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mistplay#",[132,1343],{"id":137,"title":136,"titles":2114,"content":2115,"level":1110},[],"Step-by-step guide for integrating the Mobvista grabber in Magify This guide explains how to set up the Mobvista UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Mobvista account into your analytics pipeline.",{"id":2117,"title":13,"titles":2118,"content":2119,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#getting-started",[136],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Mobvista in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Mobvista account by providing the required API Key, Username, and a name for the integration. Each field in the form is described below.",{"id":2121,"title":1295,"titles":2122,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#general-settings",[136],{"id":2124,"title":1304,"titles":2125,"content":2126,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#name",[136,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Mobvista Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2128,"title":1309,"titles":2129,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#organization",[136,1295],{"id":2131,"title":2132,"titles":2133,"content":2134,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#username-and-api-key","Username and API Key",[136,1295],"This parameters required for authentication when connecting the UA grabber to the Mobvista API. Both values are mandatory to establish a connection with the API and retrieve data. Username and API Key can be obtained by contacting your Mobvista account manager.",{"id":2136,"title":1338,"titles":2137,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#is-enabled",[136,1295],{"id":2139,"title":1343,"titles":2140,"content":2141,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#saving-the-configuration",[136],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Mobvista according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2143,"title":467,"titles":2144,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/mobvista#",[136,1343],{"id":141,"title":140,"titles":2146,"content":2147,"level":1110},[],"Step-by-step guide for integrating the Moloco grabber in Magify This guide explains how to set up the Moloco UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Moloco account into your analytics pipeline.",{"id":2149,"title":13,"titles":2150,"content":2151,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#getting-started",[140],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Moloco in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Moloco account by providing the required credentials (API Key, Ad Account ID) and a custom integration name. Each field in the form is described below.",{"id":2153,"title":1295,"titles":2154,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#general-settings",[140],{"id":2156,"title":1304,"titles":2157,"content":2158,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#name",[140,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Moloco Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2160,"title":1309,"titles":2161,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#organization",[140,1295],{"id":2163,"title":1533,"titles":2164,"content":2165,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#api-key",[140,1295],"The API Key is a unique static credential used to authorize the UA grabber in the Moloco Ads API. It is required to access campaign data (impressions, clicks, installs, spend).The API Key does not expire automatically, but it can be revoked or regenerated. How to find it: Log in to Moloco Campaign Manager.In the top-right corner, open the user menu and select My info. In User settings, go to the API Access tab.Click Generate API Key (if not created yet).Copy the generated key — it will only be displayed once.",{"id":2167,"title":2168,"titles":2169,"content":2170,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#ad-account-id","Ad Account ID",[140,1295],"The Ad Account ID is a unique identifier of your advertising account in Moloco. It is required when making API calls, as most Reporting API requests must specify the Ad Account ID to pull campaign data (spend, impressions, clicks, installs).Without it, the API will not know from which account to fetch data. How to find it: Log in to Moloco Campaign Manager.In the top-right corner, open the user menu and select My info.Go to User settings > My Ad Accounts.In the list of accounts, locate the ID column.\nThis value is your Ad Account ID. NotesIf you manage multiple Ad Accounts, each will have its own ID — select the correct one for your API integration.The Ad Account ID is static and does not change over time.Always match the correct Ad Account ID with the API Key you are using.",{"id":2172,"title":1338,"titles":2173,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#is-enabled",[140,1295],{"id":2175,"title":1343,"titles":2176,"content":2177,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/moloco#saving-the-configuration",[140],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Moloco according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":145,"title":144,"titles":2179,"content":2180,"level":1110},[],"Step-by-step guide to setting up a Persona.ly grabber in Magify This guide explains how to set up a Persona.ly data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Persona.ly account into your analytics pipeline.",{"id":2182,"title":13,"titles":2183,"content":2184,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#getting-started",[144],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Persona.ly in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Persona.ly account by providing the required API Key, Advertiser ID, and a name for the integration. Each field in the form is described below.",{"id":2186,"title":1295,"titles":2187,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#general-settings",[144],{"id":2189,"title":1304,"titles":2190,"content":2191,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#name",[144,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Persona.ly Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2193,"title":1309,"titles":2194,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#organization",[144,1295],{"id":2196,"title":2197,"titles":2198,"content":2199,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#advertiser-id-adv-id-and-api-key","Advertiser ID (Adv ID) and API Key",[144,1295],"These credentials are used to authenticate and access reporting data from Persona.ly via their API. API Key – used to authorize API requests.Advertiser ID (Adv ID) – uniquely identifies your advertiser account in Persona.ly and is required in API calls. How to obtain them: Contact your Persona.ly account manager and request both the API Key and Advertiser ID (Adv ID).Mention that you need these credentials for integration with an analytics system such as Magify.",{"id":2201,"title":1338,"titles":2202,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#is-enabled",[144,1295],{"id":2204,"title":1343,"titles":2205,"content":2206,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#saving-the-configuration",[144],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will begin collecting data from Persona.ly based on the configured schedule.\nBy default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2208,"title":467,"titles":2209,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#",[144],{"id":2211,"title":467,"titles":2212,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/persona-ly#_1",[144],{"id":149,"title":148,"titles":2214,"content":2215,"level":1110},[],"Step-by-step guide to setting up a Prodege grabber in Magify This guide explains how to set up a Prodege data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Tune account into your analytics pipeline.",{"id":2217,"title":13,"titles":2218,"content":2219,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#getting-started",[148],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Prodege in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Prodege (Tune) account by providing the required API Key, API Network ID, and a name for the integration.",{"id":2221,"title":1295,"titles":2222,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#general-settings",[148],{"id":2224,"title":1299,"titles":2225,"content":2226,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#form-overview",[148,1295],"Top Section – General connection parameters: integration name, organization, API credentials, and API network.Mapping App Section – A list of individual Prodege applications for which data should be collected. c",{"id":2228,"title":1304,"titles":2229,"content":2230,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#name",[148,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Prodege Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2232,"title":1309,"titles":2233,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#organization",[148,1295],{"id":2235,"title":1925,"titles":2236,"content":2237,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#api-key-and-api-network-id",[148,1295],"These credentials are used to authenticate access to your Prodege reports. How to find them: Log in to your Tune account.Navigate to Support > API to retrieve the following:\nAPI Key – The API key for the advertiser API.API Network ID – The network ID of the network you are working with. More information: Getting your API key – Tune Documentation",{"id":2239,"title":1338,"titles":2240,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#is-enabled",[148,1295],{"id":2242,"title":1933,"titles":2243,"content":2244,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#mapping-app-section",[148],"This section allows you to configure individual Prodege applications for data collection. For each application, create a mapping entry with the following fields:",{"id":2246,"title":1938,"titles":2247,"content":1940,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#match-part",[148,1933],{"id":2249,"title":1328,"titles":2250,"content":2251,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#application",[148,1933],"Select the corresponding application from the list. It must already be integrated with Prodege and added to Magify.",{"id":2253,"title":1343,"titles":2254,"content":2255,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#saving-the-configuration",[148],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Prodege (Tune) according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2257,"title":467,"titles":2258,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/prodege#",[148,1343],{"id":153,"title":152,"titles":2260,"content":2261,"level":1110},[],"Step-by-step guide to setting up a Smadex grabber in Magify This guide explains how to set up a Smadex data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Smadex account into your analytics pipeline.",{"id":2263,"title":13,"titles":2264,"content":2265,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex#getting-started",[152],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Smadex in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Smadex account by providing the required Username, Password, and a name for the integration. Each field in the form is described below.",{"id":2267,"title":1295,"titles":2268,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex#general-settings",[152],{"id":2270,"title":1304,"titles":2271,"content":2272,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex#name",[152,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Smadex Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2274,"title":1309,"titles":2275,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex#organization",[152,1295],{"id":2277,"title":2278,"titles":2279,"content":2280,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex#username-and-password","Username and Password",[152,1295],"Use the credentials from your Smadex account to obtain an access token for the Smadex API. Details on working with the Reporting API are available in the official Smadex documentation.",{"id":2282,"title":1338,"titles":2283,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex#is-enabled",[152,1295],{"id":2285,"title":1343,"titles":2286,"content":2287,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/smadex#saving-the-configuration",[152],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Smadex according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":157,"title":156,"titles":2289,"content":2290,"level":1110},[],"Step-by-step guide to setting up a Tapjoy grabber in Magify This guide explains how to set up an Tapjoy data grabber in the Magify analytics system. The grabber enables automated import of campaign data, creatives, performance metrics, and other UA-related information from your Tapjoy account into your analytics pipeline.",{"id":2292,"title":13,"titles":2293,"content":2294,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#getting-started",[156],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Tapjoy in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Tapjoy account by providing the required API Key and naming the integration. Each field in the form is described below.",{"id":2296,"title":1295,"titles":2297,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#general-settings",[156],{"id":2299,"title":1304,"titles":2300,"content":2301,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#name",[156,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Tapjoy Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2303,"title":1309,"titles":2304,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#organization",[156,1295],{"id":2306,"title":1533,"titles":2307,"content":2308,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#api-key",[156,1295],"To connect Tapjoy to Magify, you need to provide a Marketing API Key. This key is required to authenticate requests and fetch campaign data from your Tapjoy account. If you use the Ad Dashboard: You can find your Marketing API Key by visiting: https://dashboard.tapjoy.com/reporting/api If you use the LTV Platform: Go to your LTV Dashboard.Navigate to App Info > Settings > App Settings > Scroll down > API Keys.Locate and copy the Marketing API Key.",{"id":2310,"title":1338,"titles":2311,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#is-enabled",[156,1295],{"id":2313,"title":1343,"titles":2314,"content":2315,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#saving-the-configuration",[156,1295],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Tapjoy according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2317,"title":467,"titles":2318,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tapjoy#",[156],{"id":161,"title":160,"titles":2320,"content":2321,"level":1110},[],"Step-by-step guide for integrating the TikTok grabber in Magify This guide explains how to set up the TikTok UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your TikTok Ads account (via the TikTok Marketing API) into your analytics pipeline.",{"id":2323,"title":13,"titles":2324,"content":2325,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#getting-started",[160],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find TikTok in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your TikTok account by providing the required credentials (App ID, App Secret), selecting the grabbers, and specifying a custom integration name.",{"id":2327,"title":1295,"titles":2328,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#general-settings",[160],{"id":2330,"title":1299,"titles":2331,"content":2332,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#form-overview",[160,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Grabbers Section – Enable the required TikTok UA data grabbers. Each field in the form is described below.",{"id":2334,"title":1304,"titles":2335,"content":2336,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#name",[160,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: TikTok Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2338,"title":1309,"titles":2339,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#organization",[160,1295],{"id":2341,"title":2342,"titles":2343,"content":2344,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#create-a-tiktok-developer-app-if-you-dont-have-one","Create a TikTok Developer App (If You Don’t Have One)",[160,1295],"Before connecting Magify to TikTok, make sure you have: Created a TikTok For Business account.Registered as a developer. Guide: Register as a developer. Click Submit. After submission, your app will display the status Your app is currently pending approval. You will not be able to access the App ID and App Secret until the app is approved by TikTok.",{"id":2346,"title":2347,"titles":2348,"content":2349,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#app-id-and-app-secret","App ID and App Secret",[160,1295],"Once your TikTok developer app is approved, you can access the credentials needed to complete the integration: Go to TikTok for Business Developers > My Apps > [Your App].Copy both values and paste them into the Magify integration form. Important:You do not need a separate Developer App for each iOS or Android app you advertise.One App ID and App Secret provide access to all campaigns under the connected advertiser account.If you manage multiple TikTok Business Accounts, you must repeat the integration for each account (each requires separate OAuth authorization).",{"id":2351,"title":1319,"titles":2352,"content":2353,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#grabbers-section",[160],"Use this section to configure TikTok UA data grabbers for synchronization. Each field serves the following purpose:",{"id":2355,"title":2356,"titles":2357,"content":2358,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#tiktok-ua-grabber-audience","TikTok UA Grabber Audience",[160,1319],"Required field for configuring the Audience-level grabber. This grabber imports user acquisition data, including aggregated metrics by audience attributes (e.g., country, platform) and detailed metrics at the ad ID level for performance analysis. Name – Specify a unique name for this grabber configuration. For example:Marketing API Audience [Your Company Name]Is Enabled – Enable this option to start collecting data immediately. If left unchecked, the configuration is saved but inactive.",{"id":2360,"title":2361,"titles":2362,"content":2363,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#tiktok-ua-grabber-basic-ios","TikTok UA Grabber Basic (iOS)",[160,1319],"Field for configuring the Basic iOS data grabber. This grabber imports detailed performance data at the ad ID level for iOS campaigns. If you only have an Android app and do not run iOS campaigns, this field is not required. Name – Specify a unique name for this grabber configuration. For example: Marketing API iOS Basic [Your Company Name]Is Enabled – Enable this option to start collecting data immediately. If left unchecked, the configuration is saved but inactive.",{"id":2365,"title":2366,"titles":2367,"content":2368,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#authorize-in-tiktok-and-get-access-token","Authorize in TikTok and Get Access Token",[160],"After completing all fields in the form, click Save to store your settings. Then, in the Top Section, click the blue Authorize in TikTok button. You will be redirected to TikTok's authorization page. Grant the requested permissions and click Confirm. Once authorization is complete, you will be redirected back to the integration form in Magify. The Access Token field will be populated automatically. Important: Make sure to authorize with a TikTok user account that has access to the TikTok Business Account for which you intend to collect data.",{"id":2370,"title":1343,"titles":2371,"content":2372,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/tiktok#saving-the-configuration",[160],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from TikTok according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":165,"title":164,"titles":2374,"content":2375,"level":1110},[],"Step-by-step guide for integrating the Unity Ads grabber in Magify This guide explains how to set up a Unity Ads data grabber in the Magify analytics system. The grabber enables automated import of campaign data, creatives, performance metrics, and other UA-related information from your Unity Ads account into your analytics pipeline.",{"id":2377,"title":13,"titles":2378,"content":2379,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#getting-started",[164],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Unity Ads in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Unity Ads account by providing the required Key ID, Secret Key, and Organization ID, as well as naming the integration. Each field in the form is described below.",{"id":2381,"title":1295,"titles":2382,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#general-settings",[164],{"id":2384,"title":1304,"titles":2385,"content":2386,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#name",[164,1295],"Enter a descriptive name for the grabber configuration. This helps identify the data source among other integrations. Recommended format: Unity Ads Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2388,"title":1309,"titles":2389,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#organization",[164,1295],{"id":2391,"title":2392,"titles":2393,"content":2394,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#key-id-and-secret-key","Key ID and Secret Key",[164,1295],"To connect Unity Ads to Magify, you need a Key ID and Secret Key. These credentials are used to authenticate requests to Unity's Stats API v2, allowing Magify to fetch campaign performance data. Log in to your Unity Ads account.In the left menu, go to: Unity Ads User Acquisition > API Management.Click Service account to open the service account management page. Click the + New button in the top-right corner. In the Create service account pop-up:\nEnter a Service account name (e.g., Magify Integration).Optionally, add a description (e.g., Analytics)Click Create. After creating the service account, open its details page.In the Keys section, click + Add key. The system will generate: API Key and Secret Key. Important: The Secret Key is shown only once. Save it securely. Copy both and store them securely. These credentials will be required for API requests.Click Done. The Key ID will remain visible, but the Secret Key cannot be retrieved again.",{"id":2396,"title":2397,"titles":2398,"content":2399,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#permissions-for-unity-ads-api","Permissions for Unity Ads API",[164,1295],"To enable the integration and allow the grabber to retrieve data from the Unity Ads Reporting API, you must assign the correct role to the service account. Steps to configure: Go to the Unity Dashboard, navigate to Administration > Service accounts.Select the service account you will use for the integration.In the Organization roles section, click Manage organization roles. In the pop-up window, under the Growth section, assign the role: Advertise Stats API Viewer.Click Save to apply the changes.",{"id":2401,"title":2402,"titles":2403,"content":2404,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#unity-ads-organization-id","Unity Ads Organization ID",[164,1295],"The Organization ID is a unique identifier for your Unity organization. It is required in API requests, including those made through the Stats API v2. In the left-hand menu, open: Administration > Settings.Locate the Organization ID. You will need this value when configuring the Unity Ads Grabber in Magify.",{"id":2406,"title":1338,"titles":2407,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#is-enabled",[164,1295],{"id":2409,"title":1343,"titles":2410,"content":2411,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#saving-the-configuration",[164,1295],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Unity Ads according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2413,"title":467,"titles":2414,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/unity-ads#",[164],{"id":169,"title":168,"titles":2416,"content":2417,"level":1110},[],"Step-by-step guide to setting up a Vungle grabber in Magify This guide explains how to set up a Vungle (Liftoff Monetize) data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Vungle (Liftoff Monetize) account into your analytics pipeline.",{"id":2419,"title":13,"titles":2420,"content":2421,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#getting-started",[168],"Navigate to Configurations > Integration > UA Grabbers in the Magify interface.Find Vungle in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Vungle (Liftoff Monetize) account by providing the required API Key, App ID, and a name for the integration.",{"id":2423,"title":1295,"titles":2424,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#general-settings",[168],{"id":2426,"title":1299,"titles":2427,"content":2428,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#form-overview",[168,1295],"Top Section – General connection parameters: integration name, organization, and API Key.Applications Section – A list of individual Vungle applications for which data should be collected. Each field in the form is described below:",{"id":2430,"title":1304,"titles":2431,"content":2432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#name",[168,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Vungle Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2434,"title":1309,"titles":2435,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#organization",[168,1295],{"id":2437,"title":1533,"titles":2438,"content":2439,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#api-key",[168,1295],"The API Key is used to authenticate and retrieve performance data from Vungle’s reporting API. How to obtain it: Log in to your account at Liftoff Monetize Dashboard.In the top right corner of the dashboard, click on your user icon (or the three-dot menu), and select My Account.Navigate to the Overview tab. In the Overview Information section, you'll find your Reporting API Key. Official Vungle instructions. If you are unable to locate the key or don’t have access to the necessary section, contact your Vungle (Liftoff Monetize) account manager or Liftoff support by emailing tech-support@vungle.com.",{"id":2441,"title":1541,"titles":2442,"content":2443,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#applications-section",[168],"This section is used to map your Magify application to the corresponding app in the Vungle platform. This mapping ensures that performance data is correctly collected and attributed in Magify. Each application entry includes the following fields:",{"id":2445,"title":2446,"titles":2447,"content":2448,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#app-id","App ID",[168,1541],"The unique identifier of your app in the Vungle system. You can find this ID in your Vungle Dashboard. It is used to connect and retrieve performance data from Vungle.",{"id":2450,"title":1328,"titles":2451,"content":2452,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#application",[168,1541],"Select the corresponding application from the dropdown list. This should match the app previously added to Magify. It links the Vungle App ID to your internal app configuration for accurate data attribution. To add more application mappings, click the + Add Applications button.",{"id":2454,"title":1343,"titles":2455,"content":2456,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#saving-the-configuration",[168],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will begin collecting data from Vungle based on the configured schedule.\nBy default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":2458,"title":467,"titles":2459,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/vungle#",[168,1343],{"id":173,"title":172,"titles":2461,"content":2462,"level":1110},[],"Step-by-step guide for integrating the c grabber in Magify This guide explains how to set up the Kashkick UA data grabber in the Magify analytics system. The grabber enables automated import of user acquisition data such as campaign spend, impressions, clicks, installs, and other key performance metrics directly from your Kashkick partner account into your analytics pipeline.",{"id":2464,"title":13,"titles":2465,"content":2466,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#getting-started",[172],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Kashkick in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Kashkick account by providing the required credentials (API Key, API Network ID, Application, Match Part) and a custom integration name.",{"id":2468,"title":1295,"titles":2469,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#general-settings",[172],{"id":2471,"title":1299,"titles":2472,"content":2473,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#form-overview",[172,1295],"Top Section – General connection parameters: integration name, organization, API credentials, and API network.Mapping App Section – A list of individual Kashkick applications for which data should be collected. Each field in the form is described below:",{"id":2475,"title":1304,"titles":2476,"content":2477,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#name",[172,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Kashkick Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2479,"title":1309,"titles":2480,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#organization",[172,1295],{"id":2482,"title":1925,"titles":2483,"content":2484,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#api-key-and-api-network-id",[172,1295],"These credentials are used to authenticate access to your Kashkick reports. How to find them: Log in to your KashKick partner account.Navigate to Support > API to retrieve the following:\nAPI Key – The API key for the advertiser API.API Network ID – The network ID of the network you are working with. More information: Getting your API key – Tune Documentation",{"id":2486,"title":1338,"titles":2487,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#is-enabled",[172,1295],{"id":2489,"title":1933,"titles":2490,"content":2491,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#mapping-app-section",[172],"This section allows you to configure individual Kashkick applications for data collection. For each application, create a mapping entry with the following fields:",{"id":2493,"title":1938,"titles":2494,"content":1940,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#match-part",[172,1933],{"id":2496,"title":1328,"titles":2497,"content":2498,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#application",[172,1933],"Select the corresponding application from the list. It must already be integrated with Kashkick and added to Magify.",{"id":2500,"title":1343,"titles":2501,"content":2502,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/kashkich#saving-the-configuration",[172],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Kashkick according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":177,"title":176,"titles":2504,"content":2505,"level":1110},[],"Step-by-step guide to setting up a Zucks grabber in Magify This guide explains how to set up a Zucks data grabber in the Magify analytics system. The grabber enables the automated import of campaign data, creatives, performance metrics, and other UA-related information from your Zucks account into your analytics pipeline.",{"id":2507,"title":13,"titles":2508,"content":2509,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#getting-started",[176],"Navigate to Configurations > Integrations > UA Grabbers in the Magify interface.Find Zucks in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Zucks account by providing the required API Key, App ID, and a name for the integration.",{"id":2511,"title":1295,"titles":2512,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#general-settings",[176],{"id":2514,"title":1299,"titles":2515,"content":2516,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#form-overview",[176,1295],"Top Section – General connection parameters: integration name, organization, and API Key.Applications Section – A list of individual Zucks applications for which data should be collected. Each field in the form is described below:",{"id":2518,"title":1304,"titles":2519,"content":2520,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#name",[176,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Zucks Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2522,"title":1309,"titles":2523,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#organization",[176,1295],{"id":2525,"title":1533,"titles":2526,"content":2527,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#api-key",[176,1295],"The API Key is required to authenticate and authorize access to Zucks reporting data via their API. How to obtain it: Contact your Zucks account manager and request both the API Key.Mention that you need these credentials for integration with an analytics system such as Magify.",{"id":2529,"title":1338,"titles":2530,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#is-enabled",[176,1295],{"id":2532,"title":1541,"titles":2533,"content":2534,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#applications-section",[176],"This section allows you to link your Zucks application to the corresponding internal app in Magify. Each mapping entry ensures that the correct app-level data is collected and attributed. Each row includes the following fields:",{"id":2536,"title":2446,"titles":2537,"content":2538,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#app-id",[176,1541],"The unique identifier of your app as registered in the Zucks platform. Used to match incoming data from Zucks to a specific application. How to obtain it: Contact your Zucks account manager and request the App ID.",{"id":2540,"title":1328,"titles":2541,"content":2542,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#application",[176,1541],"Select the corresponding app from your list of applications in Magify. This connects the Zucks app ID to the correct internal app for analytics and reporting. Click + Add Applications to create additional mappings for other apps.",{"id":2544,"title":1343,"titles":2545,"content":2546,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ua-cost-tracking/zucks#saving-the-configuration",[176],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Zucks according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":181,"title":180,"titles":2548,"content":2549,"level":1110},[],"This article explains how to integrate Ads Mediation Data to collect revenue data from mediation platforms and consolidate ad earnings reporting.",{"id":2551,"title":467,"titles":2552,"content":2553,"level":1110},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data#",[],"Gather revenue data from mediation platforms for a consolidated view of your ad earnings. Navigate to Integrations > Mediation GrabbersConnect ad mediation networks (Applovin MAX, LevelPlay, etc.)Enable revenue reporting",{"id":187,"title":186,"titles":2555,"content":2556,"level":1110},[],"Step-by-step guide to setting up an Applovin Max grabber in Magify This guide explains how to set up an Applovin Max data grabber in the Magify analytics system. The grabber enables the automated import of mediation data, including network performance, revenue metrics, waterfall configurations, and other monetization-related information, from your Applovin Max account into your analytics pipeline.",{"id":2558,"title":13,"titles":2559,"content":2560,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#getting-started",[186],"Navigate to Configurations > Integration > Mediation Grabbers in the Magify interface.Find Applovin Max in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Applovin Max mediation account by providing the required Report Key, Aggregated Report Grabber, User Revenue Grabber, Aggregated (with requests) Grabber, and a name for the integration.",{"id":2562,"title":1295,"titles":2563,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#general-settings",[186],{"id":2565,"title":1299,"titles":2566,"content":2567,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#form-overview",[186,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applovin Max Report Grabbers Section – A list of individual Applovin Max applications to be synced. Each field in the form is described below:",{"id":2569,"title":1304,"titles":2570,"content":2571,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#name",[186,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Applovin Max Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2573,"title":1309,"titles":2574,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#organization",[186,1295],{"id":2576,"title":2577,"titles":2578,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#setting-up-applovin-max-integration","Setting Up Applovin Max Integration",[186],{"id":2580,"title":2581,"titles":2582,"content":2583,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#step-1-retrieve-the-report-key-in-applovin","Step 1: Retrieve the Report Key in Applovin",[186,2577],"Log in to your Applovin account.Navigate to the Keys section in your account.Locate and copy the Report Key.",{"id":2585,"title":2586,"titles":2587,"content":2588,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#step-2-configure-applovin-max-in-magify","Step 2: Configure Applovin Max in Magify",[186,2577],"Go to Magify and navigate to: Configurations → Integration → Mediation Grabbers.Click Add Grabber Applovin Max.Paste the Report Key in the appropriate field.Fill in all other required fields.",{"id":2590,"title":2591,"titles":2592,"content":2593,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/applovin-max#step-3-add-grabbers-in-magify","Step 3: Add Grabbers in Magify",[186,2577],"Add the following grabbers to complete the integration: Aggregated Report GrabberUser Revenue Grabber Aggregated (with requests) Grabber Click Save By default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":191,"title":190,"titles":2595,"content":2596,"level":1110},[],"Step-by-step guide to setting up a LevelPlay grabber in Magify This guide explains how to set up a LevelPlay data grabber in the Magify analytics system. The grabber enables the automated import of mediation data, including network performance, revenue metrics, waterfall configurations, and other monetization-related information, from your LevelPlay (IronSource) account into your analytics pipeline.",{"id":2598,"title":13,"titles":2599,"content":2600,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#getting-started",[190],"Navigate to Configurations > Integration > Mediation Grabbers in the Magify interface.Find LevelPlay in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your LevelPlay mediation account by providing the required Secret Key, Refresh Token, Application, App Key, and a name for the integration.",{"id":2602,"title":1295,"titles":2603,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#general-settings",[190],{"id":2605,"title":1299,"titles":2606,"content":2607,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#form-overview",[190,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.LevelPlay Grabbers Section – A list of individual LevelPlay applications to be synced. Each field in the form is described below:",{"id":2609,"title":1304,"titles":2610,"content":2611,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#name",[190,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: LevelPlay Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2613,"title":1309,"titles":2614,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#organization",[190,1295],{"id":2616,"title":2039,"titles":2617,"content":2618,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#secret-key-and-refresh-token",[190,1295],"Used to authenticate access to your LevelPlay mediation account. Secret Key – A confidential key generated in your LevelPlay (IronSource) account. Used in combination with the refresh token to authorize API access.Refresh Token – A long-lived token associated with your IronSource account. Used to obtain short-term access tokens for secure and continuous API communication. How to obtain them: Log in to your LevelPlay (IronSource) account.Navigate to the Account section from the menu. Go to the API tab.In the API Keys section, locate and copy your:\nSecret KeyRefresh Token",{"id":2620,"title":2621,"titles":2622,"content":2623,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#levelplay-grabbers-section","LevelPlay Grabbers Section",[190],"Use this section to configure individual applications for data syncing. Each field serves the following purpose:",{"id":2625,"title":1304,"titles":2626,"content":2627,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#name-1",[190,2621],"A custom name for this specific grabber instance. Used to identify it within the list.",{"id":2629,"title":1328,"titles":2630,"content":2631,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#application",[190,2621],"Select the corresponding application from the dropdown list.",{"id":2633,"title":1338,"titles":2634,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#is-enabled",[190,2621],{"id":2636,"title":2637,"titles":2638,"content":2639,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#app-key","App Key",[190,2621],"The unique App Key from your LevelPlay dashboard. Required for accessing the mediation data. How to obtain it: Navigate to the LevelPlay section in your account.Click on the Apps menu item.Locate your app — the App Key will be listed below the app name.",{"id":2641,"title":1343,"titles":2642,"content":2643,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-mediation-data/level-play#saving-the-configuration",[190],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will begin collecting data from LevelPlay based on the configured schedule.\nBy default, each grabber is configured to load data for 1 day when created. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":195,"title":194,"titles":2645,"content":2646,"level":1110},[],"This article explains how to track ad monetization performance across different networks by configuring ad revenue tracking and analyzing key metrics like eCPM, impressions, and fill rates.",{"id":2648,"title":467,"titles":2649,"content":2650,"level":1110},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data#",[],"Monitor ad monetization performance across different networks. Navigate to Integrations > Monetization GrabbersConfigure ad revenue trackingGain insights into eCPM, impressions, and fill rates",{"id":201,"title":200,"titles":2652,"content":2653,"level":1110},[],"Step-by-step guide to setting up an AdMob grabber in Magify This guide explains how to set up an AdMob monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data, including ad revenue, impressions, eCPM, ad unit performance, and other AdMob-specific metrics from your Google AdMob account into your analytics pipeline.",{"id":2655,"title":13,"titles":2656,"content":2657,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#getting-started",[200],"Navigate to Configurations > Integrations > Monetizations Grabbers in the Magify interface.Find AdMob in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your AdMob account by providing the required credentials: Publisher ID, Client ID, Client Secret, Refresh Token, Grabbing Start Date, and a custom integration name. Each field in the form is described below.",{"id":2659,"title":1304,"titles":2660,"content":2661,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#name",[200,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: AdMob Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2663,"title":1309,"titles":2664,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#organization",[200,13],{"id":2666,"title":2667,"titles":2668,"content":2669,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#publisher-id","Publisher ID",[200,13],"The Publisher ID is a unique identifier assigned to your AdMob account. It is required to authenticate and retrieve monetization data via the AdMob API. How to find it: Log in to your Google AdMob account.Сlick on your Google account avatar in the top right corner of the screen.In the dropdown that appears, locate and copy your Publisher ID — it will be shown under your account information, formatted like: pub-xxxxxxxxxxxxxxxx",{"id":2671,"title":1829,"titles":2672,"content":2673,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#client-id-and-client-secret",[200,13],"These credentials are used to authenticate Magify’s access to your AdMob data through the Google OAuth 2.0 API. They are required to authorize secure communication and allow Magify to retrieve monetization reports from your AdMob account. How to obtain them: Go to the Google Cloud Console.Click on the APIs & Services button in the menu.Open the project picker at the upper-left of the page. Select New Project, or choose an existing project you already created for this app. In the case you are creating a new project for this purpose, provide a Project name in the dialog box that appears and click Create. In the left sidebar, select OAuth consent screen. If you see a screen that says \"Google Auth Platform not configured yet\", click the Get started button to begin setting up your OAuth configuration.On the App Information screen, fill in the required fields and check the box \"I agree to the Google API Services: User Data Policy\". Click Continue to complete the OAuth consent screen setup.Once the consent screen setup is complete, you’ll be redirected to the OAuth Overview page.Click the Create OAuth client button to generate your credentials. You will proceed to configure your OAuth 2.0 Client ID and Client Secret, which are required for the AdMob grabber integration in Magify. On the Create OAuth client ID screen: In the Application type dropdown, select Web application.Provide a name for your app in the Name field (e.g., Magify AdMob Client). This name is internal and used only for your reference.In the Authorized redirect URIs section, you must enter the following URL:https://developers.google.com/oauthplayground This is required for using OAuth 2.0 Playground to manually generate a refresh token. Once completed, click Create to generate your Client ID and Client Secret. These credentials will be used in the Magify interface to connect the AdMob grabber. Go to the API Library. To access the list of available APIs: click on Library in the left-hand menu (located below Enabled APIs & services). In the API Library, scroll to the Advertising section and locate the AdSense Management API card:\nClick on the AdSense Management API.Then, click the Enable button on the API details page.",{"id":2675,"title":2676,"titles":2677,"content":2678,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#refresh-token","Refresh Token",[200,13],"To authenticate requests to the AdSense API, you'll need a Refresh token. Follow these steps: Go to the OAuth 2.0 Playground.Click the settings icon (⚙️) in the upper right corner. From the Force prompt drop-down, select \"No\", and check the box \"Use your own OAuth credentials\".Then, input your Client ID and Client Secret. In Step 1: Select & Authorize APIs, scroll down to find AdSense Management API v2 and select the following scopes:\nhttps://www.googleapis.com/auth/adsensehttps://www.googleapis.com/auth/adsense.readonlyIn Step 1: Select & Authorize APIs, scroll down and find AdMob API v1 and select the following scopes:\nhttps://www.googleapis.com/auth/admob.readonlyhttps://www.googleapis.com/auth/admob.reportClick Authorize APIs to continue the authentication flow. After authorizing the selected scopes, you will receive an Authorization Code in Step 1. Click the Exchange authorization code for tokens button. You will then receive:\na Refresh Token (used to generate new access tokens)an Access Token (used for authenticated API requests)",{"id":2680,"title":2681,"titles":2682,"content":2683,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#grabbing-start-date","Grabbing Start Date",[200,13],"This parameter defines the starting date for data fetching from the network’s API. Format: YYYY-MM-DD (e.g., 2025-12-01)",{"id":2685,"title":1338,"titles":2686,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#is-enabled",[200,13],{"id":2688,"title":1343,"titles":2689,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/admob#saving-the-configuration",[200],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from HyprMX according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":205,"title":204,"titles":2692,"content":2693,"level":1110},[],"Step-by-step guide for integrating the AlgoriX grabber in Magify This guide explains how to set up the AlgoriX monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your AlgoriX account into your analytics pipeline.",{"id":2695,"title":13,"titles":2696,"content":2697,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x#getting-started",[204],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find AlgoriX in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your AlgoriX account by providing the required credentials: an User ID, an Authorization, and a custom integration name. Each field in the form is described below.",{"id":2699,"title":1295,"titles":2700,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x#general-settings",[204],{"id":2702,"title":1304,"titles":2703,"content":2704,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x#name",[204,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: AlgoriX Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2706,"title":1309,"titles":2707,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x#organization",[204,1295],{"id":2709,"title":2710,"titles":2711,"content":2712,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x#user-id-and-authorization","User ID and Authorization",[204,1295],"The User ID is a unique identifier associated with your AlgoriX account. It is used for authentication when accessing the Reporting API and allows the system to associate requests with your account.The Authorization Token is a secret key required to validate your access rights. It works together with the User ID and is also required for making API requests. How to obtain them: The User ID and Authorization are not visible in the AlgoriX dashboard.To obtain them, contact your AlgoriX account manager and request:\nyour User IDyour Authorization Token These credentials are required to configure access to the Reporting API and must be included with each request.",{"id":2714,"title":1338,"titles":2715,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x#is-enabled",[204,1295],{"id":2717,"title":1343,"titles":2718,"content":2719,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/algori-x#saving-the-configuration",[204],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from AlgoriX according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":209,"title":208,"titles":2721,"content":2722,"level":1110},[],"Step-by-step guide for integrating the Amazon Ads grabber in Magify This guide explains how to set up the Amazon Ads monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Amazon Publisher Services Console into your analytics pipeline.",{"id":2724,"title":13,"titles":2725,"content":2726,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/amazon-ads#getting-started",[208],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Amazon Ads in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Amazon Publisher Services (APS) S3 reports by providing the required credentials: an AWS Access Key ID, an AWS Secret Access Key, a bucket name, a parent folder, a region, and a custom integration name. Each field in the form is described below.",{"id":2728,"title":1304,"titles":2729,"content":2730,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/amazon-ads#name",[208,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Amazon Ads Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2732,"title":1309,"titles":2733,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/amazon-ads#organization",[208,13],{"id":2735,"title":2736,"titles":2737,"content":2738,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/amazon-ads#aws-access-key-id-aws-secret-access-key-bucket-parent-folder-region-and-expiration-date","AWS Access Key ID, AWS Secret Access Key, Bucket, Parent Folder, Region, and Expiration Date",[208,13],"These credentials are required to enable Magify to access your Amazon Publisher Services (APS) mobile reports via Amazon S3. AWS Access Key ID – a public identifier used to authenticate API access to Amazon S3. It works together with the secret key.AWS Secret Access Key – a private key paired with the access key ID. It must be kept secure and is required to sign S3 requests.Bucket – the name of the Amazon S3 bucket that stores APS mobile reports. This value is the first part of the Parent Folder path.Parent Folder – the full path inside the bucket where your report files are stored. It includes your publisher-specific directory and must be copied exactly as shown in the console (excluding the s3:// prefix).Expires on – the expiration date of your current credentials. APS rotates S3 access keys every 90 days. Update them in Magify before they expire to prevent data sync issues. How to find them: Log in to the Amazon Publisher Services Console.In the left-hand menu, go to Admin > S3 Credentials.Under S3 Location, copy the Parent Folder path.\nExtract the bucket name (e.g. aps-reporting-mobile) from the beginning of the path.Use the remaining part as the Parent Folder.In the Active Credentials section, copy:\nAccess Key IDSecret Access KeyExpiration Date (Expires on) Use us-west-2 as the Region (fixed for all APS S3 integrations).",{"id":2740,"title":1338,"titles":2741,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/amazon-ads#is-enabled",[208,13],{"id":2743,"title":1343,"titles":2744,"content":2745,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/amazon-ads#saving-the-configuration",[208],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Amazon Ads according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":213,"title":212,"titles":2747,"content":2748,"level":1110},[],"Step-by-step guide for integrating the AppBroda grabber in Magify This guide explains how to set up the AppBroda monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from the AppBroda platform into your analytics pipeline.",{"id":2750,"title":13,"titles":2751,"content":2752,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#getting-started",[212],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find AppBroda in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your AppBroda account by providing the required credentials: a Token and a custom integration name.",{"id":2754,"title":1295,"titles":2755,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#general-settings",[212],{"id":2757,"title":1299,"titles":2758,"content":2759,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#form-overview",[212,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual AppBroda applications to be synced. Each field in the form is described below.",{"id":2761,"title":1304,"titles":2762,"content":2763,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#name",[212,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: AppBroda Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2765,"title":1309,"titles":2766,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#organization",[212,1295],{"id":2768,"title":2769,"titles":2770,"content":2771,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#token","Token",[212,1295],"The API Token is a unique authorization key used to authenticate your integration with the AppBroda platform. It allows your system to securely request monetization data via the API. How to find it: Log in to the AppBroda Console.In the left-hand menu, click Settings.Navigate to the Account Details tab (located at the top of the page).The API Token is displayed in your profile section. If it's not visible, or if the token field is empty, contact your AppBroda account manager to request access.",{"id":2773,"title":1338,"titles":2774,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#is-enabled",[212,1295],{"id":2776,"title":1343,"titles":2777,"content":2778,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-broda#saving-the-configuration",[212],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from AppBroda according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":216,"title":88,"titles":2780,"content":2781,"level":1110},[],"Step-by-step guide for integrating the AppLovin grabber in Magify This guide explains how to set up the AppLovin monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your AppLovin platform into your analytics pipeline.",{"id":2783,"title":13,"titles":2784,"content":2785,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#getting-started",[88],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find AppLovin in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your AppLovin platform by providing the required credentials: an API Key and a custom integration name. Each field in the form is described below.",{"id":2787,"title":1295,"titles":2788,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#general-settings",[88],{"id":2790,"title":1304,"titles":2791,"content":1725,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#name",[88,1295],{"id":2793,"title":1309,"titles":2794,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#organization",[88,1295],{"id":2796,"title":1731,"titles":2797,"content":2798,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#report-key",[88,1295],"The Report Key is a unique API credential required to access monetization reporting data from the Applovin platform. It authenticates API requests and allows Magify to import your ad revenue, impressions, eCPM, and other monetization metrics into your analytics environment. How to find it: Log in to your Applovin dashboard.In the left sidebar, go to Account > Keys.Locate the Report Key field. Copy the key and paste it into the appropriate field in the Magify integration form.",{"id":2800,"title":1736,"titles":2801,"content":2802,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#api-endpoint",[88,1295],"This field defines the base URL used to send API requests to Applovin’s reporting server. Default value: https://r.applovin.com/Purpose: It specifies the destination for API calls to fetch monetization data (e.g., ad revenue, impressions, eCPM).Behavior: The field is automatically pre-filled and does not require manual changes in most cases. Only modify this field if you have a custom setup or advanced data security requirements. If unsure, please contact Magify support before changing the endpoint.",{"id":2804,"title":1338,"titles":2805,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#is-enabled",[88,1295],{"id":2807,"title":1343,"titles":2808,"content":1745,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/app-lovin#saving-the-configuration",[88],{"id":220,"title":219,"titles":2810,"content":2811,"level":1110},[],"Step-by-step guide for integrating the BidMachine grabber in Magify This guide explains how to set up an BidMachine monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data — including ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics — directly from your Bidmachine account into your analytics pipeline.",{"id":2813,"title":13,"titles":2814,"content":2815,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine#getting-started",[219],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find BidMachine in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your BidMachine account by providing the required credentials: your Username, Password and a custom integration name. Each field in the form is described below.",{"id":2817,"title":1295,"titles":2818,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine#general-settings",[219],{"id":2820,"title":1304,"titles":2821,"content":2822,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine#name",[219,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: BidMachine Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2824,"title":1309,"titles":2825,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine#organization",[219,1295],{"id":2827,"title":2278,"titles":2828,"content":2829,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine#username-and-password",[219,1295],"To connect Magify to your BidMachine account and retrieve monetization data, you must provide Username and Password for your SSP account. These credentials are required for Basic Authentication when making API requests and are used to access ad revenue, impressions, and other performance metrics. How to obtain them: The username and password are the same credentials used to access the BidMachine dashboard.These credentials are not created manually — they are issued by your BidMachine account manager.If you do not have access, please contact your account manager to request SSP reporting credentials.",{"id":2831,"title":1338,"titles":2832,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine#is-enabled",[219,1295],{"id":2834,"title":1343,"titles":2835,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bid-machine#saving-the-configuration",[219],{"id":223,"title":96,"titles":2837,"content":2838,"level":1110},[],"Step-by-step guide for integrating the BIGO Ads grabber in Magify This guide explains how to set up the BIGO Ads monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your BIGO Ads platform into your analytics pipeline.",{"id":2840,"title":13,"titles":2841,"content":2842,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#getting-started",[96],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find BIGO Ads in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your BIGO Ads platform by providing the required credentials: a Developer ID, a Token, an Expires on, and a custom integration name. Each field in the form is described below.",{"id":2844,"title":1295,"titles":2845,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#general-settings",[96],{"id":2847,"title":1304,"titles":2848,"content":1790,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#name",[96,1295],{"id":2850,"title":1309,"titles":2851,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#organization",[96,1295],{"id":2853,"title":2854,"titles":2855,"content":2856,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#developer-id","Developer ID",[96,1295],"Developer ID is a unique identifier assigned to your developer account in the BIGO Ads platform. It is required for authentication and is essential for integrating your data with Magify. How to find it: Go to BIGO Ads SSP account.In the top navigation menu, click on Account Info.In the left sidebar, select Account Information.Under the Basic Information section, locate your Developer ID and copy it.",{"id":2858,"title":2859,"titles":2860,"content":2861,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#access-token-and-expiration","Access Token and Expiration",[96,1295],"Token is an authentication key used to access the BIGO Ads Reporting API. Valid Date (also referred to as Expires On) indicates the expiration date of the current token. Once the token expires, you will need to reset it to continue receiving reporting data. These credentials are required for Magify to connect and grab data from the BIGO Ads platform. How to find them: Go to BIGO Ads SSP account.In the top menu, click Integration.From the left sidebar, select API.Under BIGO Ads Reporting API, click the Token link.A pop-up will appear showing:\nYour TokenIts Valid Date (expiration date)Use the Copy button to save the Token securely.If needed, click Reset Token to generate a new one.",{"id":2863,"title":1338,"titles":2864,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#is-enabled",[96,1295],{"id":2866,"title":1343,"titles":2867,"content":1805,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/bigo-ads#saving-the-configuration",[96],{"id":226,"title":100,"titles":2869,"content":2870,"level":1110},[],"Step-by-step guide for integrating the Chartboost grabber in Magify This guide explains how to set up the Chartboost monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Chartboost platform into your analytics pipeline.",{"id":2872,"title":13,"titles":2873,"content":2874,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#getting-started",[100],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Chartboost in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Chartboost account by providing the required credentials: a Client Key, a Client Secret, an App ID, and a custom integration name.",{"id":2876,"title":1295,"titles":2877,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#general-settings",[100],{"id":2879,"title":1299,"titles":2880,"content":2881,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#form-overview",[100,1295],"Top Section – General connection parameters: integration name, organization, and API credentials. This section is used to configure access for both grabbers: ChartBoostGrabber – general monetization data (e.g., interstitials, rewarded videos)ChartBoostMonetizationBannerGrabber – banner monetization data These grabbers use the same credentials and are grouped in a single entity. You need to create both grabber instances, one for each type, under the shared settings. Applications Section – A list of individual Chartboost applications to be synced. Each field in the form is described below.",{"id":2883,"title":1304,"titles":2884,"content":1823,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#name",[100,1295],{"id":2886,"title":1309,"titles":2887,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#organization",[100,1295],{"id":2889,"title":1829,"titles":2890,"content":1831,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#client-id-and-client-secret",[100,1295],{"id":2892,"title":2893,"titles":2894,"content":2895,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#chartboostgrabber-and-chartboostmonetizationbannergrabber","ChartBoostGrabber and ChartBoostMonetizationBannerGrabber",[100,1295],"This section includes two grabbers responsible for fetching monetization data from Chartboost: ChartBoostGrabber – collects general monetization data (e.g. impressions, revenue, eCPM, etc.)ChartBoostMonetizationBannerGrabber – specifically collects banner monetization metrics Each grabber form contains the following fields: Name – an internal name for the grabber configuration, used for reference in the system. Optional field – recommended to fill in for easier navigation.Is enabled – a toggle to activate or deactivate the grabber. Enable this option to start collecting data immediately. If left unchecked, the configuration is saved but inactive. You must configure both grabbers separately, even though they use the same API credentials. This ensures full coverage of all monetization formats supported by Chartboost.",{"id":2897,"title":1541,"titles":2898,"content":2899,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#applications-section",[100],"Use this section to configure individual applications for data synchronization with Chartboost. Each field serves the following purpose:",{"id":2901,"title":2446,"titles":2902,"content":2903,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#app-id",[100,1541],"App ID is a unique identifier assigned to each application in your Chartboost account. It is required to link your app’s monetization data with the corresponding entity in your analytics system. How to find it: Log in to the Chartboost dashboard.In the left sidebar, click Apps Management.Select the app you want to retrieve the ID for.On the right-hand side, under App Information, you'll find the APP ID field.",{"id":2905,"title":1328,"titles":2906,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#application",[100,1541],"Select the corresponding application(s) from the dropdown list. Click + Add Applications to include additional apps from your account.",{"id":2909,"title":1343,"titles":2910,"content":1840,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/chartboost#saving-the-configuration",[100],{"id":230,"title":229,"titles":2912,"content":2913,"level":1110},[],"Step-by-step guide to setting up a DT Exchange grabber in Magify This guide explains how to set up a DT Exchange (Fyber) monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data, including ad revenue, impressions, eCPM, ad unit performance, and other AdMob-specific metrics from your Digital Turbine account into your analytics pipeline.",{"id":2915,"title":13,"titles":2916,"content":2917,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#getting-started",[229],"Navigate to Configurations > Integration > Monetization Grabbers in the Magify interface.Find DT Exchange in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Digital Turbine (DT Exchange) account by providing the required credentials: Publisher ID, Consumer Key, Consumer Secret, Reporting Client ID, Reporting Client Secret, App ID, and a custom integration name.",{"id":2919,"title":1295,"titles":2920,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#general-settings",[229],{"id":2922,"title":1299,"titles":2923,"content":2924,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#form-overview",[229,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications Section – A list of individual DT Exchange applications to be synced. Each field in the form is described below:",{"id":2926,"title":1304,"titles":2927,"content":2928,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#name",[229,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: DT Exchange Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2930,"title":1309,"titles":2931,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#organization",[229,1295],{"id":2933,"title":2934,"titles":2935,"content":2936,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#consumer-key-consumer-secret-publisher-id","Consumer key, Consumer secret, Publisher ID",[229,1295],"Used to authenticate access to your Digital Turbine (DT Exchange) Basic Reporting API account. Publisher ID – A unique identifier for your Digital Turbine account. Required for all API requests to associate them with your reporting data.Consumer Key – A public key used to initiate secure API requests. Works together with the Consumer Secret for authentication.Consumer Secret – A confidential key used in combination with the Consumer Key to authorize and validate API access. How to obtain them: Log in to your Digital Turbine account and open the DT Console.Navigate to your User Profile. Scroll down to the Basic Reporting API – Credentials section.Copy the Publisher ID, Consumer Key, and Consumer Secret.",{"id":2938,"title":2939,"titles":2940,"content":2941,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#reporting-client-id-and-reporting-client-secret","Reporting Client ID and Reporting Client Secret",[229,1295],"Used to authenticate access to your Digital Turbine (DT Exchange) Advanced Reporting API account. Client ID – A public identifier for your application. Required to initiate requests to the Advanced Reporting API. Client Secret – A private key paired with the Client ID. Used to securely authorize and authenticate API access. How to obtain them: In your User Profile, scroll down to the Advanced Reporting API – Credentials section.Copy the Client ID and Client Secret.",{"id":2943,"title":1338,"titles":2944,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#is-enabled",[229,1295],{"id":2946,"title":2947,"titles":2948,"content":2949,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#application-section","Application Section",[229],"Use this section to configure individual applications for data synchronization with DT Exchange. Each field serves the following purpose:",{"id":2951,"title":2446,"titles":2952,"content":2953,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#app-id",[229,2947],"Used to identify your application within the Digital Turbine (DT Exchange) platform for data syncing and reporting purposes. How to find it: Log in to your Digital Turbine account and open the DT Console.From the left-hand menu, click Monetization > App Management. The App Management dashboard will open. In the Apps table below the graph, locate your application by name.The App ID will be displayed directly under the app name. Alternatively: In the App Management dashboard, click on your app to open the App Details page.The App ID will be displayed at the top, next to the app status",{"id":2955,"title":1328,"titles":2956,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#application",[229,2947],{"id":2958,"title":1343,"titles":2959,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/dt-exchange#saving-the-configuration",[229],{"id":233,"title":108,"titles":2961,"content":2962,"level":1110},[],"Step-by-step guide for integrating the Facebook grabber in Magify This guide explains how to set up the Facebook monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Facebook account into your analytics pipeline.",{"id":2964,"title":13,"titles":2965,"content":2966,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#getting-started",[108],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Facebook in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Facebook account by providing the required credentials: a Facebook App ID, a Facebook App Token, a Source (iOS app), a Source (Android app), a Grabbing Start Date, a Facebook App Secret, an Expires on, a Config ID and a custom integration name. Each field in the form is described below.",{"id":2968,"title":1304,"titles":2969,"content":2970,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#name",[108,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Facebook Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":2972,"title":2973,"titles":2974,"content":2975,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#facebook-app-id-and-app-secret","Facebook App ID and App Secret",[108,13],"The App ID and App Secret are unique credentials used to authenticate requests to the Facebook Audience Network Reporting API. They allow your integration to securely access monetization reporting data for your app. Unlike traditional ad networks, Facebook uses an application-based authentication model. Your App ID identifies the app within Facebook’s ecosystem, while the App Secret is used to securely verify your application when generating tokens. How to find them: Go to Meta for Developers.From the top menu, select My Apps and choose the app linked to your monetization setup.In the left navigation panel, click Settings > Basic.Locate the following values:\nApp ID – Copy this unique identifier.App Secret – Click Show, confirm your Facebook password, and copy the secret key.",{"id":2977,"title":2978,"titles":2979,"content":2980,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#source-ios-app-and-source-android-app","Source (iOS app) and Source (Android app)",[108,13],"The Source fields determine which app in your Facebook Audience Network account the monetization reports will be pulled from. To ensure proper data retrieval, select the specific app associated with your Facebook App ID for each platform (iOS and Android, if applicable). What to do: For Source (iOS app):\nSelect the iOS version of your app from the dropdown.For Source (Android app):\nSelect the Android version of your app from the dropdown. Important:If your app is available on only one platform (iOS or Android), fill in only the corresponding field.Make sure the selected app matches the App ID you provided earlier.If the app does not appear in the list, check the following:\nHave you added it to the Magify system?Is it properly configured in Facebook Audience Network?",{"id":2982,"title":2681,"titles":2983,"content":2984,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#grabbing-start-date",[108,13],"The Grabbing Start Date specifies the earliest date from which the system will start pulling monetization data from the Facebook Audience Network Reporting API. Click the date picker in this field.Select the date from which you want to start collecting data (for example, 2025-01-01).The system will import all available data from this date up to today.",{"id":2986,"title":2987,"titles":2988,"content":2989,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#facebook-login-setup-for-the-authorize-in-facebook-button","Facebook Login Setup for the \"Authorize in Facebook\" Button",[108,13],"The Authorize in Facebook button is used for OAuth 2.0 authentication to obtain an Access Token, which is required for the grabber to retrieve monetization reports from the Facebook Audience Network Reporting API. Requirements Developer or higher role in the Facebook Business Manager.An app created in Meta for Developers.App status set to Live (not Development).Business Verification completed for production.Product Facebook Login for Business enabled. Steps to configure: Open your appGo to Meta for Developers.In My Apps, select the app you use for integration.Enable Facebook Login (if not already added)In the left menu, scroll down to Products.Click Add Product, find Facebook Login for Business, and click Set Up.Configure Redirect URI (See the screenshot below.)\nGo to Facebook Login for Business > Settings.In the Valid OAuth Redirect URIs field, enter the redirect URL used by your system after authentication: https://board.magify.com/Click Save Changes.Add Allowed Domains (See the screenshot below)\nIn Allowed Domains for the JavaScript SDK, enter your domain: https://board.magify.com/Do NOT enable \"Login with the JavaScript SDK\". Keep it set to No. PermissionsNavigate to App Review > Permissions and Features.Request and get approval for:\nread_audience_network_insights (required for monetization reports).business_management (if needed for business resources).App StatusGo to Settings > Basic.Ensure:\nThe app is in Live mode.Business account is linked.Business Verification is completed.Authorize in the grabberAfter completing all steps above, return to the grabber settings form.Click the Authorize in Facebook button.Complete the Facebook login and authorization process. The system will save the token and link your account.",{"id":2991,"title":2992,"titles":2993,"content":2994,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#system-user-access-token","System User Access Token",[108],"The System User Access Token is required to authenticate requests to the Facebook Audience Network Reporting API. This token is generated in Meta Business Manager and linked to your Business App.",{"id":2996,"title":467,"titles":2997,"content":2690,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/facebook#",[108,2992],{"id":237,"title":236,"titles":2999,"content":3000,"level":1110},[],"Step-by-step guide for integrating the HyprMX grabber in Magify This guide explains how to set up the HyprMX monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your HyprMX account (via Google Looker Studio) into your analytics pipeline.",{"id":3002,"title":13,"titles":3003,"content":3004,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#getting-started",[236],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find HyprMX in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your HyprMX account by providing the required credentials: an API Key, an App ID, and a custom integration name.",{"id":3006,"title":1295,"titles":3007,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#general-settings",[236],{"id":3009,"title":1299,"titles":3010,"content":3011,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#form-overview",[236,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual HyprMX applications to be synced. Each field in the form is described below.",{"id":3013,"title":1304,"titles":3014,"content":3015,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#name",[236,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: HyprMX Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3017,"title":1309,"titles":3018,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#organization",[236,1295],{"id":3020,"title":1533,"titles":3021,"content":3022,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#api-key",[236,1295],"An API Key is a unique identifier used to authenticate requests to the HyprMX Reporting API. It ensures that only authorized users can access your account’s reporting data. Unlike most ad networks, HyprMX does not use a traditional web dashboard. Instead, reporting and credentials are provided through Google Looker Studio. Access is granted individually by a HyprMX account manager. How to find it: Request access to the Looker Studio dashboard from your HyprMX account manager. Provide a corporate email address to receive access.Open the dashboard link sent by the manager.In the top-left corner of the report, switch to the Account Details tab.Locate the section titled REPORTING API KEY.Your unique key will appear below the label: \"Below is the API Key for our Reporting API\". Copy the API key — it will be required for authentication in your integration.",{"id":3024,"title":1338,"titles":3025,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#is-enabled",[236,1295],{"id":3027,"title":2947,"titles":3028,"content":3029,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#application-section",[236],"Use this section to configure individual applications for data synchronization with HyprMX. Each field serves the following purpose:",{"id":3031,"title":2446,"titles":3032,"content":3033,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#app-id",[236,2947],"In the context of HyprMX monetization and API integration, the Distributor ID is a unique identifier assigned to each of your apps. It is required when retrieving app-level data via the Reporting API. How to find it: Open the HyprMX Looker Studio dashboard using the link provided by your account manager.In the top-left menu, switch to the Integration Details tab.You will see a table listing your active apps.Each row includes a Distributor ID, shown in the corresponding column next to the app name. Copy the Distributor ID for the app you want to integrate.",{"id":3035,"title":1328,"titles":3036,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#application",[236,2947],{"id":3038,"title":1343,"titles":3039,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/hyprmx#saving-the-configuration",[236],{"id":241,"title":240,"titles":3041,"content":3042,"level":1110},[],"Step-by-step guide for integrating the InMobi grabber in Magify This guide explains how to set up the InMobi monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your InMobi account into your analytics pipeline.",{"id":3044,"title":13,"titles":3045,"content":3046,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#getting-started",[240],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find InMobi in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your InMobi account by providing the required credentials: a Login, a Secret Key, an Account ID, an App ID, and a custom integration name",{"id":3048,"title":1295,"titles":3049,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#general-settings",[240],{"id":3051,"title":1299,"titles":3052,"content":3053,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#form-overview",[240,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual InMobi applications to be synced. Each field in the form is described below.",{"id":3055,"title":1304,"titles":3056,"content":3057,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#name",[240,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: InMobi Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3059,"title":1309,"titles":3060,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#organization",[240,1295],{"id":3062,"title":3063,"titles":3064,"content":3065,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#login","Login",[240,1295],"This is the account identifier used to authenticate access to the InMobi Reporting API. It specifies which InMobi account Magify connects to when collecting monetization data. In InMobi’s interface, this value corresponds to your registered account email (Login). It is required together with the API Key to enable secure data retrieval for revenue, impressions, and click metrics.",{"id":3067,"title":3068,"titles":3069,"content":3070,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#secret-api-key","Secret (API Key)",[240,1295],"This is a secure credential used to authenticate requests to the InMobi Reporting API. It allows Magify to collect monetization data such as revenue, impressions, and clicks for your account. In InMobi’s interface, this key is labeled as an API Key, and it is required for all automated data access. How to find it: Log in to the InMobi dashboard.In the left-side menu, go to My Account > Account Settings.Open the API Key tab.Click Generate API Key in the top-right corner.In the confirmation dialog, select your email and click Generate API Key again.Copy the key shown. This is your Secret required in Magify. The API Key is shown only once. If you lose access, you must generate a new key.",{"id":3072,"title":3073,"titles":3074,"content":3075,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#account-id","Account ID",[240,1295],"The Account ID is a unique identifier associated with your InMobi publisher account. It is required to authorize and fetch monetization data through the InMobi Reporting API. How to find it: Log in to the InMobi dashboard.You’ll find your Account ID displayed in the top-left corner of the dashboard homepage, next to your account name.If you have access to multiple accounts, you can click on this area. A popup titled \"Sign in to another account\" will appear.Your current Account ID will be shown in the Current field at the top of the popup. Make sure to copy the full numeric value and paste it into the Account ID field in the integration form.",{"id":3077,"title":1338,"titles":3078,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#is-enabled",[240,1295],{"id":3080,"title":2947,"titles":3081,"content":3082,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#application-section",[240],"Use this section to configure individual applications for data synchronization with InMobi. Each field serves the following purpose:",{"id":3084,"title":3085,"titles":3086,"content":3087,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#app-id-app-key","App ID (App Key)",[240,2947],"The App ID (App Key) is a unique identifier assigned to each mobile app in your InMobi inventory. It is used to collect monetization data specific to that app via the InMobi Reporting API. How to find it: Log in to the InMobi dashboard.In the left-hand menu, go to Inventory > Inventory Settings > Apps.Find the app you want to connect and click to open its details.The App Key is displayed under the app name.Copy this value and paste it into the App Key field in the integration form.",{"id":3089,"title":1328,"titles":3090,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#application",[240,2947],{"id":3092,"title":1343,"titles":3093,"content":3094,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/inmobi#saving-the-configuration",[240],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from InMobi according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":244,"title":124,"titles":3096,"content":3097,"level":1110},[],"Step-by-step guide for integrating the ironSource grabber in Magify This guide explains how to set up the ironSource monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your ironSource platform into your analytics pipeline.",{"id":3099,"title":13,"titles":3100,"content":3101,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source#getting-started",[124],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find ironSource in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your ironSource platform by providing the required credentials: a Secret Key, a Refresh Token, and a custom integration name. Each field in the form is described below.",{"id":3103,"title":1295,"titles":3104,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source#general-settings",[124],{"id":3106,"title":1304,"titles":3107,"content":2033,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source#name",[124,1295],{"id":3109,"title":1309,"titles":3110,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source#organization",[124,1295],{"id":3112,"title":2039,"titles":3113,"content":3114,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source#secret-key-and-refresh-token",[124,1295],"The Secret Key and Refresh Token are authorization credentials required for secure access to data via the ironSource (LevelPlay) Monetization API. Secret Key – a unique key used to identify and authenticate the client making API requests.Refresh Token – used to obtain a valid Access Token, which is required for API requests. Since the Access Token has a limited lifespan, the Refresh Token ensures continued access. These credentials are required to configure a grabber in the Magify system for automated retrieval of monetization metrics and ad performance data. How to find them: Go to the ironSource Platform.In the bottom-left corner, click Account (profile icon).Navigate to the API tab at the top of the page.Copy the values from the following fields:\nSecret KeyRefresh TokenEnter these credentials into the corresponding fields in the Magify interface. Enter these credentials into the corresponding fields in the Magify interface.",{"id":3116,"title":1338,"titles":3117,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source#is-enabled",[124,1295],{"id":3119,"title":1343,"titles":3120,"content":2048,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/iron-source#saving-the-configuration",[124],{"id":248,"title":247,"titles":3122,"content":3123,"level":1110},[],"Step-by-step guide to setting up a Liftoff grabber in Magify This guide explains how to set up the Liftoff monetization data grabber in the Magify analytics system. The grabber automates the import of monetization data from your Liftoff account into the analytics pipeline. It collects key performance metrics such as ad revenue, impressions, eCPM, ad unit performance, and other monetization indicators specific to AppLovin.",{"id":3125,"title":13,"titles":3126,"content":3127,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#getting-started",[247],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Liftoff in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Liftoff account by providing the required credentials: API Key, Grabbing Start Date, App ID, and a custom integration name.",{"id":3129,"title":1295,"titles":3130,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#general-settings",[247],{"id":3132,"title":1299,"titles":3133,"content":3134,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#form-overview",[247,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications Section – A list of individual Liftoff applications to be synced. Each field in the form is described below.",{"id":3136,"title":1304,"titles":3137,"content":3138,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#name",[247,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Liftoff Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3140,"title":1309,"titles":3141,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#organization",[247,1295],{"id":3143,"title":1533,"titles":3144,"content":3145,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#api-key",[247,1295],"To enable data collection from Liftoff, you must provide a valid API Key. This key is used to authenticate requests to the Liftoff Reporting API, which provides monetization metrics such as revenue, impressions, eCPM, ad unit performance, and more. How to find it: Log in to your Liftoff Monetize account.In the left-hand menu, go to: All Applications > Overview.Your API Key will be listed in this section.",{"id":3147,"title":2681,"titles":3148,"content":3149,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#grabbing-start-date",[247,1295],"Specifies the date from which the system should start collecting data from Liftoff. Any data prior to this date will be ignored during the grabbing process. This field defines the starting point for data collection. Format: YYYY-MM-DD ExampleIf you set Grabbing Start Date = 2025-06-01, the grabber will fetch only the data available from June 1, 2025, onward.",{"id":3151,"title":1338,"titles":3152,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#is-enabled",[247,1295],{"id":3154,"title":2947,"titles":3155,"content":3156,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#application-section",[247],"Use this section to configure individual applications for data synchronization with Liftoff. Each field serves the following purpose:",{"id":3158,"title":2446,"titles":3159,"content":3160,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#app-id",[247,2947],"Used to identify your specific application within the Liftoff platform for monetization data collection. Each app registered in your Liftoff account is assigned a unique App ID, which is required to fetch app-level performance and revenue metrics. How to find it: Log in to your Liftoff Monetize account.In the left-hand menu, go to: Applications > [Select your app].The App ID will be displayed at the top of the application details page.",{"id":3162,"title":1328,"titles":3163,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#application",[247,2947],{"id":3165,"title":1343,"titles":3166,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/liftoff#saving-the-configuration",[247],{"id":252,"title":251,"titles":3168,"content":3169,"level":1110},[],"Step-by-step guide for integrating the Line grabber in Magify This guide explains how to set up an LINE monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data — including ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics — directly from your LINE account into your analytics pipeline.",{"id":3171,"title":13,"titles":3172,"content":3173,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line#getting-started",[251],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find LINE in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your LINE account by providing the required credentials: your Username, Password and a custom integration name. Each field in the form is described below.",{"id":3175,"title":1295,"titles":3176,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line#general-settings",[251],{"id":3178,"title":1304,"titles":3179,"content":3180,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line#name",[251,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: LINE Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3182,"title":1309,"titles":3183,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line#organization",[251,1295],{"id":3185,"title":2278,"titles":3186,"content":3187,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line#username-and-password",[251,1295],"To connect Magify to your LINE (FiveCDM) account and access monetization data via the API, you must provide Basic Auth credentials — specifically, your Username and Password. These credentials are required to authenticate API requests and securely retrieve reporting data such as ad revenue and impressions. How to obtain them: Go to the LINE Partner Portal (FiveCDM).Credentials are not created manually — they are issued by your LINE account manager.If you don’t have access, please contact your LINE representative to request your API username and password.",{"id":3189,"title":1338,"titles":3190,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line#is-enabled",[251,1295],{"id":3192,"title":1343,"titles":3193,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/line#saving-the-configuration",[251],{"id":256,"title":255,"titles":3195,"content":3196,"level":1110},[],"Step-by-step guide for integrating the Maio grabber in Magify This guide explains how to set up the Maio monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Maio platform into your analytics pipeline.",{"id":3198,"title":13,"titles":3199,"content":3200,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#getting-started",[255],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Maio in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Maio platform by providing the required credentials: an API ID, an API Key, an App ID, and a custom integration name.",{"id":3202,"title":1295,"titles":3203,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#general-settings",[255],{"id":3205,"title":1299,"titles":3206,"content":3207,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#form-overview",[255,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual Maio applications to be synced. Each field in the form is described below.",{"id":3209,"title":1304,"titles":3210,"content":3211,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#name",[255,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Maio Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3213,"title":1309,"titles":3214,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#organization",[255,1295],{"id":3216,"title":3217,"titles":3218,"content":3219,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#api-key-and-api-id","API Key and API ID",[255,1295],"An API Key is a unique identifier used to authenticate requests to the Maio Reporting API. It ensures that only authorized users can securely access your reporting data.Together with the API ID, it enables automated data extraction from your Maio account into external analytics systems such as Magify. API Key — used for authenticating API requests.API ID — the internal identifier of the API endpoint linked to a specific app. How to find them: Log in to your Maio platform.In the left-hand menu, click on REPORTING API.You will see a table listing your applications along with the corresponding API ID, and API Key. Copy each of these values and enter them into the required fields in the Magify integration form.",{"id":3221,"title":1338,"titles":3222,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#is-enabled",[255,1295],{"id":3224,"title":2947,"titles":3225,"content":3226,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#application-section",[255],"Use this section to configure individual applications for data synchronization with Maio. Each field serves the following purpose:",{"id":3228,"title":2446,"titles":3229,"content":3230,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#app-id",[255,2947],"The App ID is a unique identifier assigned to each of your applications registered on the Maio platform. It is required when configuring API access or linking a specific app to external systems like Magify. This ID ensures that the reporting data retrieved via the API corresponds to the correct application. How to find it: Log in to your Maio platform.In the left-hand menu, click on REPORTING API.You will see a table listing all registered apps.In the App ID column, locate the ID corresponding to the app you want to connect. Copy the value and enter it into the required field in the Magify integration form.",{"id":3232,"title":1328,"titles":3233,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#application",[255,2947],{"id":3235,"title":1343,"titles":3236,"content":3237,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/maio#saving-the-configuration",[255],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Maio according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":259,"title":128,"titles":3239,"content":3240,"level":1110},[],"Step-by-step guide to setting up an Mintegral grabber in Magify This guide explains how to set up the Mintegral monetization data grabber in the Magify analytics system. The grabber automates the import of monetization data from your Mintegral account into the analytics pipeline. It collects key metrics such as ad revenue, impressions, eCPM, ad unit performance, and other Mintegral-specific monetization indicators.",{"id":3242,"title":13,"titles":3243,"content":3244,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#getting-started",[128],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Mintegral in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Mintegral account by providing the required credentials: Skey, Secret, Grabbing start date, App ID, and a custom integration name.",{"id":3246,"title":1295,"titles":3247,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#general-settings",[128],{"id":3249,"title":1299,"titles":3250,"content":3251,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#form-overview",[128,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications Section – A list of individual Mintegral applications to be synced. Each field in the form is described below:",{"id":3253,"title":1304,"titles":3254,"content":3255,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#name",[128,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Mintegral Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3257,"title":1309,"titles":3258,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#organization",[128,1295],{"id":3260,"title":3261,"titles":3262,"content":3263,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#skey-and-secret","Skey and Secret",[128,1295],"Used to authenticate access to your Mintegral monetization reporting account. SKey – A public API key used to identify your account when making reporting requests to Mintegral.Secret – A private key used together with the SKey to securely authorize access to the Mintegral Reporting API. These credentials are required to configure the monetization grabber and retrieve revenue and performance data from Mintegral. How to find them: Log in to your Mintegral account.Go to Account → API Tools → Report API.Your SKey and Secret will be listed in this section.",{"id":3265,"title":2681,"titles":3266,"content":3267,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#grabbing-start-date",[128,1295],"Specifies the date from which the system should start collecting data from Mintegral. Any data prior to this date will be ignored during the grabbing process. This field defines the starting point for data collection. It helps control the volume of data being fetched and ensures that only relevant data (e.g., from the beginning of a campaign) is processed. Format: YYYY-MM-DD ExampleIf you set Grabbing Start Date = 2025-06-01, the grabber will fetch only the data available from June 1, 2025, onward.",{"id":3269,"title":1338,"titles":3270,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#is-enabled",[128,1295],{"id":3272,"title":2947,"titles":3273,"content":3274,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#application-section",[128],"Use this section to configure individual applications for data synchronization with Mintegral. Each field serves the following purpose:",{"id":3276,"title":2446,"titles":3277,"content":3278,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#app-id",[128,2947],"Used to identify your specific application within the Mintegral platform for monetization data collection. Each app registered in your Mintegral account is assigned a unique App ID, which is required to fetch app-level performance and revenue metrics. How to find it: Log in to your Mintegral account.Go to APP Setting → APP Setting.Locate your application in the list.The App ID will be displayed next to the app name in the App ID column.",{"id":3280,"title":1328,"titles":3281,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#application",[128,2947],{"id":3283,"title":1343,"titles":3284,"content":3285,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#saving-the-configuration",[128],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from HyprMX according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":3287,"title":467,"titles":3288,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mintegral#",[128,1343],{"id":263,"title":262,"titles":3290,"content":3291,"level":1110},[],"Step-by-step guide to setting up a MobileFuse grabber in Magify This guide explains how to set up the MobileFuse monetization data grabber in the Magify analytics system. The grabber automates the import of monetization data from your MobileFuse account into the analytics pipeline. It collects key performance metrics such as ad revenue, impressions, eCPM, ad unit performance, and other monetization indicators specific to MobileFuse.",{"id":3293,"title":13,"titles":3294,"content":3295,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse#getting-started",[262],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find MobileFuse in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your MobileFuse account by providing the required credentials: API Key and a custom integration name. Each field in the form is described below.",{"id":3297,"title":1304,"titles":3298,"content":3299,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse#name",[262,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: MobileFuse Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3301,"title":1309,"titles":3302,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse#organization",[262,13],{"id":3304,"title":1533,"titles":3305,"content":3306,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse#api-key",[262,13],"To enable data collection from MobileFuse, you must provide a valid API Key. This key is used to authenticate requests to the MobileFuse Reporting API, which provides monetization metrics such as revenue, impressions, eCPM, ad unit performance, and more. How to find it: Log in to your MobileFuse account.In the upper-right corner of the dashboard, click on the user icon, then select Settings from the dropdown menu.In the Account Settings section, you will see the API Key field.Copy the API Key and use it in the Magify integration form.",{"id":3308,"title":1338,"titles":3309,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse#is-enabled",[262,13],{"id":3311,"title":1343,"titles":3312,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse#saving-the-configuration",[262],{"id":3314,"title":467,"titles":3315,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/mobile-fuse#",[262],{"id":266,"title":140,"titles":3317,"content":3318,"level":1110},[],"Step-by-step guide to setting up a Moloco grabber in Magify This guide explains how to set up a Moloco monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data, including ad revenue, impressions, eCPM, ad unit performance, and other specific metrics from your Moloco Publisher Portal into your analytics pipeline.",{"id":3320,"title":13,"titles":3321,"content":3322,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#getting-started",[140],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Moloco in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Moloco Publisher Portal by providing the required credentials: Publisher ID, Workplace ID, Email Address, Password, App ID, and a custom integration name.",{"id":3324,"title":1295,"titles":3325,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#general-settings",[140],{"id":3327,"title":1299,"titles":3328,"content":3329,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#form-overview",[140,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications Section – A list of individual Moloco applications to be synced. Each field in the form is described below.",{"id":3331,"title":1304,"titles":3332,"content":2158,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#name",[140,1295],{"id":3334,"title":1309,"titles":3335,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#organization",[140,1295],{"id":3337,"title":3338,"titles":3339,"content":3340,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#publisher-id-and-workplace-id","Publisher ID and Workplace ID",[140,1295],"To configure the Moloco monetization grabber in Magify, you’ll need to provide two identifiers found in your Moloco Publisher Portal: Publisher ID – your unique account identifierPlatform ID – also known as Workplace ID, used to identify your specific workspace environment How to find them: Log in to the Moloco Publisher Portal.In the left-hand menu, go to Publisher Settings.Under the Publisher Info tab, you will see both:\nPublisher IDPlatform ID (this is your Workplace ID) Use the copy buttons next to each field to extract them easily and paste them into the grabber configuration in Magify.",{"id":3342,"title":3343,"titles":3344,"content":3345,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#email-address-and-password","Email address and Password",[140,1295],"To connect your Moloco data to Magify via the monetization grabber, you need to authenticate using your Moloco account email and password. How to find your email address: Log in to the Moloco Publisher Portal.Click your account icon in the top-right corner of the screen.From the dropdown, select \"My info\".On the User Settings page, under My Info, you’ll see your registered Email address. How to get your login credentials: Password and account access are issued by your Moloco account manager.If you don’t yet have access, or if you're missing login credentials, please contact your Moloco representative to request them.",{"id":3347,"title":1338,"titles":3348,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#is-enabled",[140,1295],{"id":3350,"title":2947,"titles":3351,"content":3352,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#application-section",[140],"Use this section to configure individual applications for data synchronization with Moloco Publisher Portal. Each field serves the following purpose:",{"id":3354,"title":2446,"titles":3355,"content":3356,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#app-id",[140,2947],"To pull app-level monetization data via the Moloco grabber, you need to provide the App ID, referred to as App Key in the Moloco interface. How to find it: Log in to the Moloco Publisher Portal.In the left-hand menu, go to Overview → Apps.You will see a list of your registered apps.Locate the App Key column — this is your App ID used in API integrations. Click the copy icon to copy the value and paste it into the Magify configuration form.",{"id":3358,"title":1328,"titles":3359,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#application",[140,2947],{"id":3361,"title":1343,"titles":3362,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/moloco#saving-the-configuration",[140],{"id":270,"title":269,"titles":3364,"content":3365,"level":1110},[],"Step-by-step guide for integrating the Next Millennium grabber in Magify This guide explains how to set up the Next Millennium monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Next Millennium account into your analytics pipeline.",{"id":3367,"title":13,"titles":3368,"content":3369,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#getting-started",[269],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Next Millennium in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Next Millennium account by providing the required credentials: an Access Token, an App ID, and a custom integration name.",{"id":3371,"title":1295,"titles":3372,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#general-settings",[269],{"id":3374,"title":1299,"titles":3375,"content":3376,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#form-overview",[269,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual Next Millennium applications to be synced. Each field in the form is described below.",{"id":3378,"title":1304,"titles":3379,"content":3380,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#name",[269,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Next Millennium Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3382,"title":1309,"titles":3383,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#organization",[269,1295],{"id":3385,"title":1426,"titles":3386,"content":3387,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#access-token",[269,1295],"To enable integration with the Next Millennium reporting API, you will need an Access Token. This token is used to authenticate API requests and retrieve revenue data. How to obtain it: Contact your Next Millennium account manager directly.Request an Access Token for reporting purposes.",{"id":3389,"title":1338,"titles":3390,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#is-enabled",[269,1295],{"id":3392,"title":2947,"titles":3393,"content":3394,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#application-section",[269],"Use this section to configure individual applications for data synchronization with Next Millennium. Each field serves the following purpose:",{"id":3396,"title":2446,"titles":3397,"content":3398,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#app-id",[269,2947],"Each app connected to your Next Millennium account has a unique App ID, which is required for accurate data synchronization via the reporting API. How to find it: Log in to your Next Millennium dashboard.Go to the Sites or Apps section.Locate your app in the list of connected properties.You’ll find the App ID listed next to the app name. Usually labeled as App ID, Property ID, or similar. If you're unable to locate it, contact your Next Millennium account manager and request the App ID for your property.",{"id":3400,"title":1328,"titles":3401,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#application",[269,2947],{"id":3403,"title":1343,"titles":3404,"content":3405,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/next-millennium#saving-the-configuration",[269],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Next Millennium according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":274,"title":273,"titles":3407,"content":3408,"level":1110},[],"Step-by-step guide for integrating the Odeeo grabber in Magify This guide explains how to set up an Odeeo monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data — including ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics — directly from your Odeeo account into your analytics pipeline.",{"id":3410,"title":13,"titles":3411,"content":3412,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo#getting-started",[273],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Odeeo in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Odeeo account by providing the required credentials: your API key and a custom integration name. Each field in the form is described below.",{"id":3414,"title":1295,"titles":3415,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo#general-settings",[273],{"id":3417,"title":1304,"titles":3418,"content":3419,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo#name",[273,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Odeeo Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3421,"title":1309,"titles":3422,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo#organization",[273,1295],{"id":3424,"title":1533,"titles":3425,"content":3426,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo#api-key",[273,1295],"The Reporting API Key is a secure token that authorizes Magify to access your Odeeo account and automatically import monetization data. This includes metrics such as ad revenue, impressions, eCPM, and ad unit performance. It functions like a password for API access and is required to enable the grabber integration between Odeeo and Magify. How to find it: Log in to your Odeeo account.In the top-right corner, click on your company name.From the dropdown menu, select My Company.Open the Company Keys tab.You will see your Reporting API Key at the top of the section. Click the copy icon to copy it.",{"id":3428,"title":1338,"titles":3429,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo#is-enabled",[273,1295],{"id":3431,"title":1343,"titles":3432,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/odeeo#saving-the-configuration",[273],{"id":278,"title":277,"titles":3434,"content":3435,"level":1110},[],"Step-by-step guide for integrating the Ogury grabber in Magify This guide explains how to set up the Ogury monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Ogury platform into your analytics pipeline.",{"id":3437,"title":13,"titles":3438,"content":3439,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#getting-started",[277],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Ogury in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Ogury platform by providing the required credentials: a Token, an App ID, an Asset key, and a custom integration name.",{"id":3441,"title":1295,"titles":3442,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#general-settings",[277],{"id":3444,"title":1299,"titles":3445,"content":3446,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#form-overview",[277,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual Ogury applications to be synced. Each field in the form is described below.",{"id":3448,"title":1304,"titles":3449,"content":3450,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#name",[277,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Ogury Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3452,"title":1309,"titles":3453,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#organization",[277,1295],{"id":3455,"title":2769,"titles":3456,"content":3457,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#token",[277,1295],"The API Token is a unique key used to authenticate access to the Reporting API. It is required to securely retrieve monetization data such as revenue, impressions, eCPM, and other key metrics. How to get the token: Log in to the Ogury Publisher Dashboard.Go to Account Settings > API tokens.In the Reporting API section, click the Create Token button. Copy the generated token. The token is displayed only once, so make sure to save it in a secure location. For more information, refer to the official Ogury Reporting API documentation.",{"id":3459,"title":1338,"titles":3460,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#is-enabled",[277,1295],{"id":3462,"title":2947,"titles":3463,"content":3464,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#application-section",[277],"Use this section to configure individual applications for data synchronization with Ogury. Each field serves the following purpose:",{"id":3466,"title":2446,"titles":3467,"content":3468,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#app-id",[277,2947],"In the context of Ogury, the App ID used for reporting and integration purposes corresponds to the Ad Unit ID of the default placement. This field is optional in the integration but may be useful if you want to collect data at the ad unit level. How to find it: Log in to the Ogury Publisher Dashboard.From the main menu, go to Assets.Select the app you want to configure.In the left-hand menu, click Monetization settings.Locate the section Default placement.The Ad Unit ID will be shown on the right. Click the icon to copy it. Note: This ID is not required for API access, but it can be used to match or filter ad-level data in analytics system.",{"id":3470,"title":1328,"titles":3471,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#application",[277,2947],{"id":3473,"title":3474,"titles":3475,"content":3476,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#asset-key","Asset key",[277,2947],"The Asset Key is a unique identifier assigned to each app registered in the Ogury platform. It is required when setting up API access and is used to specify which app’s monetization data should be retrieved. How to find it: There are two ways to access the Asset Key: Option 1. From the app list: Log in to the Ogury Publisher Dashboard.In the left-hand menu, go to Assets.The Asset Key is displayed in the corresponding column for each app in the list. Click the copy icon to copy it. Option 2. From app details: Click on the app name in the Assets list.In the Overview tab, scroll to the Details section.You will find the Asset Key along with the bundle and other app information.",{"id":3478,"title":1343,"titles":3479,"content":3480,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/ogury#saving-the-configuration",[277],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Ogury according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":282,"title":281,"titles":3482,"content":3483,"level":1110},[],"Step-by-step guide to setting up a Pangle grabber in Magify This guide explains how to set up a Pangle (TikTok Audience Network) monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data, including ad revenue, impressions, eCPM, ad unit performance, and other AdMob-specific metrics from your Pangle account into your analytics pipeline.",{"id":3485,"title":13,"titles":3486,"content":3487,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#getting-started",[281],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Pangle (TikTok Audience Network) in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Pangle account by providing the required credentials: User ID, Secure Key, App ID, and a custom integration name.",{"id":3489,"title":1295,"titles":3490,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#general-settings",[281],{"id":3492,"title":1299,"titles":3493,"content":3494,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#form-overview",[281,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications Section – A list of individual Pangle applications to be synced. Each field in the form is described below.",{"id":3496,"title":1304,"titles":3497,"content":3498,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#name",[281,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Pangle Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3500,"title":1309,"titles":3501,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#organization",[281,1295],{"id":3503,"title":3504,"titles":3505,"content":3506,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#user-id-and-security-key","User ID and Security Key",[281,1295],"To integrate with the Pangle Reporting API 2.0, you need two authentication parameters: User ID (also referred to as Role ID) — a unique identifier for the user account that has API access permissions.Security Key — a secret key used for signing and authenticating API requests. How to find them: Log in to the Pangle dashboard.In the left-hand menu, go to Integrations.Under the SDK & API tab, select Pangle Reporting API 2.0.On the right side, in the API Security section, you will see:\nThe Security Key field with a Copy button — this is your secret key.The Role ID field — this is your User ID.",{"id":3508,"title":1338,"titles":3509,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#is-enabled",[281,1295],{"id":3511,"title":2947,"titles":3512,"content":3513,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#application-section",[281],"Use this section to configure individual applications for data synchronization with Pangle. Each field serves the following purpose:",{"id":3515,"title":2446,"titles":3516,"content":3517,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#app-id",[281,2947],"In the context of Pangle monetization and API integration, the App ID is a unique identifier assigned to each of your applications registered in the Pangle platform. This ID is required when requesting performance data via the Reporting API or when configuring monetization. How to find it: Log in to the Pangle dashboard.In the left-hand menu, click Applications.You will see a list of your registered apps.Each entry includes an App ID, usually displayed under the app name. Alternatively: Click on a specific app to view its detailed settings — the App ID will be displayed in the overview section.",{"id":3519,"title":1328,"titles":3520,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#application",[281,2947],{"id":3522,"title":1343,"titles":3523,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pangle-tik-tok#saving-the-configuration",[281],{"id":286,"title":285,"titles":3525,"content":3526,"level":1110},[],"Step-by-step guide for integrating the Premium Ads grabber in Magify This guide explains how to set up the Premium Ads monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Premium Ads account into your analytics pipeline.",{"id":3528,"title":13,"titles":3529,"content":3530,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#getting-started",[285],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Premium Ads in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Premium Ads account by providing the required credentials: an Access Token, an App ID, and a custom integration name.",{"id":3532,"title":1295,"titles":3533,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#general-settings",[285],{"id":3535,"title":1299,"titles":3536,"content":3537,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#form-overview",[285,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual Premium Ads applications to be synced. Each field in the form is described below.",{"id":3539,"title":1304,"titles":3540,"content":3541,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#name",[285,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Premium Ads Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3543,"title":1309,"titles":3544,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#organization",[285,1295],{"id":3546,"title":1426,"titles":3547,"content":3548,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#access-token",[285,1295],"An Access Token is required to authenticate requests to the Premium Ads Reporting API. It grants permission to access your analytics data, including impressions, clicks, eCPM, and revenue. How to get your token: Log in to the Premium Ads dashboard.In the top-right corner, click on your profile icon.From the dropdown menu, select Reporting API.Scroll to the API Token (Authorization: Bearer) section.Click Request New Token if no token is shown.Copy the generated token and paste it into the Access Token field in the Magify form.",{"id":3550,"title":1338,"titles":3551,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#is-enabled",[285,1295],{"id":3553,"title":2947,"titles":3554,"content":3555,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#application-section",[285],"Use this section to configure individual applications for data synchronization with Premium Ads. Each field serves the following purpose:",{"id":3557,"title":2446,"titles":3558,"content":3559,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#app-id",[285,2947],"The App ID is a unique identifier assigned to your application in the Premium Ads platform. It is required when making API requests to fetch app-level data. How to find it: Log in to your Premium Ads dashboard.In the left-hand menu, go to Inventory > Management.Open the tab for the application you want to connect.Look at the browser’s address bar. The App ID appears in the URL after the app= parameter (e.g., .../ad-units?app=12345).Copy this value and paste it into the App ID field when setting up your Magify integration.",{"id":3561,"title":1328,"titles":3562,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#application",[285,2947],{"id":3564,"title":1343,"titles":3565,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/premium-ads#saving-the-configuration",[285],{"id":290,"title":289,"titles":3567,"content":3568,"level":1110},[],"Step-by-step guide for integrating the PubNative grabber in Magify This guide explains how to set up the PubMatic monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your PubMatic account into your analytics pipeline.",{"id":3570,"title":13,"titles":3571,"content":3572,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#getting-started",[289],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find PubMatic in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your PubMatic account by providing the required credentials: an Username, a Password, a Publisher ID, and a custom integration name. Each field in the form is described below.",{"id":3574,"title":1295,"titles":3575,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#general-settings",[289],{"id":3577,"title":1304,"titles":3578,"content":3579,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#name",[289,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: PubMatic Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3581,"title":1309,"titles":3582,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#organization",[289,1295],{"id":3584,"title":2278,"titles":3585,"content":3586,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#username-and-password",[289,1295],"To start using the PubMatic APIs, you must first have an active PubMatic account. Contact your PubMatic account manager or reach out to support to request account creation.Once your account is created, you will receive an email containing:\nyour API Login ID (this will be your Username)instructions for setting your PasswordAfter activating your account, you can register for API access and obtain an access token by following the official documentation: Getting Started with PubMatic APIs.Use the Username and Password you received to configure the integration in Magify. Enter these credentials into the corresponding fields in the Magify integration form. API access is not available without an active account — initial setup must go through your PubMatic representative.",{"id":3588,"title":2667,"titles":3589,"content":3590,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#publisher-id",[289,1295],"Publisher ID is a unique identifier assigned to your PubMatic account. It is required to retrieve reporting data via PubMatic APIs and is necessary for completing the integration in Magify. How to find it: Log in to your PubMatic account.You can locate your Publisher ID in one of the following ways:\nOption 1: Look at the top-right corner of the dashboard — the ID is displayed next to your account name.Option 2: Click on your profile icon (top-right), then open Account Settings. The Publisher ID will be shown under the \"ID:\" label. Copy the Publisher ID and enter it into the required field in Magify.",{"id":3592,"title":1338,"titles":3593,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#is-enabled",[289,1295],{"id":3595,"title":1343,"titles":3596,"content":3597,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-matic#saving-the-configuration",[289],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from PubMatic according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":293,"title":289,"titles":3599,"content":3600,"level":1110},[],"Step-by-step guide for integrating the PubNative grabber in Magify This guide explains how to set up the PubNative monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your PubNative account (Verve Group) into your analytics pipeline.",{"id":3602,"title":13,"titles":3603,"content":3604,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#getting-started",[289],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find PubNative in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your PubNative account by providing the required credentials: an API Key and a custom integration name. Each field in the form is described below.",{"id":3606,"title":1295,"titles":3607,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#general-settings",[289],{"id":3609,"title":1304,"titles":3610,"content":3611,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#name",[289,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: PubNative Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3613,"title":1309,"titles":3614,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#organization",[289,1295],{"id":3616,"title":1533,"titles":3617,"content":3618,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#api-key",[289,1295],"The API Key is a unique identifier used to authenticate requests to the PubNative (Verve Group) Reporting API. Magify uses this key to access your revenue and impression data. How to find it: Go to the Verve Group Publisher Dashboard and log in.In the top-right corner, click the profile icon.From the dropdown menu, select Reporting API Key.Click Copy to Clipboard and paste the key into the API Key field in the Magify form. If you do not see the “Reporting API Key” option, contact your Verve Group (PubNative) account manager to request access.",{"id":3620,"title":1338,"titles":3621,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#is-enabled",[289,1295],{"id":3623,"title":1343,"titles":3624,"content":3625,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#saving-the-configuration",[289],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from PubNative according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":3627,"title":467,"titles":3628,"content":467,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/pub-native#",[289,1343],{"id":297,"title":296,"titles":3630,"content":3631,"level":1110},[],"Step-by-step guide for integrating the ReklamUp grabber in Magify This guide explains how to set up the ReklamUp monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your ReklamUp dashboard into your analytics pipeline.",{"id":3633,"title":13,"titles":3634,"content":3635,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up#getting-started",[296],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find ReklamUp in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your ReklamUp dashboard by providing the required credentials: an API Key, an App Secret, and a custom integration name. Each field in the form is described below.",{"id":3637,"title":1295,"titles":3638,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up#general-settings",[296],{"id":3640,"title":1304,"titles":3641,"content":3642,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up#name",[296,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: ReklamUp Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3644,"title":1309,"titles":3645,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up#organization",[296,1295],{"id":3647,"title":3648,"titles":3649,"content":3650,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up#api-key-and-app-secret","API Key and App Secret",[296,1295],"Magify uses an API Key and API Secret to authenticate requests to the ReklamUp Reporting API (v3). These credentials are required to enable secure access to your account’s monetization data. API Key – a public identifier used to authorize the client.API Secret – a private credential used to verify the integrity of API requests. Both are required for all authenticated requests to ReklamUp’s version 3 endpoints. How to obtain them: Log in to the ReklamUp dashboard.In the left-hand navigation, go to Admin > API Management.Click New V3 API in the top-right corner.Enter a name for the key and click Save. After saving, your API Key and API Secret will be displayed once. Copy both values immediately. For security reasons, ReklamUp does not allow viewing them again after creation.",{"id":3652,"title":1338,"titles":3653,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up#is-enabled",[296,1295],{"id":3655,"title":1343,"titles":3656,"content":3657,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/reklam-up#saving-the-configuration",[296],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from ReklamUp according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":301,"title":300,"titles":3659,"content":3660,"level":1110},[],"Step-by-step guide for integrating the Smaato grabber in Magify This guide explains how to set up the Smaato monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Smaato SPX account into your analytics pipeline.",{"id":3662,"title":13,"titles":3663,"content":3664,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato#getting-started",[300],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Smaato in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Smaato SPX account by providing the required credentials: a Client ID, a Client Secret, and a custom integration name. Each field in the form is described below.",{"id":3666,"title":1295,"titles":3667,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato#general-settings",[300],{"id":3669,"title":1304,"titles":3670,"content":3671,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato#name",[300,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Smaato Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3673,"title":1309,"titles":3674,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato#organization",[300,1295],{"id":3676,"title":1829,"titles":3677,"content":3678,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato#client-id-and-client-secret",[300,1295],"These credentials are required to authorize access to your Smaato SPX account's API. They allow the Magify system to retrieve monetization data on your behalf. How to obtain them: Go to your Smaato SPX account.Click on your profile icon in the top-right corner and select OAuth API Credentials from the dropdown. If you haven't created credentials yet, click Create Client ID. Once created, you will see both your Client ID and Client Secret. Copy and paste them into the corresponding fields in the Magify integration form.",{"id":3680,"title":1338,"titles":3681,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato#is-enabled",[300,1295],{"id":3683,"title":1343,"titles":3684,"content":3685,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/smaato#saving-the-configuration",[300],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Smaato according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us — we can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":305,"title":304,"titles":3687,"content":3688,"level":1110},[],"Step-by-step guide for integrating the Tappx grabber in Magify This guide explains how to set up the Tappx monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Tappx account into your analytics pipeline.",{"id":3690,"title":13,"titles":3691,"content":3692,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#getting-started",[304],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Tappx in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Tappx account by providing the required credentials: an API Key, an User ID, an App ID, and a custom integration name.",{"id":3694,"title":1295,"titles":3695,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#general-settings",[304],{"id":3697,"title":1299,"titles":3698,"content":3699,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#form-overview",[304,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications section – a list of individual Tappx applications to be synced. Each field in the form is described below.",{"id":3701,"title":1304,"titles":3702,"content":3703,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#name",[304,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Tappx Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3705,"title":1309,"titles":3706,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#organization",[304,1295],{"id":3708,"title":3709,"titles":3710,"content":3711,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#api-key-and-user-id","API Key and User ID",[304,1295],"To access reporting data from the Tappx monetization platform, both an API Key and a User ID (also referred to as Account ID) are required. These credentials are used to authorize your connection and retrieve metrics such as revenue, impressions, and clicks. How to find them: Log in to your Tappx dashboard.In the left sidebar, navigate to My account > My profile.On the My profile page, you’ll see the following fields:\nAccount ID (User ID) – displayed at the top of the form.API Key – displayed at the bottom of the form.Copy both values and paste them into the corresponding fields in your integration form.",{"id":3713,"title":1338,"titles":3714,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#is-enabled",[304,1295],{"id":3716,"title":2947,"titles":3717,"content":3718,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#application-section",[304],"Use this section to configure individual applications for data synchronization with Tappx. Each field serves the following purpose:",{"id":3720,"title":2446,"titles":3721,"content":3722,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#app-id",[304,2947],"The App ID in Tappx is part of the Tappx Key, which serves as a unique identifier for each application in your account. It is required to fetch app-level monetization data through the API. How to find it: Log in to your Tappx dashboard.From the left-hand menu, navigate to Applications > Explore applications.Find the desired app in the list.In the Tappx Key column, you'll see a value that starts with pub-XXXXXXX. The App ID is the part that follows the pub- prefix.Extract just the App ID portion and paste them into the corresponding fields in your integration form Note: In Tappx, it’s possible to have multiple App IDs (Tappx Keys) for the same application.",{"id":3724,"title":1328,"titles":3725,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#application",[304,2947],{"id":3727,"title":1343,"titles":3728,"content":3729,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tappx#saving-the-configuration",[304],"Once all required fields are filled in, click Save to complete the setup. The enabled grabber will then begin collecting data from Tappx according to the configured schedule. By default, each grabber is set to load data for one day upon creation. If you need to collect data for a longer period (e.g., for initial setup or data recovery), please contact us. We can manually adjust this value for you. Example:Days to Load = 1 — the grabber will load data only for the last fully completed day. For example, if today is June 6, it will retrieve data for June 5.Important: The current day is not included, as its data is still incomplete and being processed.",{"id":309,"title":308,"titles":3731,"content":3732,"level":1110},[],"Step-by-step guide to setting up a Tencent grabber in Magify This guide explains how to set up a Tencent U-Share monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data, including ad revenue, impressions, eCPM, ad unit performance, and other specific metrics from your Tencent U-Share account into your analytics pipeline.",{"id":3734,"title":13,"titles":3735,"content":3736,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#getting-started",[308],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Tencent in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Tencent U-Share account by providing the required credentials: Member ID, Secret Key, App ID, and a custom integration name.",{"id":3738,"title":1295,"titles":3739,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#general-settings",[308],{"id":3741,"title":1299,"titles":3742,"content":3743,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#form-overview",[308,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Applications Section – A list of individual Tencent applications to be synced. Each field in the form is described below.",{"id":3745,"title":1304,"titles":3746,"content":3747,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#name",[308,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Tencent Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3749,"title":1309,"titles":3750,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#organization",[308,1295],{"id":3752,"title":3753,"titles":3754,"content":3755,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#member-id","Member ID",[308,1295],"To configure the Tencent U-Share monetization grabber, you need to enter your Member ID — also referred to as Account ID. This unique numeric identifier is required for API authentication and reporting. You can find it in two places within the Tencent dashboard: Option 1: In the Profile Dropdown (Top Right) Log in to the Tencent U-Share account.In the top-right corner, click on your profile icon next to the notification bell.A dropdown menu will appear — your ID will be shown below your account name. Option 2: In the Account Information Section In the left-hand menu, go to Account > Account Information.On the account details page, locate the field Account ID — this is your Member ID.",{"id":3757,"title":3758,"titles":3759,"content":3760,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#secret-key","Secret Key",[308,1295],"To configure the Tencent U-Share monetization grabber and fetch reporting data via Media API, you need to provide your Secret Key — a unique access credential tied to your account. How to find it: Log in to the Tencent U-Share account.In the left-hand navigation menu, go to 接入中心 (Integration Center) > Media API 接入.On the page that opens, you'll see a section titled \"Media API 接入指引文档\".Below it, locate the field labeled \"我的密钥\" — which means \"My Secret Key\".Click the eye icon to reveal the key, and copy it to use in your Magify integration settings.",{"id":3762,"title":1338,"titles":3763,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#is-enabled",[308,1295],{"id":3765,"title":2947,"titles":3766,"content":3767,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#application-section",[308],"Use this section to configure individual applications for data synchronization with Tencent. Each field serves the following purpose:",{"id":3769,"title":2446,"titles":3770,"content":3771,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#app-id",[308,2947],"To integrate reporting data from Tencent U-Share, you need to provide the App ID for each application you want to track. This ID uniquely identifies your app in the U-Share system. How to find it: Log in to the Tencent U-Share account.In the left-hand menu, go to Traffic Cooperation > My Media.You'll see a list of all your registered apps (media).Under each app icon, you'll find the label ID: [number] — this is the App ID. Copy the App ID and use it in your integration setup in Magify.",{"id":3773,"title":1328,"titles":3774,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#application",[308,2947],{"id":3776,"title":1343,"titles":3777,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/tencent#saving-the-configuration",[308],{"id":312,"title":164,"titles":3779,"content":3780,"level":1110},[],"Step-by-step guide for integrating the Unity Ads grabber in Magify This guide explains how to set up the Unity Ads monetization data grabber in the Magify analytics system. The grabber enables automated import of monetization data such as ad revenue, impressions, eCPM, ad unit performance, and other relevant metrics directly from your Unity Ads account into your analytics pipeline.",{"id":3782,"title":13,"titles":3783,"content":3784,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#getting-started",[164],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Unity Ads in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Unity Ads account by providing the required credentials: Reporting API Access key, Unity Ads Organization ID, App ID, and a custom integration name.",{"id":3786,"title":1295,"titles":3787,"content":467,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#general-settings",[164],{"id":3789,"title":1299,"titles":3790,"content":3791,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#form-overview",[164,1295],"Top Section – General connection parameters: integration name, organization, and API credentials.Grabber – Standard integration mode that collects aggregated data at the app level. Suitable for high-level performance tracking when placement-level breakdown is not required.Grabber with Placements – Enhanced integration mode that retrieves metrics broken down by placement. Recommended if you need to analyze performance per ad format, placement position, or run detailed monetization experiments.Applications section – A list of individual Unity Ads applications to be synced with Magify. You can specify which apps to include in the integration and assign relevant identifiers. Each field in the form is described below.",{"id":3793,"title":1304,"titles":3794,"content":3795,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#name",[164,1295],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Unity Ads Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3797,"title":1309,"titles":3798,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#organization",[164,1295],{"id":3800,"title":3801,"titles":3802,"content":3803,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#reporting-api-access","Reporting API Access",[164,1295],"Unity Ads provides an API for retrieving monetization statistics. To access this data, you’ll need a Monetization Stats API Key, which can be generated from the Unity Dashboard. This key allows fetching revenue, impressions, clicks, and other monetization metrics for your account. How to find it: Log into your Unity Ads Monetization Dashboard.In the left-hand navigation, go to: Setup > API Management.Locate the Monetization Stats API Access section.Copy the API Key, return to Magify, and paste it into the Reporting API Access field.",{"id":3805,"title":2402,"titles":3806,"content":3807,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#unity-ads-organization-id",[164,1295],"The Unity Ads Organization ID is a unique identifier for your organization within the Unity Dashboard. It is used to authenticate and associate API requests with your specific account. How to find it: Log into your Unity Ads Monetization Dashboard.From the left-hand menu, navigate to: Administration > SettingsIn the Organization Settings section, locate the field labeled Organization ID. You’ll need to provide this ID when configuring the Unity Ads grabber in Magify to authorize API requests on behalf of your organization. Copy the Organization ID and paste it into the Unity Ads Organization ID field in Magify.",{"id":3809,"title":3810,"titles":3811,"content":3812,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#grabber","Grabber",[164],"This section defines how the data will be collected from the Unity Ads API.",{"id":3814,"title":1304,"titles":3815,"content":3816,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#name-1",[164,3810],"A custom name for the grabber in Magify. This helps you identify and manage multiple grabbers if needed.",{"id":3818,"title":3819,"titles":3820,"content":3821,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#grabbing-start-date","Grabbing start date",[164,3810],"The start date from which Magify will begin retrieving data from Unity Ads. Data prior to this date will not be requested. Make sure this aligns with when your Unity Ads campaigns or monetization activity began. Note: Unity Ads may only return data for a limited history window. We recommend selecting a recent start date unless you’re sure historical data is available.",{"id":3823,"title":1338,"titles":3824,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#is-enabled",[164,3810],{"id":3826,"title":3827,"titles":3828,"content":3829,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#grabber-with-placements","Grabber with Placements",[164],"This section allows you to collect data segmented by placements in Unity Ads. A grabber with placements provides more detailed analytics, such as revenue by ad format or position within the app. Note: Unity Ads returns placement-level data only if placements have been properly configured and actively used in your Unity project.",{"id":3831,"title":1304,"titles":3832,"content":3833,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#name-2",[164,3827],"The name of the placement-level grabber. It usually differs from the main grabber (for example, with a -placements suffix).",{"id":3835,"title":3819,"titles":3836,"content":3837,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#grabbing-start-date-1",[164,3827],"The date from which the system will begin retrieving placement-level data. Using the same date as the main grabber is recommended, but not required.",{"id":3839,"title":1338,"titles":3840,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#is-enabled-1",[164,3827],{"id":3842,"title":1541,"titles":3843,"content":3844,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#applications-section",[164],"Use this section to configure individual Unity Ads applications for data synchronization. Each field serves the following purpose:",{"id":3846,"title":2446,"titles":3847,"content":3848,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#app-id",[164,1541],"This is a unique identifier assigned to your app within the Unity Ads dashboard. It is required to retrieve revenue, impression, and placement-level data from Unity's Reporting API. How to find it: Go to Unity Ads Monetization Dashboard.In the left-hand menu, click Placements.Locate the desired app in the list.The App ID values for iOS and Android are shown at the top of the Placements page Enter both App IDs if your app is available on both platforms.",{"id":3850,"title":1328,"titles":3851,"content":2907,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#application",[164,1541],{"id":3853,"title":1343,"titles":3854,"content":2411,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/unity-ads#saving-the-configuration",[164],{"id":316,"title":315,"titles":3856,"content":3857,"level":1110},[],"Step-by-step guide to setting up a Verve grabber in Magify This guide explains how to set up a Verve monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data, including ad revenue, impressions, eCPM, ad unit performance, and other specific metrics from your Verve Group account into your analytics pipeline.",{"id":3859,"title":13,"titles":3860,"content":3861,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/verve#getting-started",[315],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Verve in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Verve Group account by providing the required credentials: Account Authentication Token and a custom integration name. Each field in the form is described below.",{"id":3863,"title":1304,"titles":3864,"content":3865,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/verve#name",[315,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Verve Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3867,"title":1309,"titles":3868,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/verve#organization",[315,13],{"id":3870,"title":3871,"titles":3872,"content":3873,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/verve#account-authentication-token","Account Authentication Token",[315,13],"To integrate Verve Group monetization data into Magify, you need to provide an Account authentication token (API key), which authorizes secure access to reporting data. How to find it: Log in to your Verve Group account.In the upper-right corner, hover over your account login (email address).A dropdown menu will appear — click on Reporting API Key.The API key will be automatically copied to your clipboard. Paste this token into the Verve Grabber configuration form in Magify.",{"id":3875,"title":1338,"titles":3876,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/verve#is-enabled",[315,13],{"id":3878,"title":1343,"titles":3879,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/verve#saving-the-configuration",[315],{"id":320,"title":319,"titles":3881,"content":3882,"level":1110},[],"Step-by-step guide to setting up a VK (myTarget) grabber in Magify This guide explains how to set up the VK (myTarget) monetization data grabber in the Magify analytics system. The grabber automates the import of monetization data from your VK account into the analytics pipeline. It collects key performance metrics such as ad revenue, impressions, eCPM, ad unit performance, and other monetization indicators specific to VK.",{"id":3884,"title":13,"titles":3885,"content":3886,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/vk-my-target#getting-started",[319],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find VK (myTarget) in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your VK (myTarget) account by providing the required credentials: Access Token and a custom integration name. Each field in the form is described below.",{"id":3888,"title":1304,"titles":3889,"content":3890,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/vk-my-target#name",[319,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: VK Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3892,"title":1309,"titles":3893,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/vk-my-target#organization",[319,13],{"id":3895,"title":1426,"titles":3896,"content":3897,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/vk-my-target#access-token",[319,13],"To enable the import of monetization data from VK Ads into Magify, you need to provide a valid Access Token. This token is used to authenticate API requests and retrieve reporting data such as revenue, impressions, clicks, eCPM, and other ad performance metrics. How to find it: Log in to your VK Ads account.Select Settings > General tab.Scroll down to the Statistics API section.Click the Show token button.",{"id":3899,"title":1338,"titles":3900,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/vk-my-target#is-enabled",[319,13],{"id":3902,"title":1343,"titles":3903,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/vk-my-target#saving-the-configuration",[319],{"id":324,"title":323,"titles":3905,"content":3906,"level":1110},[],"Step-by-step guide to setting up a Yandex grabber in Magify This guide explains how to set up a Yandex monetization data grabber in the Magify analytics system. The grabber enables the automated import of monetization data, including ad revenue, impressions, eCPM, ad unit performance, and other specific metrics from your Yandex account into your analytics pipeline.",{"id":3908,"title":13,"titles":3909,"content":3910,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/yandex#getting-started",[323],"Navigate to Configurations > Integrations > Monetization Grabbers in the Magify interface.Find Yandex in the list and click Add Grabber to create a new data source.A configuration form will open. This form is used to connect Magify to your Yandex account by providing the required credentials: OAuth Token and a custom integration name. Each field in the form is described below.",{"id":3912,"title":1304,"titles":3913,"content":3914,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/yandex#name",[323,13],"A descriptive name for the grabber configuration. Helps identify the data source among other integrations. Recommended format: Yandex Grabber [CompanyName] Optional field – recommended to fill in for easier navigation.",{"id":3916,"title":1309,"titles":3917,"content":1311,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/yandex#organization",[323,13],{"id":3919,"title":3920,"titles":3921,"content":3922,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/yandex#oauth-token","OAuth Token",[323,13],"To integrate Yandex monetization data into Magify via the Yandex Grabber, you need to authorize API access using an OAuth token. An OAuth token is a secure access key issued by Yandex that allows external systems to retrieve monetization and ad revenue data on your behalf — without exposing your login credentials. How to find it: Go to the Yandex Advertising Network dashboard.In the top-right menu, hover over your account name — a drop-down will appear.From the menu, select API.You’ll be redirected to the OAuth authorization page. Yandex may ask you to log in again to confirm access.Once logged in, Yandex will generate an access token in the redirect URL (in the format: #access_token=...). Copy this token and paste it into the Yandex Grabber settings in Magify. This token may expire or be revoked. If data stops syncing, generate a new token and update your integration.",{"id":3924,"title":1338,"titles":3925,"content":1432,"level":1120},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/yandex#is-enabled",[323,13],{"id":3927,"title":1343,"titles":3928,"content":2690,"level":1104},"/magify-basic-integration-setup/step-1-configure-data-grabbers/ads-monetization-data/yandex#saving-the-configuration",[323],{"id":334,"title":333,"titles":3930,"content":3931,"level":1110},[],"Step-by-step guide to setting up a Transaction Validator in Magify to verify in-app purchase events and prevent fraudulent transactions. This guide explains how to set up a Transaction Validator in the Magify analytics system. The validator enables the real-time verification of in-app purchase events by connecting to third-party platforms (such as Google Play or Apple App Store) to confirm transaction authenticity and prevent revenue loss due to fraud.",{"id":3933,"title":13,"titles":3934,"content":3935,"level":1104},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#getting-started",[333],"Navigate to Configurations > Integrations > Transaction Validator in the Magify interface.In the Application filter, find and select your application from the dropdown list for which the transaction validation will be enabled. A configuration form will open. This form is used to connect Magify to your in-app purchase validation sources by providing the required credentials for RevenueCat and Google Play. You’ll need to specify the application, optionally limit validation by app version, and provide access credentials such as the RevenueCat authorization code, Google Client ID, Client Secret, and Refresh Token. Each field in the form is described below.",{"id":3937,"title":1328,"titles":3938,"content":3939,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#application",[333,13],"Select your application from the dropdown list for which the transaction validation will be enabled.",{"id":3941,"title":3942,"titles":3943,"content":3944,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#app-version-from","App Version From",[333,13],"Select the minimum app version from the dropdown list to start applying validation rules from that version onward (optional).",{"id":3946,"title":3947,"titles":3948,"content":3949,"level":1110},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#setting-up-validation-by-platform","Setting Up Validation by Platform",[],"The setup process differs slightly depending on whether your application is built for iOS or Android platforms. This is due to differences in how transactions are validated and which credentials are required. Below, you'll find platform-specific instructions for each case.",{"id":3951,"title":3952,"titles":3953,"content":3954,"level":1104},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#ios-application","iOS Application",[3947],"To configure transaction validation for an iOS application, follow these steps: Go to Configuration > Integrations > Transaction Validator in the Magify interface.In the Application filter, find and select your application from the dropdown list for which the transaction validation will be enabled.Go to App Store Connect.Navigate to App Information In the left menu, go to General > App Information.",{"id":3956,"title":3957,"titles":3958,"content":3959,"level":1104},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#android-application","Android Application",[3947],"To configure transaction validation for an Android application, follow these steps: Go to Configuration > Integrations > Transaction Validator in the Magify interface.In the Application filter, find and select your application from the dropdown list for which the transaction validation will be enabled.Сlick its name to begin setup.",{"id":3961,"title":3962,"titles":3963,"content":3964,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#for-new-publishers","For new publishers:",[3947,3957],"Go to the APIs Console and log in with your Google Play Console account.Select Create project. Provide a Project name in the dialog box that appears and click Create. Click on Library in the left panel and find the Google Play Android Developer API. Turn the Google Play Android Developer API on. In the left sidebar, select OAuth consent screen. If you see a screen that says \"Google Auth Platform not configured yet\", click the Get started button to begin setting up your OAuth configuration.On the App Information screen, fill in the required fields and check the box \"I agree to the Google API Services: User Data Policy\". Click Continue to complete the OAuth consent screen setup.Once the consent screen setup is complete, you’ll be redirected to the OAuth Overview page. Click the Create OAuth client button to generate your credentials. You will proceed to configure your OAuth 2.0 Client ID and Client Secret, which are required for integration in Magify. On the Create OAuth client ID screen: In the Application type dropdown, select Web application.Provide a name for your app in the Name field (e.g.,Magify Transaction Validator). This name is internal and used only for your reference.In the Authorized redirect URIs section, you must enter the following URL:https://developers.google.com/oauthplayground . This is required for using OAuth 2.0 Playground to manually generate a refresh token. Once completed, click Create to generate your Client ID and Client Secret. These credentials will be used in the Magify interface. To generate a Refresh Token, follow the steps outlined in the official Google documentation: Generating a Refresh Token, or follow the steps below. This guide will walk you through the process of setting up OAuth 2.0 credentials and retrieving the token required for Magify to access Google Play Developer APIs.\nGo to the OAuth 2.0 Playground.Click the settings icon (⚙️) in the upper right corner. From the Force prompt drop-down, select \"No\", and check the box \"Use your own OAuth credentials\".Then, input your Client ID and Client Secret.In Step 1: Select & Authorize APIs, scroll down to find Google Play Android Developer API v3 and select the following scope:\nhttps://www.googleapis.com/auth/androidpublisherClick Authorize APIs to continue the authentication flow.  6. After authorizing the selected scopes, you will receive an Authorization Code in Step 1. Click the Exchange authorization code for tokens button. You will then receive:\na Refresh Token (used to generate new access tokens)an Access Token (used for authenticated API requests) Paste credentials into the corresponding fields in the Magify configuration form.",{"id":3966,"title":3967,"titles":3968,"content":3969,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#if-the-application-has-already-been-added-to-magify","If the application has already been added to Magify:",[3947,3957],"If publisher applications have already been added to Magify, there's no need to generate new credentials. All apps created within the same Google Play Console structure share the same OAuth 2.0 credentials. To reuse existing credentials:\nNavigate to Configurations > Integrations > Transaction Validator in the Magify interface.Find your application that has already been integrated with Google Play.Copy the following values:\nGoogle Client IDGoogle Client SecretGoogle Refresh Token You can safely use these credentials for all other apps linked to the same Google Play developer account.",{"id":3971,"title":1343,"titles":3972,"content":3973,"level":1104},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#saving-the-configuration",[3947],"Once all required fields are filled in, click Save to complete the setup.",{"id":3975,"title":467,"titles":3976,"content":467,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/transaction-validator#",[3947,1343],{"id":328,"title":327,"titles":3978,"content":3979,"level":1110},[],"This article explains how to install and configure the Magify SDK to enable real-time event tracking, including in-game purchases and ad impressions.",{"id":3981,"title":467,"titles":3982,"content":3983,"level":1110},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk#",[],"After setting up data grabbers, integrating the Magify SDK enables real-time event tracking within your game.",{"id":3985,"title":3986,"titles":3987,"content":3988,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk#_1-install-the-sdk","1. Install the SDK",[467],"Download the latest SDK from the MagifyFollow the installation instructions",{"id":3990,"title":3991,"titles":3992,"content":3993,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk#_2-set-up-event-tracking","2. Set Up Event Tracking",[467],"Once the SDK is installed, configure it to send key game events to Magify. Purchase Events Track in-game purchases to analyze revenue and user spending behavior. In order to successfully collect analytics on in-game purchases you need to add information about available products to our system (Product ID's)When the products were added to our system your programmer/you can implement the sending of analyticsSend purchase data (Product ID, kind, cost, metadata) Ad Impressions Tracking Monitor ad interactions to optimize placements and monetization strategies. Track ad impressions.",{"id":3995,"title":3996,"titles":3997,"content":3998,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk#_3-purchase-validation-in-magify","3. Purchase Validation in Magify",[467],"Purchase validation is a critical feature in Magify that ensures the integrity and security of in-game transactions. Why Validate Purchases? Prevent Fraud: Block unauthorized or fake transactions.Ensure Accurate Revenue Tracking: Validate purchases to maintain correct financial data. How Purchase Validation Works Magify provides a server-side purchase validation system that verifies transactions with platform providers like Google Play, Apple App Store. Here you can read how to set up Magify purchase verification or if you use RevenueCat, you can connect its integration.",{"id":4000,"title":4001,"titles":4002,"content":4003,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk#next-steps","Next Steps",[467],"Next, we recommend proceeding to Advanced Magify Integration, where you will gain access to enhanced analytics and LiveOps functionalities.For advanced setup and troubleshooting, visit our Help Center or contact our support team.",{"id":338,"title":337,"titles":4005,"content":467,"level":1110},[],{"id":4007,"title":4008,"titles":4009,"content":467,"level":1104},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/revenuecat#setting-up-revenuecat-webhooks-integration","Setting Up RevenueCat Webhooks Integration",[337],{"id":4011,"title":4012,"titles":4013,"content":4014,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/revenuecat#step-1-configure-webhooks-in-revenuecat","Step 1: Configure Webhooks in RevenueCat",[337,4008],"Log in to your RevenueCat account.Navigate to your project.Go to the Integrations section and click on the + New button.Select Webhooks as the integration type.",{"id":4016,"title":4017,"titles":4018,"content":4019,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/revenuecat#step-2-retrieve-required-information-in-magify","Step 2: Retrieve Required Information In Magify",[337,4008],"In Magify, navigate to: Integrations → Transaction Validator.Click Create New and create your application. Click Save Changes.Return to the Transaction Validator page and locate your application.",{"id":4021,"title":4022,"titles":4023,"content":4024,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/revenuecat#step-3-add-webhooks-integration-in-revenuecat","Step 3: Add Webhooks Integration in RevenueCat",[337,4008],"Paste the Webhook URL in the designated field.Add the Authorization Code as the value for the Authorization Header Value.",{"id":4026,"title":4027,"titles":4028,"content":4029,"level":1120},"/magify-basic-integration-setup/step-2-install-and-configure-the-sdk/revenuecat#step-4-send-test-webhook-in-revenuecat","Step 4: Send Test Webhook in RevenueCat",[337,4008],"Expected behavior: A 400 Error will appear in the response. This is an expected result.",{"id":342,"title":341,"titles":4031,"content":4032,"level":1110},[],"This is a step by step guide",{"id":4034,"title":4035,"titles":4036,"content":467,"level":1104},"/step-by-step#step-by-step-guide-to-creating-an-app-and-campaigns","Step-by-Step Guide to Creating an App and Campaigns",[341],{"id":4038,"title":4039,"titles":4040,"content":4041,"level":1104},"/step-by-step#table-of-contents","Table of Contents",[341],"This guide explains the basics of working with the SDK, covering backend configuration via the web interface and corresponding code setup. By completing this guide, you'll achieve a minimal SDK integration with support for interstitial ads, in-app purchases, and rewarded ads. These are examples, and additional campaign types can be explored [here]. It focuses on basic campaign configuration, with links to detailed documentation provided at the end of each section.",{"id":4043,"title":4044,"titles":4045,"content":4046,"level":1104},"/step-by-step#how-to-create-and-configure-an-application-in-magify","How to Create and Configure an Application in Magify",[341],"If you created the application during onboarding, you can skip this step.",{"id":4048,"title":4049,"titles":4050,"content":4051,"level":1120},"/step-by-step#step-1-create-an-application-with-basic-parameters","Step 1: Create an Application with Basic Parameters",[341,4044],"Navigate to the Application section.Click on the Create New button.In the application creation form, fill out all fields. Use the data provided by your project or product managers.For detailed descriptions of all fields (both mandatory and optional), refer to the article Create New Application.",{"id":4053,"title":4054,"titles":4055,"content":4056,"level":1120},"/step-by-step#step-2-define-default-user-profile","Step 2: Define Default User Profile",[341,4044],"On this step, you define the parameters to create a \"default user profile\" for your application. For instance, this could be a user from the United States with the latest iPhone, the newest OS version, and other key characteristics (your average user). This default configuration is used to generate a JSON file based on the profile you’ve configured. The JSON file will be generated in the next step of this instruction and then embedded into your app's build. It ensures that if a user launches the app for the first time without an internet connection, they still have access to a basic configuration. Go to the App Config section.Click on the Create New button.In the form, fill out the fields required to retrieve your app's configuration. The fields below are necessary for retrieving the default configuration. Other fields, listed further down, are used for custom configuration and are not required for basic setup. Mandatory fields for default configuration: Application: Select your application from the dropdown menu.Device: Choose the most popular device type for your app’s audience.Orientation: Select the app's orientation.OS version: Choose the most popular operating system version.Initial app version: Select the first version of your application.Language: Specify the language for the default configuration. This should match the primary language of your app's users.Country: Specify the country for the default configuration. This should reflect the primary market of your app.Launch date: Set the potential user's app download date and time. This date acts as a starting point; all subsequent downloads are included in the configuration scope. The download date must be later than or equal to the app version creation date. For detailed descriptions of all fields (both mandatory and optional), refer to the article App Config.",{"id":4058,"title":4059,"titles":4060,"content":4061,"level":1120},"/step-by-step#step-3-download-configuration-files-for-the-application","Step 3: Download Configuration Files for the Application",[341,4044],"Navigate to the App Version section.Use the Add Filters dropdown in the top-left corner to select your application.Click Apply in the top-right corner to filter the results.Locate the desired version in the table and click the Default Config (Actions: Get default config) button next to it.The Default Config file will be downloaded to the Downloads folder on your device.",{"id":4063,"title":4064,"titles":4065,"content":4066,"level":1104},"/step-by-step#preparatory-steps-for-campaign-creation","Preparatory Steps for Campaign Creation",[341],"A campaign is an event handler that performs actions in response to application events. Examples include: level_opened: Displays interstitial ads.hint_tapped: Promotes in-app purchases.session_start: Triggers rewarded ads. A campaign consists of configurations that define what action to take and under what conditions. This core SDK feature enables tailored engagement and monetization. Before setting up a campaign, create a user segmentation to define the target audience.",{"id":4068,"title":4069,"titles":4070,"content":4071,"level":1120},"/step-by-step#create-a-segmentation","Create a Segmentation",[341,4064],"Segmentation divides users into groups (segments) based on characteristics like app version, country, or device, enabling targeted campaigns. For more details, refer to the Segmentation guide. Examples: A segment could include users on a specific version of your application.Another segment might target users from a specific country or using a particular device. For more information, refer to the Segmentation. Navigate to the Segmentation section in the admin panel.Click Create New.Fill out all required fields:\nName: Enter a name for the segment. For example 1.0.0+ (indicating version 1.0.0 and above).Application: Select your application from the dropdown list.App Version: Under the App Version subsection, select the previously created version of your application in the App version from field. For example: 1.0.0.Save the segment by clicking the Save button. Once the segment is created, it can be linked to a campaign. This enables you to target specific user groups and dynamically trigger actions in response to application events.",{"id":4073,"title":4074,"titles":4075,"content":467,"level":1104},"/step-by-step#creating-an-interstitial-campaign","Creating an Interstitial Campaign",[341],{"id":4077,"title":4078,"titles":4079,"content":4080,"level":1120},"/step-by-step#step-1-navigate-to-the-campaign-section","Step 1: Navigate to the Campaign Section",[341,4074],"Go to the Campaign section in the admin panel.Click Create New.",{"id":4082,"title":4083,"titles":4084,"content":4085,"level":1120},"/step-by-step#step-2-fill-out-mandatory-fields","Step 2: Fill Out Mandatory Fields",[341,4074],"Complete all required fields. Basic Settings (Top Section): Name: Enter a unique name for the campaign.Application: Select your application from the dropdown.Type: Choose interstitial campaign.Priority: Leave this value as 1 by default.Status: Set the campaign status to running (active).Leave all fields under Status (Subscription, In-App, etc.) as default unless instructed otherwise.",{"id":4087,"title":4088,"titles":4089,"content":4090,"level":1120},"/step-by-step#step-3-fill-out-the-extension-block","Step 3: Fill Out the Extension Block",[341,4074],"Segmentations: Select the previously created user segment.Splash Screen**: Choose **\"No\"** to disable the splash screen before showing the interstitial ad.\nTimeout: Specify how many seconds the system should attempt to load the interstitial ad if it is not ready when triggered. Keep the default value of 5.",{"id":4092,"title":4093,"titles":4094,"content":4095,"level":1120},"/step-by-step#step-4-configure-the-events-block","Step 4: Configure the Events Block",[341,4074],"The Event specifies the trigger that will activate the campaign within the application. Click +add new item to create a new event.In the Native Elementform that opens, fill out the required fields:\nName: Enter the technical name for the game event. For example: level_openedHuman readable name: Enter a readable name for the game event (e.g., the same value as Name for consistency).Type name: Select Event.Save the event by clicking Save.After creating the event, ensure it is added to the corresponding field in the campaign. Alternatively, it may be automatically added to the campaign. A unique event is created once and can be used across multiple campaigns.",{"id":4097,"title":4098,"titles":4099,"content":4100,"level":1120},"/step-by-step#step-5-configure-the-global-counter","Step 5: Configure the Global Counter",[341,4074],"In the Global Counter section for event: For Global From Value and Global Period, set the value to 1 and 1. This configuration ensures that the campaign will be displayed every time the event is triggered (on the first occurrence each time).",{"id":4102,"title":4103,"titles":4104,"content":4105,"level":1120},"/step-by-step#step-6-save-the-campaign","Step 6: Save the Campaign",[341,4074],"Click Save to finalize the campaign configuration.",{"id":4107,"title":4108,"titles":4109,"content":467,"level":1104},"/step-by-step#creating-an-in-app-campaign","Creating an In-App Campaign",[341],{"id":4111,"title":4078,"titles":4112,"content":4080,"level":1120},"/step-by-step#step-1-navigate-to-the-campaign-section-1",[341,4108],{"id":4114,"title":4083,"titles":4115,"content":4116,"level":1120},"/step-by-step#step-2-fill-out-mandatory-fields-1",[341,4108],"Complete all required fields. Basic Settings (Top Section): Name: Enter a unique name for the campaign. For example:IOS IP WW NoUI 10H 3 99Application: Select your application from the dropdown.Type: Choose In-App campaign.Priority: Leave this value as 1 by default.Status: Set the campaign status to running (active).Leave all fields under Status (Subscription, In-App, etc.) as default unless instructed otherwise.",{"id":4118,"title":4088,"titles":4119,"content":4120,"level":1120},"/step-by-step#step-3-fill-out-the-extension-block-1",[341,4108],"Segmentations: Select the previously created user segment.Creative: Select Default No UI – it is automatically generated when the application is created, so there is no need to create it manually.",{"id":4122,"title":4093,"titles":4123,"content":4124,"level":1120},"/step-by-step#step-4-configure-the-events-block-1",[341,4108],"The Event defines the in-game event that will trigger the campaign. Click +add new item to create a new event.In the Native Elementform that opens, fill out the required fields:\nName: Enter the technical name for the game event. For example: hint_tapped (Clicking the help button in the game displays a reward hint).Human readable name: Enter a readable name for the game event (e.g., the same value as Name for consistency).Type name: Select Event.Save the event by clicking Save.After creating the event, ensure it is added to the corresponding field in the campaign. Alternatively, it may be automatically added to the campaign upon event creation. A unique event is created once and can be used across multiple campaigns.",{"id":4126,"title":4098,"titles":4127,"content":4100,"level":1120},"/step-by-step#step-5-configure-the-global-counter-1",[341,4108],{"id":4129,"title":4130,"titles":4131,"content":4132,"level":1120},"/step-by-step#step-6-setting-up-nested-campaigns-with-product-id-and-context","Step 6: Setting Up Nested Campaigns with Product ID and Context",[341,4108],"An In-App Campaign assumes that the user receives a reward after purchasing an offer. The reward is divided into two elements: Product ID and Product ID Context. Product ID: This represents the item created in the console and imported into Magify. It defines the price and the item being sold in the store (e.g., a $10 purchase).Product ID Context: This specifies what the user receives in the game as a reward for the purchase, such as 100 hints or 10 other boosters. In the SDK, a product refers to any in-game object that the player receives upon completing a campaign. For example, an in-app purchase might provide hints or boosters as a reward. To specify the reward, you need to configure the product context in the nested section at the bottom of the campaign configuration. Example: You are selling 10 hints for $3.99. The Product ID is the item created in the console, representing the $3.99 purchase.The Product ID Context specifies that the user will receive 10 hints. Click on the + Add Nested Campaigns button. Create a New Product ID Under the Product ID field, click +add new item.In the Product IDform that appears, complete all required fields:\nName: Enter the technical name for the Product ID. For example: product_A_id. This type of Product ID is created in the console.Human Readable Name: Provide a user-friendly name for the Consumable Product ID (we recommend duplicating the value from the Name field).Type Name: Select Consumable Product ID.Cost: Enter the offer price. For example: 3.99. Use the price specified in the console during product creation.Customs: The Customs field allows you to define additional configuration parameters for the product in JSON format. This field is designed to provide flexibility for adding custom attributes or logic that the system can interpret during product processing. This field is optional and can be used for use cases such as: Example: {\n  \"items\": [\n    {\n      \"bonus\": \"hint\",\n      \"count\": 10\n    }\n  ]\n} Save the product by clicking Save. After creating the Product ID, ensure it is added to the corresponding field in the campaign. Alternatively, it may be automatically added to the campaign. Create a New Product ID Context To specify the reward users will receive for purchase: Click +add new item under the Product ID Context field.In the Product ID Context form that appears, complete all required fields:Name: Enter the context name (use the associated Consumable Product ID and include details like the quantity and type of reward).Type: Choose In-App Product ID Context.Product ID: Enter a Consumable Product ID.Customs: You can replicate the Customs field from the Product ID here.Save the Product ID Context by clicking Save.After creating the Product ID Context, ensure it is added to the corresponding field in the campaign. Alternatively, it may be automatically added to the campaign. Configure the Nested Campaign In our system, campaigns can have hierarchical structures and nesting. This means one campaign group can be organized under another campaign. To describe these structures, we use the following terminology: Parent Campaign: The primary campaign that may contain one or more nested campaigns or none at all.Nested Campaign: A child campaign contained within a Parent Campaign. Transactions and actions are associated specifically with Nested Campaigns. Assign a Name to the nested campaign. We recommend copying the parent campaign name and removing unnecessary platform details.For example: If the parent campaign is named IOS IP WW NoUI 10H 3 99, the nested campaign can be named IP WW NoUI 10H 3 99.",{"id":4134,"title":4135,"titles":4136,"content":4105,"level":1120},"/step-by-step#step-7-save-the-campaign","Step 7: Save the Campaign",[341,4108],{"id":4138,"title":4139,"titles":4140,"content":467,"level":1104},"/step-by-step#creating-an-rewarded-video-campaign","Creating an Rewarded Video Campaign",[341],{"id":4142,"title":4078,"titles":4143,"content":4080,"level":1120},"/step-by-step#step-1-navigate-to-the-campaign-section-2",[341,4139],{"id":4145,"title":4083,"titles":4146,"content":4147,"level":1120},"/step-by-step#step-2-fill-out-mandatory-fields-2",[341,4139],"Complete all required fields. Basic Settings (Top Section): Name: Enter a unique name for the campaign. For example: IOS RW WW SC Welcome Pack 3HApplication: Select your application from the dropdown.Type: Choose Rewarded Video Campaign.Priority: Leave this value as 1 by default.Status: Set the campaign status to running (active).Leave all fields under Status (Subscription, In-App, etc.) as default unless instructed otherwise.",{"id":4149,"title":4088,"titles":4150,"content":4151,"level":1120},"/step-by-step#step-3-fill-out-the-extension-block-2",[341,4139],"Segmentations: Select the previously created user segment.",{"id":4153,"title":4154,"titles":4155,"content":4156,"level":1120},"/step-by-step#step-4-create-a-creative","Step 4: Create a Creative",[341,4139],"Click +add new item to create a new creative.Fill out the required fields in the form that opens: Name: Enter a technical name for the creative item. For example: SC Welcome Pack.Application: Select the relevant application from the dropdown menu.Type: Choose the creative type Screen Creative.Key: Enter a unique key associated with this creative. For example: welcome_pack.Customs Section: Use the provided editor to add any additional configurations in JSON format, if you need.Save the creative by clicking Save.After creating the creative, ensure it is added to the corresponding field in the campaign. Alternatively, it may be automatically added to the campaign upon creative creation.",{"id":4158,"title":4159,"titles":4160,"content":4161,"level":1120},"/step-by-step#step-5-configure-the-events-block","Step 5: Configure the Events Block",[341,4139],"The Event defines the in-game event that will trigger the campaign. Click +add new item to create a new event.In the Native Elementform that opens, fill out the required fields:\nName: Enter the technical name for the game event. For example: session_startHuman readable name: Enter a readable name for the game event (e.g., the same value as Name for consistency).Type name: Select Event.Save the event by clicking Save.After creating the event, ensure it is added to the corresponding field in the campaign. Alternatively, it may be automatically added to the campaign upon event creation. A unique event is created once and can be used across multiple campaigns.",{"id":4163,"title":4164,"titles":4165,"content":4100,"level":1120},"/step-by-step#step-6-configure-the-global-counter","Step 6: Configure the Global Counter",[341,4139],{"id":4167,"title":4168,"titles":4169,"content":4170,"level":1120},"/step-by-step#step-7-setting-up-nested-campaigns-with-product-id-and-context","Step 7: Setting Up Nested Campaigns with Product ID and Context",[341,4139],"A Rewarded Video Campaign assumes that the user receives a reward after watching a rewarded ad. This reward must be created as a Product (Product ID – defining the price and the item being offered) and linked to a Context (Product ID Context – specifying what the user will receive after completing the action). Click on the + Add Nested Campaigns button. Create a New Product ID Initially, there will be no Product ID available. To create a new one: Under the Product ID field, click +add new item.In the Product IDform that appears, complete all required fields:\nName: Enter the technical name for the in-game event. For example: product_A_id.Human Readable Name: Provide a user-friendly name for the Rewarded Product ID (we recommend duplicating the value from the Name field).Type Name: Select Rewarded Product ID.Customs: You can leave the \"Customs\" section empty, as the reward will be managed through the context configuration. Save the product by clicking Save. After creating the Product ID, ensure it is added to the corresponding field in the campaign. Alternatively, it may be automatically added to the campaign. Create a New Product ID Context To specify the reward users will receive for watching an reward ad Click +add new item under the Product ID Context field.In the Product ID Contextform that appears, complete all required fields:\nName: Enter the context name (use the associated Rewarded Product ID and include details like the quantity and type of reward). For example: rv_product_A_id 3H.Type: Choose Rewarded Product ID Context.Product ID: Enter a Rewarded Product ID. For example: rv_product_A_id.Customs: The Customs field allows you to define additional configuration parameters for the product in JSON format. This field is designed to provide flexibility for adding custom attributes or logic that the system can interpret during product processing. This field is optional and can be used for use cases such as:Specifying product properties (e.g., bonuses, multipliers). Configuring dynamic behaviors tied to the product.Including additional metadata. Example: {\n  \"items\": [\n    {\n      \"bonus\": \"hint\",\n      \"count\": 3\n    }\n  ]\n} Configure the Nested Campaign Assign a Name to the nested campaign. We recommend copying the parent campaign name and removing unnecessary platform details. For example: If the parent campaign is named IOS RW WW SC Welcome Pack 3H, the nested campaign can be named RW WW SC Welcome Pack 3H.",{"id":4172,"title":4135,"titles":4173,"content":4174,"level":1120},"/step-by-step#step-7-save-the-campaign-1",[341,4139],"Click Save to finalize the campaign configuration. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":348,"title":347,"titles":4176,"content":4177,"level":1110},[],"Learn how Sandbox works, how it differs from Production, and how to safely test configurations, events, and analytics without affecting live data.",{"id":4179,"title":4180,"titles":4181,"content":4182,"level":1104},"/sandbox-and-production-environments#overview","Overview",[347],"Sandbox is an isolated testing environment designed for configuring, validating, and debugging configurations, events, and analytics without impacting Production data.\nThe current Sandbox implementation provides the base environment separation functionality (Stage 0).\nSandbox capabilities will be expanded in future iterations. This article describes the current system behavior.\nSandbox and Production analytics data are fully isolated and never mixed.",{"id":4184,"title":4185,"titles":4186,"content":4187,"level":1104},"/sandbox-and-production-environments#environment-switcher","Environment Switcher",[347],"To switch environments, open any Remote Config section and use the Sandbox toggle in the top-right corner of the interface.",{"id":4189,"title":4190,"titles":4191,"content":4192,"level":1104},"/sandbox-and-production-environments#where-the-sandbox-toggle-is-available","Where the Sandbox toggle is available",[347],"The Sandbox toggle is available only in Remote Config sections where entities have separate versions for Sandbox and Production.",{"id":4194,"title":4195,"titles":4196,"content":4197,"level":1120},"/sandbox-and-production-environments#sections-where-sandbox-is-available","Sections where Sandbox is available",[347,4190],"You can enable and use Sandbox when working with the following entities: CampaignCreativeSegmentationA/B TestA/B Test Impression LimitApplication FeatureStored Application FeatureApp ConfigImpression LimitsSegmented Impression LimitProduct ID ContextTag In these sections, entities exist separately in Sandbox and Production, and switching the environment affects which entities are created and edited.",{"id":4199,"title":4200,"titles":4201,"content":4202,"level":1120},"/sandbox-and-production-environments#sections-where-sandbox-is-not-available","Sections where Sandbox is not available",[347,4190],"The Sandbox toggle is not clickable in sections with shared entities that are used in both Sandbox and Production: ApplicationApp VersionOrganizationChainCustom EventsNative ElementsNative Element Group These entities are common for both environments, so environment switching is not required.",{"id":4204,"title":4205,"titles":4206,"content":4207,"level":1120},"/sandbox-and-production-environments#summary-rule","Summary rule",[347,4190],"If an entity has separate versions for Sandbox and Production, the Sandbox toggle is available.If an entity is shared across environments, the Sandbox toggle is not clickable.",{"id":4209,"title":4210,"titles":4211,"content":4212,"level":1120},"/sandbox-and-production-environments#switching-behavior","Switching Behavior",[347,4190],"If there are unsaved changes on the page, the system shows a confirmation dialog. Confirmation dialog when switching to Sandbox with unsaved changes. Confirmation dialog when switching from Sandbox back to Production.",{"id":4214,"title":4215,"titles":4216,"content":4217,"level":1120},"/sandbox-and-production-environments#sandbox-mode-enabled","Sandbox Mode Enabled",[347,4190],"Sandbox mode enabled. All actions and changes apply only to the Sandbox environment. The Sandbox toggle is disabled in the Profile and Settings sections.",{"id":4219,"title":4220,"titles":4221,"content":4222,"level":1104},"/sandbox-and-production-environments#visual-environment-indicators","Visual Environment Indicators",[347],"The interface always visually indicates the active environment.",{"id":4224,"title":4225,"titles":4226,"content":4227,"level":1120},"/sandbox-and-production-environments#sandbox","Sandbox",[347,4220],"Sandbox mode interface. Yellow visual indicators highlight the test environment.",{"id":4229,"title":4230,"titles":4231,"content":4232,"level":1120},"/sandbox-and-production-environments#production","Production",[347,4220],"Production mode interface. The standard color scheme indicates the live environment.",{"id":4234,"title":4235,"titles":4236,"content":4237,"level":1104},"/sandbox-and-production-environments#creating-and-editing-entities","Creating and Editing Entities",[347],"Entities are created and edited only within the active environment. when Sandbox is enabled, changes apply only to Sandbox entities;when Sandbox is disabled, changes apply only to Production entities. Sandbox and Production entities are independent and are not synchronized automatically.\nThis behavior is intentional to prevent accidental propagation of test changes into Production.",{"id":4239,"title":4240,"titles":4241,"content":4242,"level":1104},"/sandbox-and-production-environments#current-limitations-stage-0","Current Limitations (Stage 0)",[347],"The following limitations apply in the current implementation: entities cannot be moved between Sandbox and Production;Sandbox entities cannot be used in Production;there is no automatic configuration synchronization between environments;Sandbox and Production are fully isolated;all data in reports and dashboards is currently combined and visible across all environments, regardless of the selected environment. These limitations are part of the initial implementation and are planned to be changed in future iterations.",{"id":4244,"title":4245,"titles":4246,"content":4247,"level":1104},"/sandbox-and-production-environments#summary","Summary",[347],"Sandbox provides a safe testing environment, clear separation between test and live data, and predictable configuration behavior.\nSandbox functionality will continue to evolve, and all updates will be reflected in the Help Center documentation.",{"id":362,"title":361,"titles":4249,"content":4250,"level":1110},[],"Overview of Parent and Nested Campaigns in Magify, explaining their structure, and best practices for analyzing campaign performance",{"id":4252,"title":467,"titles":4253,"content":467,"level":1110},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#",[],{"id":4255,"title":492,"titles":4256,"content":4257,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#introduction",[467],"Before using the In-App, Monetization Insights, Campaign Cohort, and A/B Test Cohort reports, it is essential to review this article. Understanding the principles outlined here will help ensure accurate data interpretation and effective analysis. Campaigns in our system are structured into two hierarchical levels, enabling organization through Parent and Nested Campaigns. This means that a group of campaigns can be grouped under a higher-level parent campaign, creating a structured relationship between them. To clearly define these relationships, we use the following terminology: Parent Campaign – A top-level campaign that may contain one or more nested campaigns or exist independently without any nested campaigns.Nested Campaign – A child campaign that operates within a parent campaign. All purchases and performance tracking occur at the nested campaign level.",{"id":4259,"title":4260,"titles":4261,"content":4262,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#example-parent-and-nested-campaigns-in-a-demo-application","Example: Parent and Nested Campaigns in a Demo Application",[467],"The screenshot below illustrates a Parent Campaign containing three Nested Campaigns. When a mobile app user sees this campaign, impression data is sent to analytics for both the Parent Campaign (representing the entire store view) and each of the three Nested Campaigns (representing individual offers).",{"id":4264,"title":4265,"titles":4266,"content":4267,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#how-interactions-are-tracked","How Interactions Are Tracked",[467],"User interactions such as clicks, purchases, ad views, and bonus claims are associated with specific Product IDs, which correspond to Nested Campaigns. For example: A user sees the Parent Campaign, which features three offers in a single creative.They select the first offer (\"Standard Pack +100\").The click action, as well as the purchase transaction (price, quantity, and product details), is attributed specifically to the Nested Campaign linked to this offer.",{"id":4269,"title":4270,"titles":4271,"content":4272,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#why-this-structure-matters","Why This Structure Matters",[467],"This setup enables comprehensive analysis of user behavior: ✅ At the Parent Campaign level – Measure overall impressions, clicks, and conversions for the entire campaign. ✅ At the Nested Campaign level – Identify which specific offer from the campaign generated the highest engagement and purchases. By leveraging this structure, marketers can assess campaign effectiveness at multiple levels, optimize promotions, and refine in-app store strategies. All offers from the previous screenshot are represented within a Parent Campaign.The screenshot below shows how this Parent Campaign is structured in the admin panel: it includes all elements that define the campaign, such as creatives, promotions, and offers, presented as a store-like display.Inside the Parent Campaign, there are three Nested Campaigns, each associated with its own Product ID:This configuration enables precise tracking and management of each Nested Campaign while maintaining a structured hierarchy within the Parent Campaign. When analyzing campaign statistics, it is important to remember that, as mentioned earlier, the Impressions metric is collected at both the Parent Campaign and Nested Campaign levels. This means that the number of impressions for a Parent Campaign does not always equal the sum of impressions for its Nested Campaigns, especially in complex monetization setups.",{"id":4274,"title":4275,"titles":4276,"content":4277,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#parent-and-nested-campaign-statistics","Parent and Nested Campaign Statistics",[467],"The key consideration here is that the total number of impressions may vary when transitioning from Parent Campaign statistics to a Nested Campaign breakdown. To illustrate the relationship between Parent Campaign and Nested Campaign statistics, consider the following example using in-app campaigns.Imagine that a Parent Campaign (Parent A) represents an in-game store featuring two offers: Nested B and Nested C. These Nested Campaigns correspond to different in-app purchases with varying prices and bonus structures.Basic Scenario: Single Parent Campaign with Two Nested CampaignsIf the in-game store (Parent A) receives 10 impressions, the report would display the following:Parent Campaign-Level ImpressionsParent CampaignImpressionsParent A10Nested Campaign-Level ImpressionsParent CampaignNested CampaignImpressionsParent ANested B10Parent ANested C10Advanced Scenario: Different Display Rules for Nested CampaignsNow, let's consider a more complex setup where each Nested Campaign follows a different display schedule:Nested B is shown only on Mondays.Nested C is shown only on Tuesdays.On Monday, the in-game store received 6 impressions, and on Tuesday, it received 4 impressions.Monday StatisticsParent CampaignImpressionsParent A6Parent CampaignNested CampaignImpressionsParent ANested B6Parent ANested C0Tuesday StatisticsParent CampaignImpressionsParent A4Parent CampaignNested CampaignImpressionsParent ANested B0Parent ANested C4Total Impressions for Both DaysParent CampaignImpressionsParent A10Parent CampaignNested CampaignImpressionsParent ANested B6Parent ANested C4Further Complexity: Adding a Third Nested CampaignNow, let’s enhance the setup by introducing a third offer (Nested D), which will always be displayed in the store, regardless of the day of the week.On Monday, the statistics would be:Monday StatisticsParent CampaignImpressionsParent A6Parent CampaignNested CampaignImpressionsParent ANested B6Parent ANested C0Parent ANested D6Tuesday StatisticsParent CampaignImpressionsParent A4Parent CampaignNested CampaignImpressionsParent ANested B0Parent ANested C4Parent ANested D4Total Impressions for Both DaysParent CampaignImpressionsParent A10Parent CampaignNested CampaignImpressionsParent ANested B6Parent ANested C4Parent ANested D10Key TakeawaysParent Campaigns and Nested Campaigns have separate impression counts.The number of impressions at the Parent Campaign level does not necessarily equal the sum of Nested Campaign impressions.Nested Campaign impressions depend on their display conditions.Some offers may appear only on specific days, impacting overall statistics.A Nested Campaign always tracks impressions independently, even if multiple offers exist under the same Parent Campaign.This structure allows for granular analysis of user engagement with each offer while maintaining a holistic view of store performance at the Parent Campaign level. We also have campaign-related data that determines how Impressions statistics are displayed — either at the Parent Campaign level or the Nested Campaign level. When filtering (selecting a value in the report’s top filter) or breaking down data (activating a dimension in the table) by: Product IDProduct ID TypeNested Monetization Model the Impressions metric will always be displayed at the Nested Campaign level. This limitation arises because Product ID, Product ID Type, and Nested Monetization Model are attributes exclusive to Nested Campaigns and are not applicable at the Parent Campaign level. As a result, the report automatically switches to the Nested Campaigns level.",{"id":4279,"title":4280,"titles":4281,"content":4282,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#filters-and-dimensions-product-id-creative-example","Filters and Dimensions: Product ID & Creative Example",[467],"For example, when the Creative dimension is activated, the report displays the total number of Impressions at the Parent Campaign level:However, as soon as a second active dimension is added for Product (Product ID), the report immediately switches to displaying Impressions at the Nested Campaign level.Parent Campaign statistics are useful for comparing two creatives at a high level.Nested Campaign statistics are useful for analyzing how the same product performs across different creatives. NoteA creative is not linked to a product, even though it may seem so at first glance. Instead, a creative is associated with the Parent Campaign, while the product and its type are linked to the Nested Campaign.As a result, it is incorrect to gather overall statistics for a creative by selecting it in the filter and breaking down data by products.The reason for this is that the moment a user sees the creative corresponds to the impression of the Parent Campaign. However, when selecting a Product dimension, the report switches to displaying statistics at the Nested Campaign level.",{"id":4284,"title":4285,"titles":4286,"content":4287,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#working-with-products-and-creatives","Working with Products and Creatives",[467],"To compare the performance of multiple creatives, the recommended approach is to select the desired creatives in the Creative filter and use Creative as a breakdown dimension.In this case, the report will display statistics at the Parent Campaign level, as creatives are linked to Parent Campaigns:If the goal is to compare the performance of the same product across different creatives, the best approach is to select the product in the filter and apply a breakdown by both Product and Creative dimensions.In this case, the report will display statistics at the Nested Campaign level for all campaigns associated with the selected product. Additionally, the Creative value will be displayed from the Parent Campaign that includes these Nested Campaigns.If the goal is to gather overall statistics for a product, the best approach is to select the product in both the filter and dimensions.In this case, the report will display statistics at the Nested Campaign level for all campaigns associated with the selected product.",{"id":4289,"title":4290,"titles":4291,"content":4292,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#filtering-by-campaign-type-important-considerations","Filtering by Campaign Type: Important Considerations",[467],"Use caution when filtering by Campaign Type, as this filter includes all available campaign types in Magify—both at the Parent Campaign and Nested Campaign levels. When selecting multiple campaign types at the same time, ensure that all selected types belong exclusively to either Parent or Nested levels. Nested Campaign types can be easily identified, as they always start with the word \"Nested\" in their names. Additionally, other filters are directly related to the Campaign Type filter. Do not select Parent Campaign types while simultaneously using filters designed for Nested Campaigns, such as: Product IDProduct ID TypeNested Monetization Model Doing so may result in missing data in the report.",{"id":4294,"title":4295,"titles":4296,"content":4297,"level":1104},"/reports-and-dashboards/understanding-parent-and-nested-campaigns#campaign-type-filter-examples","Campaign Type Filter Examples",[467],"For example, it is incorrect to select both Nested Campaigns and Creatives simultaneously. Creatives are an attribute of Parent Campaigns, and filtering by both levels at the same time will result in no data being displayed.This happens because filtering by both Parent and Nested campaign levels simultaneously creates a data conflict in the report.This situation can be resolved in two ways:Remove the Campaign Type filter altogether. Since selecting a Creative automatically includes all associated Parent Campaigns, additional filtering by Campaign Type is unnecessary.Manually select the appropriate Parent Campaign types. Ensure that the selected campaign types do not start with \"Nested\", as only Parent Campaigns should be included in this case. In Magify, the campaign name serves as the fundamental unit for collecting statistics in this report. To ensure the most accurate data collection, it is best to work directly with campaign names rather than relying solely on associated metadata. For easier navigation and filtering, we recommend using keywords in your campaign names, allowing you to quickly find relevant campaigns among all available filter values. Additionally, the Snapshots feature is a useful tool for saving and sharing pre-configured filter selections, enabling seamless collaboration with other users.",{"id":354,"title":358,"titles":4299,"content":4300,"level":1110},[],"This article explains reports and dashboards in Magify Analytics, detailing how they provide raw data and visual insights to analyze marketing performance, user behavior, monetization, and LiveOps effectiveness.",{"id":4302,"title":4180,"titles":4303,"content":4304,"level":1104},"/reports-and-dashboards#overview",[358],"Welcome to Magify Analytics, where data empowers you to optimize strategies, maximize revenue, and make data-driven decisions. Our reports and dashboards provide powerful tools to analyze user acquisition (UA), monetization, engagement, and live operations (LiveOps). With these tools, you can: Evaluate marketing campaign performance and identify the most profitable traffic sources.Analyze revenue streams from ads, in-app purchases, and subscriptions.Understand user behavior and detect patterns that influence LTV.Optimize LiveOps campaigns, test new mechanics, and improve player engagement.",{"id":4306,"title":4307,"titles":4308,"content":4309,"level":1120},"/reports-and-dashboards#what-do-reports-and-dashboards-include","What Do Reports and Dashboards Include?",[358,4180],"Reports – Provide detailed raw data for deep analysis and custom research.Dashboards – Visualize key metrics in an interactive format for quick decision-making.",{"id":4311,"title":4312,"titles":4313,"content":4314,"level":1120},"/reports-and-dashboards#key-features","Key Features:",[358,4180],"✅ Cohort analysis – Track user behavior over time to assess long-term value. ✅ LiveOps performance tracking – Analyze the effectiveness of events, bonuses, and special offers. ✅ Real-time monitoring – Keep track of campaign performance and monetization dynamics. ✅ Flexible segmentation – Filter data by time periods, traffic sources, regions, revenue types, and in-game activities. ✅ Optimization insights – Identify high-performing campaigns and revenue streams to refine growth strategies. Leverage Magify Analytics to see the story behind the numbers, find growth opportunities, and scale your success! 🚀",{"id":366,"title":365,"titles":4316,"content":467,"level":1110},[],{"id":4318,"title":467,"titles":4319,"content":467,"level":1110},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#",[],{"id":4321,"title":4322,"titles":4323,"content":4324,"level":1104},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#overview-and-key-features","Overview and Key Features",[467],"The A/B Test Cohort Report and Dashboard provide detailed insights into test results and the performance of testing campaigns. The report tracks user assignments by the date they were added to a test and helps identify the most successful group. The dashboard complements the report by offering key metrics and a cumulative analysis view for a deeper understanding of test results. Together, these tools enable data-driven decision-making and the optimization of A/B testing campaigns. Key features include: A/B Test Cohort Report Features: User Assignment Tracking – Monitors when users are assigned to a specific A/B test (assignment day).Group Performance Comparison – Evaluates multiple test groups to determine the most successful one.Parent and Nested Campaign Breakdown – Supports tracking at both the parent campaign level and the nested (child) campaign level. Read more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.Conversion and Monetization Metrics – Provides data on in-app purchases, engagement, and retention for each test group.Granular Data Segmentation – Enables filtering by cohort day, test groups, and campaign structures. A/B Test Cohort Dashboard Features: Aggregated Test Insights – Displays key A/B test metrics in a centralized dashboard.Cumulative Data View – Allows analysis of metrics over time to observe trends and long-term effects.Customizable Metrics Display – Users can select key performance indicators relevant to their test evaluation.Interactive Data Exploration – Provides drill-down capabilities for in-depth test result analysis.Performance Optimization Support – Helps refine A/B testing strategies based on real-time insights.",{"id":4326,"title":4327,"titles":4328,"content":4329,"level":1104},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#ab-tests-cohort-report","A/B Tests Cohort Report",[467],"The A/B Test Cohort Report is designed to analyze the performance of A/B testing campaigns. The report aggregates data starting from the assignment day, when the user was allocated to a test group. This allows for tracking experiment dynamics and identifying which group performs better.",{"id":4331,"title":4332,"titles":4333,"content":4334,"level":1120},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#structure-of-ab-testing-campaigns-in-the-report","Structure of A/B Testing Campaigns in the Report",[467,4327],"The report tracks metrics for two levels of campaigns: Parent Campaign – The main campaign that may contain one or more nested campaigns or exist without them.Nested Campaign – A child campaign within a parent campaign. All transactions and key performance indicators (KPIs) are attributed specifically to the nested campaign. This structure allows a detailed analysis of each test group’s performance, enabling data-driven decision-making. Read more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.",{"id":4336,"title":4337,"titles":4338,"content":4339,"level":1120},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#example-of-data-representation-in-the-report","Example of Data Representation in the Report",[467,4327],"Let's assume Parent Campaign A had 10 impressions and contained two Nested Campaigns, B and C, each offering different in-app purchase prices. In this case, the report would display the data as follows: Parent CampaignImpressionsParent A10 Parent CampaignNested CampaignImpressionsParent ANested B10Parent ANested C10",{"id":4341,"title":4342,"titles":4343,"content":4344,"level":1120},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#filters-and-dimensions","Filters and Dimensions",[467,4327],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionAppThe name of the application.A/B Test NameThe name of the A/B test for campaigns launched within the scope of A/B testing.A/B Test GroupThe name of the group for campaigns launched within the scope of A/B testing.Day of Assign to A/B TestThe date when the user was assigned to the selected A/B test. If a user installed the app earlier than they were assigned to the test, all data between the installation date and assignment date is excluded from the report.Week of Assign to A/B TestThe week when the user was assigned to the selected A/B test. If the app was installed earlier than the assignment, all data between installation and assignment is excluded.Day IndexThe index of the campaign viewing day. For example, on the installation day, the Day Index = 0.Monetization TypeThe type of monetization the campaign belongs to. Possible types include:Inapp Monetization: In-app purchasesAd Monetization: Interstitials, rewarded video, and bannersSubscription Monetization: SubscriptionsNon-Monetization: Actions unrelated to monetization, such as rate and review, and notificationsCross-promotion Monetization: Cross-promoCountryThe user's country.App VersionThe version of the application.Campaign TypeThe type of campaign, such as Banner, Interstitial, Rewarded Video, External, Subscription, LTO (Limited-Time Offer), Cross-promo, Rate and Review, among others.Parent CampaignThe name of the parent campaign, which may include one or more nested campaigns.Nested CampaignThe name of the nested campaign within the parent campaign. Transactions are attributed specifically to nested campaigns.Event NameThe name of the event associated with the impression, click, or purchase.Event NumberThe sequential counter of the event, which remains consistent throughout the app's lifecycle.Product IDThe ID of the product.Product ID TypeThe type of product.CreativeThe creative asset used in the campaign.Subscription StatusThe user’s status at the time of view/click/purchase, indicating whether they have an active subscription.In-App StatusThe user’s status at the time of view/click/purchase, indicating if they are free, paying, or unknown. When making the first purchase, the user’s status changes from free to paying.ParametersCustom parameters sent along with the event.",{"id":4346,"title":4347,"titles":4348,"content":4349,"level":1120},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#metrics","Metrics",[467,4327],"Below is a detailed list of the primary metrics available in the report, each accompanied by a description to clarify its purpose and usage: MetricDescriptionImpressionsThe number of campaign impressions for the selected cohort.ClicksThe number of campaign clicks for the selected cohort.Trial StartedThe number of trial activations within the selected date range.Trial ConvertedThe number of conversions to paid subscriptions after the trial ends for the selected user group. Refers to the subscription creation date based on RevenueCat data.First PaymentThe number of paid subscription activations within the selected date range.RenewsThe total number of subscription renewals, including initial renewals, for the selected cohort. Renewals are counted starting from the date the subscription campaign was shown. Data includes renewals within 180 days from the campaign display date.PurchasesThe total number of in-app purchases for the selected cohort.RevenueDepending on parameters, this may include revenue from banner, interstitial, rewarded ads, subscriptions, and in-app campaigns. Subscription revenue is calculated starting from the campaign display date, covering additional subscription-related events for up to 180 days.Ads RevenueThe total ad revenue for the selected cohort.In-apps RevenueThe total in-app revenue for the selected cohort.Subs RevenueThe total subscription revenue for the selected cohort.CTR, %Click-through rate calculated as Clicks / Impressions.pCVR, %The percentage of impressions that converted to first payments.tCVR, %The percentage of impressions that converted to free trials.CVR, %Conversion rate calculated as Purchases / Clicks.I2I, %Impression-to-install conversion rate calculated as Purchases / Impressions.eCPMEffective cost per thousand impressions calculated as (1000 * Revenue) / Impressions.Rewarded ImpressionsThe number of nested_rewarded campaign impressions for the selected cohort.Rewarded eCPMRevenue earned per 1,000 impressions for nested_rewarded campaigns.Active UsersThe number of unique client IDs participating in the selected campaign.Rev/Active UserRevenue generated per active user.IMPAUImpressions per active user, calculated as Impressions / Active Users. To analyze a test, select the desired time period in the filters corresponding to the test duration, the application, and the name of the test that was launched. Once these parameters are set, you can compare the obtained metrics across the test groups based on the chosen dimensions. This approach allows for a detailed evaluation of test performance and group comparison.",{"id":4351,"title":4352,"titles":4353,"content":4354,"level":1104},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#ab-tests-cohort-dashboard","A/B Tests Cohort Dashboard",[467],"The A/B Tests Cohort Dashboard includes key metrics for analyzing A/B tests from the A/B Tests Report. Additionally, some of these metrics can be viewed in a cumulative format, providing deeper insights into test performance over time.",{"id":4356,"title":4342,"titles":4357,"content":4358,"level":1120},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#filters-and-dimensions-1",[467,4352],"Below is a detailed list of the primary filters and dimensions available in the dashboard, each accompanied by a description to clarify its purpose and usage: Filters and DimensionsDescriptionAppThe name of the application.A/B TestThe name of the A/B test.CountryThe user's country.",{"id":4360,"title":4347,"titles":4361,"content":4362,"level":1120},"/reports-and-dashboards/ab-test-cohort-report-and-dashboard#metrics-1",[467,4352],"Below is a detailed list of the primary metrics available in the report, each accompanied by a description to clarify its purpose and usage: MetricDescriptionARPU Cumulative (Assigned)Revenue from in-app, subscription, and ad generated by all assigned users divided by the cohort size. Cohort size refers to users assigned to the test for more than M days since assignment to day X.Median SessionThe median session duration.Average SessionThe average session duration.ARPU Cumulative (Participated)Revenue from in-app, subscription, and ad generated by participating users divided by the cohort size of A/B tests. Cohort size refers to users participating in the test for more than M days since assignment to day X.AD ARPU Cumulative (Participated)Ad revenue generated by all participating users divided by the cohort size of A/B tests. Cohort size refers to users for whom more than M days have passed since assignment to day X.iARPPU CumulativeRevenue from in-app and subscription (based on data from the validator by Magify. Alternatively, we support data validation from RevenueCat) divided by the number of users generating this revenue. Applies to users for whom more than M days have passed since assignment to day X.% of Paying Users CumulativeThe percentage of users who purchased any product (in-app or subscription) after M days from assignment up to day X.Renews CumulativeThe cumulative number of subscription renewals for the selected test up to day X (trial converted and first payments excluded).Paid Subscription Activation CumulativeThe cumulative number of non-trial subscriptions activated for the selected test up to day X.Trial Converted CumulativeThe cumulative number of trials converted to paid subscriptions for the selected test up to day X.Trial Started CumulativeThe cumulative number of trials started for the selected test up to day X.In-apps CumulativeThe cumulative number of in-app purchases for the selected test up to day X.In-apps Avg Check CumulativeIn-app Revenue Cumulative divided by In-apps Cumulative.Subs Revenue CumulativeThe cumulative total of subscription revenue for the selected test up to day X.In-apps Revenue CumulativeThe cumulative total of in-app revenue for the selected test up to day X.Revenue CumulativeThe cumulative total of in-app, subscription, and ad revenue for the selected test up to day X.Impressions CumulativeThe cumulative number of banner, interstitial, and rewarded impressions up to day X.Impressions per DAUThe number of banner, interstitial, and rewarded impressions on day X divided by the DAU on day X for users assigned to the test.Retention CumulativeThe number of users active on day M (as specified in the metric) from the time of assignment up to day X.Sessions per DAUThe number of sessions on day X divided by the DAU on day X for users assigned to the test.DAUThe number of users assigned to the test who were active on day X.Audience Participated CumulativeThe cumulative number of users who participated in this test, accumulated up to day X.Audience ParticipatedThe number of users who participated in this test, meaning they received the test configuration and saw the A/B test campaigns.Audience AssignedThe number of users assigned to this test, meaning they received the test configuration but did not necessarily see the A/B test campaigns.",{"id":370,"title":369,"titles":4364,"content":4365,"level":1110},[],"Overview of Active Users Report",{"id":4367,"title":467,"titles":4368,"content":467,"level":1110},"/reports-and-dashboards/active-users-report#",[],{"id":4370,"title":4180,"titles":4371,"content":4372,"level":1104},"/reports-and-dashboards/active-users-report#overview",[467],"The Active Users Report is designed to analyze user activity within the app and provide timely insights to respond to user behavior. The report displays the current number of active users for a selected time period, as well as the impressions and revenue generated by these users through in-app and ad campaigns. Depending on the selected time intervals, the report allows tracking of DAU (Daily Active Users), WAU (Weekly Active Users), and MAU (Monthly Active Users). Key Features: User Activity Tracking – Monitors the number of active users across selected timeframes (DAU, WAU, MAU).Behavioral Insights – Provides data to identify and react to user engagement trends.Revenue and Impressions Analysis – Displays the impressions and revenue generated by active users through in-app purchases and ad campaigns.Granular Time Segmentation – Offers flexibility to analyze user activity on daily, weekly, or monthly levels.Decision-Making Support – Helps optimize app performance by understanding user activity and behavior patterns.",{"id":4374,"title":4342,"titles":4375,"content":4376,"level":1120},"/reports-and-dashboards/active-users-report#filters-and-dimensions",[467,4180],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionAppThe name of the application.DateThe date of the event.WeekThe week of the event.MonthThe month of the event.Media SourceThe media source through which the user installed the app.Device TypeThe type of device used.App VersionThe version of the application.CountryThe country of the user.In-App StatusThe user's status at app launch, indicating whether they are free, paying, or unknown. At the time of the first purchase, the user is in the free status.Subscription StatusThe user's status at app launch, showing whether they have an active subscription.OS VersionThe version of the operating system.A/B TestThe name of the A/B test.A/B Test GroupThe name of the test group.App Initial VersionThe version of the app installed by the user during their first app launch.User Purch NumberThe total number of in-app purchases (note: only in-app purchases, excluding subscriptions and renewals) made by the user throughout their lifetime in the application.languageThe total number of purchases made by the user throughout their lifetime in the application.Day IndexThe cohort day number representing the user's lifetime in the application since installation, not since entering a test.",{"id":4378,"title":4347,"titles":4379,"content":4380,"level":1120},"/reports-and-dashboards/active-users-report#metrics",[467,4180],"Below is a detailed list of the primary metrics available in the report, each accompanied by a description to clarify its purpose and usage: MetricDescriptionActive UsersThe number of unique client IDs who accessed the app at least once during the selected time period.In-Apps ImpressionsThe number of in-app campaign impressions during the selected time period.In-Apps Impressions per Active UsersThe number of in-app campaign impressions per user during the selected time period.PurchasesThe number of purchases made during the selected time period.Purchases per Active UserThe number of purchases per user during the selected time period.In-Apps RevenueRevenue generated from in-app purchases during the selected time period.In-Apps ARPAUIn-Apps Revenue / Active Users.Total Ads RevenueRevenue generated from ads during the selected time period.Total Ads ARPAUTotal Ads Revenue / Active Users.BN Ads RevenueRevenue generated from banner ads during the selected time period.INT Ads RevenueRevenue generated from interstitial ads during the selected time period.RV Ads RevenueRevenue generated from rewarded ads during the selected time period.BN Ads ARPAUBN Ads Revenue / Active Users.INT Ads ARPAUINT Ads Revenue / Active Users.RV Ads ARPAURV Ads Revenue / Active Users.Total Ads ImpressionsThe number of ad impressions during the selected time period.BN ImpressionsThe number of banner ad impressions during the selected time period.INT ImpressionsThe number of interstitial ad impressions during the selected time period.RV ImpressionsThe number of rewarded ad impressions during the selected time period.Total Ads Impressions per Active UsersTotal Ads Impressions / Active Users.BN Impressions per Active UsersBN Impressions / Active Users.INT Impressions per Active UsersINT Impressions / Active Users.RV Impressions per Active UsersRV Impressions / Active Users.Total Sub RevenueThe total revenue generated from subscriptions during the selected time period.Total RevenueThe total revenue generated from all sources (ads, in-app purchases, and subscriptions) during the selected time period.ARPUAverage Revenue Per User, calculated as Total Revenue / Active Users over the selected time period.Session Per UserThe average number of sessions per user, measured in minutes, during the selected time period.Average Session LengthThe average duration of a single session, measured in minutes.Average Time Per UserThe average time a user spends in the app, measured in minutes, during the selected time period.Median Session LengthThe median duration of a single session, measured in minutes, representing the midpoint of all session lengths recorded during the selected time period. Definition of MedianThe median is a statistical measure representing the middle value of a dataset when all values are arranged in ascending order. It is the point at which half of the values are lower and half are higher.Example:For the dataset {11, 9, 3, 5, 1}, sorting the values in ascending order results in {1, 3, 5, 9, 11}. The median is 5, as it is the middle value.Handling Even-Numbered Datasets:When a dataset contains an even number of elements, the median is not uniquely defined. In such cases, it is calculated as the average of the two middle values.For example, in the dataset {1, 3, 5, 7}, the median is calculated as:(3+5)/2=4The median is useful for analyzing datasets as it provides a central tendency measure that is less affected by extreme values compared to the mean.",{"id":4382,"title":4383,"titles":4384,"content":4385,"level":1120},"/reports-and-dashboards/active-users-report#example-explanation-from-the-report","Example Explanation from the Report",[467,4180],"Based on the report data (screenshot below): On 03.08, there were 601 active users (DAU).These users generated $13.22 in ad revenue.They viewed a total of 25,427 ad impressions.The average ad revenue per user (ARPU) was $0.02. This example demonstrates how key metrics such as DAU, revenue, impressions, and ARPU can provide actionable insights into user activity and monetization performance. Additionally: The chart illustrates the daily user activity dynamics, showing how users engaged with the application over the selected time period.By selecting Order By or choosing dimensions such as Day, Week, or Month in the graph or table, you can track daily (DAU), weekly (WAU), and monthly (MAU) user activity.",{"id":374,"title":373,"titles":4387,"content":4388,"level":1110},[],"Overview of Ads Monetization Report and Dashboard",{"id":4390,"title":467,"titles":4391,"content":467,"level":1110},"/reports-and-dashboards/ads-monetization-report-and-dashboard#",[],{"id":4393,"title":4322,"titles":4394,"content":4395,"level":1104},"/reports-and-dashboards/ads-monetization-report-and-dashboard#overview-and-key-features",[467],"The Ads Monetization Report and Dashboard provide detailed insights into the performance of ad networks, enabling an evaluation of monetization effectiveness. The report uses data pulled directly from ad network dashboards via APIs (Monetization Grabbers), ensuring accurate statistics tracked by the networks themselves. The dashboard complements the report by presenting key metrics to assess ad performance and monetization efficiency. Together, these tools empower data-driven decision-making and help optimize advertising revenue. Key features include: Ads Monetization Report Features: Ad Network Performance Tracking – Provides detailed metrics for analyzing the performance of individual ad networks.Real Ad Network Data – Uses data directly from ad network dashboards via APIs (Monetization Grabbers) for accurate and reliable statistics.Revenue Analysis – Offers insights into revenue generated from banners, interstitials, rewarded ads, and other monetization sources.CPM and Impressions Insights – Tracks effective CPMs and ad impressions across various networks and campaigns.Granular Segmentation – Enables filtering by ad networks, regions, ad formats, and time periods. Ads Monetization Dashboard Features: Aggregated Performance Overview – Displays key monetization metrics in a centralized dashboard for easy analysis.Cumulative Revenue View – Allows tracking of revenue growth over time, providing insights into trends and long-term performance.Customizable Data Display – Users can adjust the dashboard to display the most relevant key performance indicators for their needs.Interactive Data Drill-Down – Offers detailed exploration of ad performance by source, format, and other dimensions.Optimization Guidance – Helps refine ad monetization strategies by highlighting high-performing networks and formats.",{"id":4397,"title":4398,"titles":4399,"content":4400,"level":1104},"/reports-and-dashboards/ads-monetization-report-and-dashboard#ads-monetization-report","Ads Monetization Report",[467],"Report Objective: The Ads Monetization Report is designed to analyze the performance of ad networks and evaluate monetization effectiveness. The report pulls data directly from ad network dashboards via APIs (Monetization Grabbers), ensuring accurate and reliable metrics tracked by the networks themselves. This enables a detailed evaluation of revenue, impressions, and CPM trends, helping to identify the most effective ad sources and formats for maximizing monetization outcomes.",{"id":4402,"title":4403,"titles":4404,"content":4405,"level":1120},"/reports-and-dashboards/ads-monetization-report-and-dashboard#data-source-and-ad-waterfall-explanation","Data Source and Ad Waterfall Explanation",[467,4398],"Data Source in This Report The data in this report is sourced directly from ad network dashboards via their APIs (through Monetization Grabbers). This means that the statistics displayed are those recorded and reported by the ad networks themselves. If the goal is to view the actual statistics that ad networks have paid for or to analyze the performance of ad network SDKs, this report provides the most accurate and reliable data. Ad Waterfall Overview The ad waterfall refers to a traditional programmatic advertising method that organizes ad sources in a hierarchical structure. This setup ensures that the highest CPMs are prioritized for advertisers while maximizing revenue for publishers. The waterfall system sequentially moves through ad sources based on their bidding value, optimizing both ad delivery and monetization outcomes.",{"id":4407,"title":4342,"titles":4408,"content":4409,"level":1120},"/reports-and-dashboards/ads-monetization-report-and-dashboard#filters-and-dimensions",[467,4398],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: DateThe specific day for which data is displayed.WeekThe specific week for which data is displayed.MonthThe specific month for which data is displayed.AppThe name of the application.CountryThe country where the ad was served.Ad FormatThe format of the ad (e.g., banner, interstitial, rewarded video).NetworkThe name of the monetization network.Line ItemA unique identifier for the network placement (Placement ID), used for each network and ad format.Campaign NameDirect-sold campaigns or cross-promotion campaigns.The filter for this field is text-based and operates using the LIKE principle. It offers two options:Include: Displays all campaigns that contain the text entered in the field as part of their name.Exclude: Displays all campaigns that do not contain the text entered in the field as part of their name.This functionality allows for precise filtering of campaign names based on the specified text input.Filter and DimensionDescription",{"id":4411,"title":4347,"titles":4412,"content":4413,"level":1120},"/reports-and-dashboards/ads-monetization-report-and-dashboard#metrics",[467,4398],"Below is a detailed list of the primary metrics available in the report, each accompanied by a description to clarify its purpose and usage: ImpressionsThe number of ad impressions tracked by the network.Monetization GrabbersImpressions (SDK)The number of ad impressions tracked by the SDK.SDKApplovinMax ImpressionsThe number of ad impressions tracked by Applovin MAX mediation.Monetization Grabbers / ApplovinAttemptsThe number of attempts made by a demand source (or ad source) to fill an ad request. An ad request may attempt to fill using multiple ad sources.Monetization GrabbersFillsThe number of times ad requests were successfully filled with an ad.Monetization GrabbersFill RateThe percentage of ad requests filled with valid ad responses. Calculated as Fills / Attempts.Monetization GrabbersDisplay RateThe percentage of impressions compared to attempts. Calculated as Impressions / Attempts.Monetization GrabberseCPMEffective cost per thousand impressions, based on revenue. Calculated as Revenue / Impressions * 1000.Monetization GrabbersClicksThe total number of ad clicks.Monetization GrabbersCTRClick-through rate, calculated as Clicks / Impressions * 100.Monetization GrabbersActive UsersActive users (if more than one day is selected, calculated as the sum of active users divided by the number of days).SDKImp per Active Users (MAX)The number of ApplovinMax impressions per active user.ApplovinMax Impressions / Active UsersImp per Active Users (Grabber)The number of impressions per active user.Impressions / Active UsersARPDAUAverage revenue per daily active user. Calculated as Revenue / Active Users.Monetization GrabbersRevenueThe revenue generated from ads.Monetization GrabbersMetricDescriptionSource Of Data Active Users Calculation RulesThe Active Users metric is calculated within the context of the selected day, app, and country. When using dimensions like Network, Line Item, or Ad Format, the Active Users count is based on the countries included in the breakdown. If multiple days are selected, the metrics are calculated as follows:Active Users: The sum of active users across the selected days, divided by the number of days.ARPDAU (Average Revenue Per Daily Active User): The total revenue divided by the total active users across the selected days.Imp per Active Users: The total number of impressions divided by the total active users across the selected days.",{"id":4415,"title":4416,"titles":4417,"content":4418,"level":1120},"/reports-and-dashboards/ads-monetization-report-and-dashboard#understanding-the-active-users-metric-and-its-dependencies","Understanding the Active Users Metric and Its Dependencies",[467,4398],"The Active Users metric, along with all metrics derived from Monetization Grabbers, can be directly correlated only within the same day, application, and country. Key Considerations: Date Range Filtering:If the date filter includes multiple days, Active Users is calculated as the sum of active users divided by the number of days (i.e., an average value).Aggregation by Week and Month:When selecting a breakdown by week or month, DAU (Daily Active Users) does not automatically change to WAU (Weekly Active Users) or MAU (Monthly Active Users). Instead, it remains DAU, calculated as the average DAU value within the selected week or month. All these metrics represent the number of unique users in the application, but over different time periods: daily (DAU), weekly (WAU), and monthly (MAU).Example CalculationLet's assume we have three users: A, B, and C, with the following activity over a week:DAU Calculation (Daily Active Users Average):Daily Active Users per day: (4 on Monday, 5 on Tuesday, 5 on Wednesday, etc.)DAU (Average over the week): (4 + 5 + 5) / 7 = 2WAU Calculation (Weekly Active Users):WAU = 3, since all three users were active at least once during the week.Where to Analyze DAU, WAU, and MAU?To track DAU, WAU, and MAU, use the Active Users Report, which provides:✔ The number of unique users for any selected period.✔ Aggregations at the weekly (WAU) and monthly (MAU) levels.This report allows a clear analysis of user engagement and trends across different timeframes. Breakdowns by Ad Format:When using Ad Format as a breakdown, Active Users is aggregated based on the total number of active users across the countries where specific ad formats are available.Unavailable for Network-Level Breakdowns:The Active Users metric, along with other metrics that rely on it—such as Impressions per Active User (Imp per Active Users) and ARPDAU (Average Revenue per Daily Active User)— is not available when breaking down data by Network, Line Item, or Campaign Name.",{"id":4420,"title":4421,"titles":4422,"content":4423,"level":1120},"/reports-and-dashboards/ads-monetization-report-and-dashboard#most-common-example-of-waterfall-performance-analysis","Most Common Example of Waterfall Performance Analysis",[467,4398],"To analyze waterfall performance, follow these steps: Select the application you want to analyze.Choose a specific Ad Format, such as Rewarded.Select a country, for example, US.Retain dimensions like Network and Line Item to ensure detailed breakdowns.Sort the data by descending eCPM to organize the highest-performing ad placements.Evaluate the performance of the waterfall by analyzing metrics like impressions, fill rate, and revenue for each Network and Line Item.",{"id":4425,"title":4426,"titles":4427,"content":4428,"level":1104},"/reports-and-dashboards/ads-monetization-report-and-dashboard#ads-monetization-dashboard","Ads Monetization Dashboard",[467],"The Monetization Dashboard shares the same primary objective as the Monetization Report: to evaluate the performance of monetization strategies and their key metrics. Both tools are designed to provide insights into the effectiveness of your monetization efforts by analyzing essential indicators such as revenue, impressions, fill rates, eCPM, and click-through rates (CTR). While the Report offers detailed data tables for granular analysis, the Dashboard provides a visual, high-level overview of these metrics, enabling faster trend identification and actionable insights. These complementary tools ensure that you can monitor and optimize monetization performance effectively, whether you need a detailed review or a quick summary.",{"id":4430,"title":4431,"titles":4432,"content":4433,"level":1120},"/reports-and-dashboards/ads-monetization-report-and-dashboard#filters","Filters",[467,4426],"Below is a detailed list of the filters available in the dashboard, each accompanied by a description to clarify its purpose and usage: FilterDescriptionAppThe name of the application.CountryThe country where the ad was served.",{"id":4435,"title":4347,"titles":4436,"content":4437,"level":1120},"/reports-and-dashboards/ads-monetization-report-and-dashboard#metrics-1",[467,4426],"Below is a detailed list of the metrics available in the dashboard, each accompanied by a description to clarify its purpose and usage: MetricDescriptionDAUThe number of daily active users, as tracked by the SDK.ImpressionsThe number of ad impressions tracked by monetization grabbers.Banner Impressions by Tracking SourceThe number of banner ad impressions tracked from various sources (client/SDK, MAX API, monetization grabbers).Interstitial Impressions by Tracking SourceThe number of interstitial ad impressions tracked from various sources (client/SDK, MAX API, monetization grabbers).Rewarded Impressions by Tracking SourceThe number of rewarded ad impressions tracked from various sources (client/SDK, MAX API, monetization grabbers).Avg Impressions per DAUTotal impressions divided by the number of daily active users (Impressions / DAU).Ad RevenueThe total revenue generated from ads tracked by monetization grabbers.Fill RateThe percentage of ad requests filled with valid ads. Calculated as Fills / Attempts.CTRClick-through rate, calculated as Clicks / Impressions * 100.eCPMEffective cost per thousand impressions, calculated as Revenue / Impressions * 1000.ARPDAUAverage revenue per daily active user, calculated as Revenue / DAU.RequestsThe number of ad requests made to an ad unit (placement) within the app.Requests per DAUThe number of ad requests divided by the number of daily active users (Requests / DAU).AttemptsThe number of times a demand source (or ad source) attempted to fill an ad request.Attempts per DAUThe number of ad attempts divided by the number of daily active users (Attempts / DAU).Banner Fail by ReasonsThe number of banner ad load failures tracked by SDK (client).Interstitial Fail by ReasonsThe number of interstitial ad load failures tracked by SDK (client).Rewarded Fail by ReasonsThe number of rewarded ad load failures tracked by SDK (client).Fail RateFailure rate calculated as Fails (SDK/Client) / Requests (MAX API) * 100.Impressions RateThe percentage of impressions compared to ad requests, calculated as Impressions (MAX API) / Requests (MAX API) * 100.Banner Fail per DAUThe number of banner failures divided by DAU (Banner Fails / DAU).Interstitial Fail per DAUThe number of interstitial failures divided by DAU (Interstitial Fails / DAU).Rewarded Fail per DAUThe number of rewarded failures divided by DAU (Rewarded Fails / DAU).",{"id":378,"title":377,"titles":4439,"content":4440,"level":1110},[],"Overview of Game Economy Daily and Cohort Report",{"id":4442,"title":467,"titles":4443,"content":467,"level":1110},"/reports-and-dashboards/game-economy-daily-and-cohort-report#",[],{"id":4445,"title":4180,"titles":4446,"content":4447,"level":1104},"/reports-and-dashboards/game-economy-daily-and-cohort-report#overview",[467],"Game Economy Reports are designed to analyze user progression and the utilization of in-game currency. These reports provide insights into the leveling process and user interactions with the in-game economy, helping you optimize engagement and monetization strategies.",{"id":4449,"title":4450,"titles":4451,"content":4452,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#game-economy-daily","Game Economy Daily",[467,4180],"Daily Report Objective The primary goal of this report is to assess overall audience progress and analyze the usage of in-game currency over time or across different application versions. This helps identify user behavior patterns, enabling data-driven adjustments to game design and monetization strategies. Data The report aggregates session and transaction data collected from the SDK on a daily basis. It also accounts for offline users, adjusting data over a week-long period to ensure accuracy.",{"id":4454,"title":4455,"titles":4456,"content":4457,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#game-economy-cohort","Game Economy Cohort",[467,4180],"The primary goal of this report is to evaluate the progress of specific user cohorts and analyze the usage of in-game currency in relation to the User Acquisition (UA) process. This helps you understand audience dynamics and make data-driven adjustments to your game design or UA strategy. Data This is a cohort-based report, meaning it aggregates data over a 35-day period for each user, starting from their app installation date. Installation data is sourced from AppsFlyer or Adjust.Session and transaction data is collected from the SDK.",{"id":4459,"title":4460,"titles":4461,"content":4462,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#data-sources","Data Sources",[467,4180],"Both reports leverage two key SDK data models: SessionEvent Model – Tracks event data during user sessions.Transaction Model – Captures data related to booster usage and in-game currency transactions. Additionally, the Cohort Report incorporates installation data from AppsFlyer or Adjust. By combining these data sources, the reports complement each other, providing a comprehensive view of user behavior, progression, and in-game currency usage both for the entire audience and within specific cohorts.",{"id":4464,"title":4465,"titles":4466,"content":4467,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#cohort-definition","Cohort Definition",[467,4180],"A cohort is a group of users who share one or more characteristics, such as: A specific action performed (e.g., app installation, level completion, in-game currency purchase).The time period in which this action occurred.",{"id":4469,"title":4470,"titles":4471,"content":4472,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#difference-between-a-cohort-and-a-segment","Difference Between a Cohort and a Segment",[467,4180],"A cohort differs from a segment in that a segment represents a broader and more general dataset. For example: Players who installed the app in January 2023 and players who installed the app in February 2023 are two different cohorts since they are grouped by installation date. However, both groups belong to the general segment of active players in 2023.",{"id":4474,"title":4475,"titles":4476,"content":4477,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#cohort-analysis","Cohort Analysis",[467,4180],"Cohort analysis is a research method in which users are divided into groups (cohorts) based on shared characteristics. Their behavior is then analyzed over a specific period. This approach enables you to: Track player actions over time (e.g., level progression or engagement).Identify behavioral trends associated with different cohorts.Conduct precise data analysis to optimize game mechanics, retention, and monetization.",{"id":4479,"title":4480,"titles":4481,"content":4482,"level":1104},"/reports-and-dashboards/game-economy-daily-and-cohort-report#logic-of-metric-display-in-the-report","Logic of Metric Display in the Report",[467],"The report is generated based on two categories of metrics: some metrics are related to game events (events), while others are exclusively tied to transactions. The system automatically switches between these categories depending on the selected dimension or metric.",{"id":4484,"title":4485,"titles":4486,"content":4487,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#automatic-switching-mechanism","Automatic Switching Mechanism",[467,4480],"The switching mechanism follows the \"at least one\" principle. This means that if at least one filter or dimension is selected in the report and certain metrics are unavailable for it, those metrics will be hidden. Even if other filters or dimensions allow for the use of all metrics, the unavailable ones will not be displayed. Example 1: Filtering by In-Game Currency SourceWhen analyzing transactions, the SDK transmits data about the Boosters Source, indicating the source of the in-game currency associated with a specific transaction. However, for game events (such as level start or completion), it is impossible to determine which in-game currency source was used.Therefore, when applying a filter/dimension by in-game currency source, only 6 metrics related to in-game currency movement will be available. The remaining 8 metrics, associated with level start and successful/unsuccessful completion events, will be hidden.Example 2: Filtering by Game LevelIf a filter/dimension by game level is applied, all metrics remain available. This is because it is possible to accurately determine at which level a specific booster was received and which level the player started or completed. For more details on metric availability, refer to the help section below.",{"id":4489,"title":4490,"titles":4491,"content":4492,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#availability-of-metrics-and-dimensions-by-category","Availability of Metrics and Dimensions by Category",[467,4480],"The availability of metrics and dimensions depends on the data model used. The report includes two types of models: SessionEvent (SE) – related to in-game events such as level starts and completions.Transaction (T) – related to in-game currency transactions. The table below outlines which metrics and dimensions are available for each model:",{"id":4494,"title":4342,"titles":4495,"content":4496,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#filters-and-dimensions",[467,4480],"The table below provides a detailed breakdown of the dimensions and filters available in the reporting system, including their names, descriptions, additional notes, and availability across reports. MetricDescriptionNotesReportApplicationThe name of the applicationOnly one application can be selected as bonuses cannot be summed across multiple apps.BothApp VersionThe version of the applicationMultiple versions can be selected; bonuses across versions can be summed.BothApp Init VersionInitialization version of the appThe initial version of the application. Multiple versions can be selected, and bonuses across versions can be summed.BothDayThe date of the eventAllows selection of a date range. Users can choose a single day or a range of up to 120 days.DailyWeekThe week of the eventEnables comparison between different weeks in the table.DailyMonthThe month of the eventEnables comparison between different months in the table.DailyDay of InstallThe calendar date when the user installed the application.Allows selection of a date range. Users can choose a single day or a range of up to 120 days.CohortWeek of InstallThe calendar week when the user installed the application.Enables comparison between different weeks in the table.CohortMonth of InstallThe calendar month when the user installed the application.Enables comparison between different months in the table.CohortCohort DayThe number of days between the user's installation date and the recorded event.Allows selection of a range of days. Minimum value in the filter is 0.CohortMedia SourceThe source of traffic that attributed the user acquisition.Multiple sources can be selected; bonuses across sources can be summed.CohortCountryThe country of the user.Multiple countries can be selected; bonuses across countries can be summed.BothLevelThe game level.Allows selection of a level range. Minimum value in the filter is 1.BothModeThe specific game mode.Multiple modes can be selected; bonuses across modes can be summed.BothProduct IDThe identifier of the product ID.Multiple products can be selected; bonuses across products can be summed.BothIn-App StatusThe user's payment status, indicating whether they have made a purchase. Possible values: free, paying, or unknown.Multiple statuses can be selected; bonuses for players in different statuses can be summed.BothSubscription StatusThe user's current subscription status. Possible values: free, paid, paid canceled, trial, or trial canceled.Multiple statuses can be selected; bonuses for players in different statuses can be summed.BothBoosters TypeThe category or classification of an in-game booster used by the player.Multiple booster types can be selected; bonuses across booster types can be summed.BothBoosters SourceThe category or classification of an in-game booster used by the player.Multiple booster sources can be selected; bonuses across sources can be summed.Both",{"id":4498,"title":4499,"titles":4500,"content":4501,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#interaction-between-dayweekmonth-of-install-and-cohort-day-filters","Interaction Between \"Day/Week/Month of Install\" and \"Cohort Day\" Filters",[467,4480],"The \"Day/Week/Month of Install\" filter determines when users installed the application, while the \"Cohort Day\" filter aligns the corresponding time periods within the dataset. Here’s how these filters work together: If you select a cohort, for example, from December 1 to December 3, and do not apply any values in the \"Cohort Day\" filter, the report will display cumulative data collected from the installation date onward for the next 35 days.However, if you set the \"Cohort Day\" filter to a specific value (e.g., 1), the report will show data only for the day following the installation (installation day = 0, subsequent days = 1, 2, 3, etc.). For instance: On December 2, data will be displayed for users who installed the app on December 1.On December 3, data will be displayed for users who installed the app on December 2.On December 4, data will be displayed for users who installed the app on December 3.",{"id":4503,"title":4504,"titles":4505,"content":4506,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#filters-in-app-status-and-subscription-status","Filters \"In-App Status\" and \"Subscription Status\"",[467,4480],"The values in these filters represent the user’s dynamic state as reported by the SDK. It is important to understand their behavior: \"In-App Status\": For example, selecting \"Paying\" in this filter will not display data for users who simply made an in-app purchase. Instead, it will display data for users after they made a purchase.\"Subscription Status\": Similarly, selecting a status will reflect data for users while they are in the specified subscription state. These filters provide a nuanced view of user behavior, enabling targeted analysis based on specific conditions or states within the application.",{"id":4508,"title":4347,"titles":4509,"content":4510,"level":1120},"/reports-and-dashboards/game-economy-daily-and-cohort-report#metrics",[467,4480],"To ensure accurate data collection and display in this report, the SDK must be properly configured to transmit data to the SessionEvent and Transaction models. This configuration is implemented during the SDK integration process. It is important to note that we cannot account for all possible variations in event naming conventions used by developers. Therefore, we rely on a set of standard event code names for identifying events. Detailed information is provided in the commentary column for reference. MetricDescriptionCommentaryReceive BoostersThe number of boosters received by playersSum of bonuses where the transaction type is \"receive\" (received).Spend BoostersThe number of boosters spent by playersSum of bonuses where the transaction type is \"spend\" (spent).Boosters BalanceThe number of remaining boostersThe difference between Receive Bonus and Spend Bonus.Booster SurplusThe surplus of accumulated boostersCalculated as Receive Bonus / Spend Bonus, displayed as a percentage rounded to the nearest whole number.Receive Boosters % of TotalThe percentage of \"Receive Boosters\" in the total rowIn the total row, always equals 100%. In the dropdown, the percentage is distributed according to the total percentage at the top.Spend Boosters % of TotalThe percentage of \"Spend Boosters\" in the total rowIn the total row, always equals 100%. In the dropdown, the percentage is distributed according to the total percentage at the top.Levels StartedThe number of events where the name matches or contains \"level start\" or similarEvent names may vary in format, including underscores, lowercase, uppercase, or prefixes/suffixes (e.g., \"stle_level_started_12345\"). This metric is unavailable when broken down by bonus type, its source, or product, as these are unrelated indicators.Level FailedThe number of events where the name matches or contains \"level failed\"Event names may vary in format, including underscores, lowercase, uppercase, or prefixes/suffixes (e.g., \"stle_level_failed_12345\"). This metric is unavailable when broken down by bonus type, its source, or product, as these are unrelated indicators.Level CompletedThe number of events where the name matches or contains \"level completed\"Event names may vary in format, including underscores, lowercase, uppercase, or prefixes/suffixes (e.g., \"stle_level_completed_12345\"). This metric is unavailable when broken down by bonus type, its source, or product, as these are unrelated indicators.Fill RateHow successfully players progress through levelsCalculated as the ratio of Level Completed to Level Failed.Spend Boosters per Level FailedThe average number of boosters spent per failed level attemptCalculated as the ratio of Spend Bonus to Level Failed.Spend Boosters per Level CompletedThe average number of boosters spent per successfully completed levelCalculated as the ratio of Spend Bonus to Level Completed.",{"id":382,"title":381,"titles":4512,"content":4513,"level":1110},[],"This article explains how the In-Apps Report and Dashboard provide insights into the performance and optimization of in-app campaigns.",{"id":4515,"title":467,"titles":4516,"content":467,"level":1110},"/reports-and-dashboards/inapp-report-and-dashboard#",[],{"id":4518,"title":4322,"titles":4519,"content":4520,"level":1104},"/reports-and-dashboards/inapp-report-and-dashboard#overview-and-key-features",[467],"The In-Apps Report and In-Apps Dashboard provide insights into the performance of in-app campaigns, including In-app, In-app LTO, and their A/B versions. Additionally, they include data from in-app purchases within Mixed and Mixed LTO campaigns, provided these campaigns contain in-app nested campaigns. These tools help evaluate and optimize campaigns aimed at promoting in-app purchases (excluding subscriptions), offering a comprehensive view of user behavior and revenue generation. Unlike cohort-based reports, the In-Apps Report aggregates purchases on a daily basis for all users (both new and existing), without linking data to the install date. Key Features: Performance Analysis for In-App Campaigns – Tracks metrics for inApp and LTO inApp campaigns, including A/B test variations.Non-Cohort Data Aggregation – Displays daily purchase statistics for all users, independent of install date.Revenue Insights – Provides a detailed breakdown of in-app revenue generated from campaigns.Campaign Comparison – Enables analysis of A/B test results to identify the most successful variations.Customizable Filters – Allows filtering by campaign type, date, and other dimensions for targeted analysis. These tools empower teams to monitor and optimize in-app monetization strategies effectively, driving higher engagement and revenue.",{"id":4522,"title":4523,"titles":4524,"content":467,"level":1104},"/reports-and-dashboards/inapp-report-and-dashboard#in-apps-report","In-Apps Report",[467],{"id":4526,"title":4527,"titles":4528,"content":4529,"level":1120},"/reports-and-dashboards/inapp-report-and-dashboard#parent-and-nested-campaigns-structure-and-metrics-tracking","Parent and Nested Campaigns: Structure and Metrics Tracking",[467,4523],"In the context of in-app campaigns, there are two types of campaigns that can be tracked: Parent Campaign The overarching campaign that serves as a container. A parent campaign can include one or more nested campaigns or operate without any nested campaigns.Nested Campaign A child campaign operating within a parent campaign. All purchases are attributed directly to nested campaigns, making them the primary source of transactional data. Learn more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.",{"id":4531,"title":4532,"titles":4533,"content":4534,"level":1120},"/reports-and-dashboards/inapp-report-and-dashboard#example-of-campaign-breakdown","Example of Campaign Breakdown",[467,4523],"Imagine a parent campaign (Campaign A) with 10 total ad impressions. This campaign contains two nested campaigns (Campaign B and Campaign C) with different in-app purchase pricing. In the report, impressions and metrics will be displayed as follows: Campaign A: Total impressions for the parent campaign.Campaign B and Campaign C: Individual breakdowns for each nested campaign, reflecting their unique performance metrics (e.g., impressions, revenue, conversions). This structure provides granular insights into campaign performance, allowing for the analysis of both aggregated parent-level data and detailed nested-level data. By comparing nested campaigns, you can evaluate the effectiveness of different pricing strategies or A/B test variations. Parent CampaignImpressionsParent A10 Parent CampaignNested CampaignImpressionsParent ANested B10Parent ANested C10",{"id":4536,"title":4342,"titles":4537,"content":4538,"level":1120},"/reports-and-dashboards/inapp-report-and-dashboard#filters-and-dimensions",[467,4523],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionAppThe name of the application.DateThe date of the event (impression, click, purchase).WeekThe week of the event (impression, click, purchase).MonthThe month of the event (impression, click, purchase).Parent CampaignThe name of the parent campaign. It contains one or multiple nested campaigns.Read more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.Nested CampaignThe name of the nested campaign within a Parent Campaign. Purchases are attributed to the Nested Campaign.Read more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.In-App StatusThe user’s status at the time of an impression, click, or purchase, indicating whether they are a paying user. Can be Free, Paying, or Unknown. Users are initially marked as Free until their first purchase.DeviceThe device model. On Android, this is represented as the device pixel density.EventThe name of the event associated with an impression, click, or purchase.Product IDThe identifier of the in-app product.Product ID TypeThe type of Product ID.A/B TestThe name of the A/B test associated with the campaign.A/B GroupThe A/B test group to which the campaign belongs.A/B StatusIndicates the current status of the A/B test. Possible values may include \"Running\", \"Paused\", \"Draft\" or \"Archived\".CountryThe country of the user.Media SourceThe media source from which the user installed the application.App VersionThe version of the application.Subscription StatusThe user’s subscription status at the time of an impression, click, or purchase, indicating whether they have an active subscription.CreativeThe creative asset used in the campaign.ParametersThe creative asset used in the campaign. Parameters appear after the event is selected (activated) in the configuration interface.Exact DayThe precise date when the event (impression, click, or purchase) occurred. Unlike aggregated time dimensions (Week, Month), this field provides event data at a daily granularity.",{"id":4540,"title":4347,"titles":4541,"content":4542,"level":1120},"/reports-and-dashboards/inapp-report-and-dashboard#metrics",[467,4523],"Below is a detailed list of the primary metrics available in the report, each accompanied by a description to clarify its purpose and usage: MetricDescriptionImpressionsThe total number of impressions recorded for campaigns.ClicksThe total number of clicks on the campaign.PurchasesThe total number of in-app purchases.RevenueThe total revenue generated from in-app purchases.CTR, %Click-through rate (CTR) = Clicks / Impressions * 100.CVR, %Conversion rate (CVR) = Purchases * 100 / Clicks.I2I, %Install-to-impression ratio (I2I) = Purchases * 100 / Impressions.eCPMEffective cost per mille (eCPM) = Revenue / Impressions * 1000.Active UsersThe number of unique client IDs participating in the selected campaign.IMPAUImpressions per active user (IMPAU) = Impressions / Active Users.CRp, %Conversion rate per active user (CRp) = Purchases * 100 / Active Users.Paying UsersUsers who have made at least one in-app purchase.Average CheckThe average revenue per purchase = In-App Revenue / Purchases.IAPPUIn-app purchases per paying user = Purchases / In-App Paying Users.Rev/Active UserRevenue per active user. Calculated as total revenue divided by the number of active users in the selected campaign.",{"id":4544,"title":4545,"titles":4546,"content":4547,"level":1120},"/reports-and-dashboards/inapp-report-and-dashboard#configuration-examples-and-data-interpretation-in-the-report","Configuration Examples and Data Interpretation in the Report",[467,4523],"Understanding how to configure filters and dimensions correctly allows for more precise analysis of user behavior and monetization performance. Below is an example of how to set up and interpret the data in the report. Filters: Country: US + UKIn-App Status: Free Dimensions: By Product IDBy Event Result Interpretation: Each Product ID is broken down by the Event through which it was displayed or purchased, allowing for an assessment of the effectiveness of each Product ID - Event combination.Each Event is further expanded with a breakdown by Device for a more granular analysis.If Product ID is listed first in the breakdown order, followed immediately by Event, the Product ID breakdown will automatically expand to show the associated Events.",{"id":4549,"title":4550,"titles":4551,"content":4552,"level":1104},"/reports-and-dashboards/inapp-report-and-dashboard#in-app-dashboard","In-App Dashboard",[467],"The In-Apps Dashboard provides real-time insights into in-app campaign performance, tracking revenue, engagement, and A/B test variations for In-App, In-App LTO, as well as Mixed and Mixed LTO campaigns if they contain in-app nested campaigns. Unlike cohort-based reports, it aggregates daily purchase data for all users, allowing for immediate analysis of monetization trends and campaign effectiveness.",{"id":4554,"title":4431,"titles":4555,"content":4556,"level":1120},"/reports-and-dashboards/inapp-report-and-dashboard#filters",[467,4550],"The dashboard includes a single filter: App, allowing selection of only one app at a time: FilterDescriptionAppThe name of the application.",{"id":4558,"title":4347,"titles":4559,"content":4560,"level":1120},"/reports-and-dashboards/inapp-report-and-dashboard#metrics-1",[467,4550],"Below is a detailed list of the metrics available in the dashboard, each accompanied by a description to clarify its purpose and usage: MetricDescriptionImpressionsThe number of campaign impressions.ClicksThe number of clicks on the campaign.In-AppsThe number of purchases within the campaign.RevenueThe total revenue generated by the campaign.Impressions per DAUThe ratio of impressions to daily active users (Impressions/DAU).Clicks per DAUThe ratio of clicks to daily active users (Clicks/DAU).In-Apps per DAUThe ratio of in-app purchases to daily active users (In-Apps/DAU).eCPMEffective Cost Per Mille, calculated as 1000 * Revenue / Impressions.",{"id":386,"title":385,"titles":4562,"content":4563,"level":1110},[],"Overview of Level Progress Report and Dashboard",{"id":4565,"title":467,"titles":4566,"content":467,"level":1110},"/reports-and-dashboards/level-progress-report#",[],{"id":4568,"title":4180,"titles":4569,"content":4570,"level":1104},"/reports-and-dashboards/level-progress-report#overview",[467],"The Level Progress Report and Dashboard provide comprehensive insights into user progression through game levels and their interactions with in-game currency, boosters, and hints. These tools help game developers evaluate player behavior, retention patterns, and monetization strategies, ensuring optimized level design and enhanced engagement mechanics. The Level Progress Report employs a cohort-based approach, aggregating data over a 30-day period from the date of app installation. Installation data is retrieved from AppsFlyer or Adjust, ensuring accurate user acquisition tracking. The Level Progress Dashboard, on the other hand, offers real-time tracking of level completion trends, displaying a fixed date range of the last 24 days plus the current day. Both tools rely on event data from gameplay sessions and in-game transactions, which require proper SDK configuration for accurate tracking. Simply integrating the SDK is not enough—developers must ensure event names follow the correct format and that necessary data is sent.",{"id":4572,"title":1140,"titles":4573,"content":467,"level":1120},"/reports-and-dashboards/level-progress-report#key-features",[467,4180],{"id":4575,"title":4576,"titles":4577,"content":4578,"level":4579},"/reports-and-dashboards/level-progress-report#_1-cohort-based-and-real-time-analysis","1. Cohort-Based and Real-Time Analysis",[467,4180,1140],"The Level Progress Report groups users into cohorts based on their installation date and aggregates data over 30 days post-installation.The Level Progress Dashboard presents daily data updates within a rolling 25-day window, allowing real-time monitoring of user progression.",4,{"id":4581,"title":4582,"titles":4583,"content":4584,"level":4579},"/reports-and-dashboards/level-progress-report#_2-data-aggregation-from-session-and-transaction-events","2. Data Aggregation from Session and Transaction Events",[467,4180,1140],"SessionEvent Model: Captures in-game actions such as level completion, failure, and retries.Transaction Model: Tracks in-game currency movements, booster usage, and hint consumption, providing insights into monetization behaviors.Events are sourced from the SDK, but prior configuration is required for proper data transmission and accuracy.",{"id":4586,"title":4587,"titles":4588,"content":4589,"level":4579},"/reports-and-dashboards/level-progress-report#_3-level-progression-tracking","3. Level Progression Tracking",[467,4180,1140],"Tracks user completion rates for each level and highlights difficulty spikes where users struggle.Measures average attempts per level, helping to balance difficulty and improve engagement.",{"id":4591,"title":4592,"titles":4593,"content":4594,"level":4579},"/reports-and-dashboards/level-progress-report#_4-in-game-currency-and-booster-impact","4. In-Game Currency and Booster Impact",[467,4180,1140],"Analyzes how currency usage correlates with level progression.Tracks booster and hint consumption to evaluate their effectiveness in retention and engagement.Provides monetization insights by linking in-game purchases with level completion data.",{"id":4596,"title":4597,"titles":4598,"content":4599,"level":4579},"/reports-and-dashboards/level-progress-report#_5-retention-and-engagement-insights","5. Retention and Engagement Insights",[467,4180,1140],"Identifies patterns in user progression and highlights drop-off points.Helps optimize difficulty scaling and reward systems to improve long-term engagement.",{"id":4601,"title":4602,"titles":4603,"content":4604,"level":4579},"/reports-and-dashboards/level-progress-report#_6-integration-with-attribution-platforms","6. Integration with Attribution Platforms",[467,4180,1140],"Uses AppsFlyer and Adjust to match session and transaction data with user acquisition sources.Allows analysis of user progression across different marketing channels and campaigns.",{"id":4606,"title":4607,"titles":4608,"content":4609,"level":4579},"/reports-and-dashboards/level-progress-report#_7-customizable-metrics-and-filters","7. Customizable Metrics and Filters",[467,4180,1140],"The Level Progress Report supports filters for cohort selection, level range, and in-game currency usage.The Level Progress Dashboard provides daily-level tracking with interactive visualizations for immediate performance analysis.Both tools support additional KPIs for retention and engagement tracking.",{"id":4611,"title":4612,"titles":4613,"content":4614,"level":1120},"/reports-and-dashboards/level-progress-report#use-cases","Use Cases",[467,4180],"Game Balancing – Identify difficulty spikes impacting retention and adjust level design.Monetization Optimization – Understand how in-game purchases influence level completion and progression.User Retention Analysis – Evaluate drop-off points and adjust mechanics to improve player engagement.Marketing Performance – Correlate user acquisition sources with in-game behavior to refine targeting strategies. Both the Level Progress Report and Dashboard are essential tools for game developers, allowing data-driven decision-making to enhance player experience, optimize retention, and maximize monetization.",{"id":4616,"title":4617,"titles":4618,"content":4619,"level":1104},"/reports-and-dashboards/level-progress-report#level-progress-report","Level Progress Report",[467],"The Level Progress Report analyzes user progression, tracking level completion, drop-offs, and monetization factors like in-game currency, boosters, and hints. It provides cohort-based insights over a 30-day period from installation, using data from AppsFlyer, Adjust, and gameplay events. Accurate reporting requires proper SDK integration and correct event formatting. Developers must ensure event tracking aligns with reporting needs. Analysts may need to adjust configurations for game-specific behavior. This report helps optimize level difficulty, retention strategies, and monetization impact.",{"id":4621,"title":4622,"titles":4623,"content":467,"level":1120},"/reports-and-dashboards/level-progress-report#definition-of-cohort-and-cohort-analysis","Definition of Cohort and Cohort Analysis",[467,4617],{"id":4625,"title":4626,"titles":4627,"content":4628,"level":1120},"/reports-and-dashboards/level-progress-report#cohort","Cohort",[467,4617],"A cohort is a group of users who share one or more common characteristics, such as: A specific action (purchase, registration, click, etc.).A specific time frame in which the action occurred. Cohorts are formed based on user behavior data, allowing for the analysis of user interactions with the application over time.",{"id":4630,"title":4631,"titles":4632,"content":4633,"level":1120},"/reports-and-dashboards/level-progress-report#differentiation-between-cohort-and-segment","Differentiation Between Cohort and Segment",[467,4617],"Cohorts should not be confused with segments. Unlike cohorts, segments represent broader user groups categorized by shared characteristics. For example, Harvard graduates from 2012 and those from 2018 belong to different cohorts but fall under the same segment of “Harvard graduates.”",{"id":4635,"title":4475,"titles":4636,"content":4637,"level":1120},"/reports-and-dashboards/level-progress-report#cohort-analysis",[467,4617],"Cohort analysis is a research method in which users are grouped into cohorts and their behavior is tracked over a defined period. This approach helps identify trends in user behavior dynamics, retention, engagement, and response to changes in game mechanics.",{"id":4639,"title":4640,"titles":4641,"content":4642,"level":1120},"/reports-and-dashboards/level-progress-report#sdk-data-and-client-id-matching","SDK Data and Client ID Matching",[467,4617],"To ensure accurate reporting, it is essential to establish a reliable connection between app installations and SDK data. This connection is maintained through an internal user identifier, Client ID. The Client ID must meet the following criteria for consistency: It must be received both from the Mobile Measurement Partner (MMP) (AppFlyer or Adjust) and the SDK.The Client ID must be identical across both sources to correctly attribute user data.",{"id":4644,"title":4645,"titles":4646,"content":4647,"level":1120},"/reports-and-dashboards/level-progress-report#metric-segmentation-and-automatic-switching","Metric Segmentation and Automatic Switching",[467,4617],"The report is structured into two metric categories: Event-based metricsTransaction-based metrics Metric availability is dynamically adjusted based on the selected filter or dimension, following the \"at least one\" principle. This means: If any chosen filter/dimension lacks compatibility with a specific set of metrics, those unavailable metrics will be automatically excluded from the report.Even if other selected filters/dimensions support all metrics, any restricted metrics due to the initial selection will remain hidden. Example: Transaction vs. Event Metric AvailabilityTransactions and Boosters SourceThe SDK transmits transaction data, including the source of in-game currency (Boosters Source).Transactions can be linked to specific in-game currency sources.However, for event-based data (e.g., level start, success/failure completion), no direct association exists with the in-game currency source.As a result, when filtering by Boosters Source, only six currency-related metrics will be available, while eight event-based metrics (level start and completion) will be excluded.Game Level DimensionWhen filtering by game level, it is possible to determine both the level where a booster was obtained and the level where a player started or completed an event. Consequently, when filtering by game level, all metrics remain accessible.For additional details, refer to the tooltip section below.",{"id":4649,"title":4342,"titles":4650,"content":4651,"level":1120},"/reports-and-dashboards/level-progress-report#filters-and-dimensions",[467,4617],"The Filters and Dimensions table is used for setting up analytics and reporting within the system. It allows users to filter data based on various parameters and group it into meaningful segments for analysis. Filters help narrow down the dataset by displaying only the relevant values based on specified criteria.Dimensions are used to group data by different attributes, such as date, platform, country, and other metrics. Filters and DimensionsDescriptionCommentApplicationThe name of the application.Only one app can be selected in this filter, as it is not possible to sum identical bonuses from different apps.App VersionThe version of the application.Any number of versions can be selected, as identical bonuses from different versions can be summed.Day of InstallThe installation date of the application.Allows selecting a date range. A single date can be selected if the start and end of the range match. The selection can include dates within the last 180 days.Day of EventThe date when an event occurred in the application.Allows selecting a date range. A single date can be selected if the start and end of the range match. The selection can include dates within the last 90 days.Day IndexThe number of days between the installation date and an event.Allows selecting a range of day numbers. A single day can be selected if the start and end of the range match. The minimum filter value is 0.LevelThe in-app level reached by the user.Allows selecting a range of levels. A single level can be selected if the start and end of the range match. The minimum filter value is 1.ModeThe mode of the application or game.Any number of modes can be selected, as identical bonuses from different modes can be summed.In-App StatusThe status of the user within the application.Any number of statuses can be selected, as identical bonuses obtained while the player is in different statuses can be summed.CountryThe country of the user.Any number of countries can be selected, as identical bonuses from different countries can be summed.Media SourceThe source of traffic.Any number of sources can be selected, as identical bonuses for installs from different sources can be summed.A/B TestThe name of the A/B test.Only one test can be selected at a time.A/B Test GroupThe group in an A/B test.Multiple groups can be selected (usually up to 2).CodewordA custom keyword used for filtering events. This field includes two filtering options: Include and Exclude.Include – Displays all events that contain the entered text as part of their name.Exclude – Displays all events that do not contain the entered text as part of their name.Free text filter. Retrieved from custom_params in the SessionEvent table (configured individually for each application upon request). NoteThe In-App Status filters represent dynamic user states sent by the SDK. These states reflect the user's status at specific moments rather than fixed attributes.For example, if you select In-App Status = Paying, the data displayed will not include all users who have made an in-app purchase. Instead, it will show data for users after they have completed a purchase.This distinction is important when analyzing user behavior, as these filters provide insights based on the user's current state at the time of the event rather than their entire purchase history.",{"id":4653,"title":4347,"titles":4654,"content":467,"level":1120},"/reports-and-dashboards/level-progress-report#metrics",[467,4617],{"id":4656,"title":4657,"titles":4658,"content":4659,"level":1120},"/reports-and-dashboards/level-progress-report#data-collection-and-event-mapping-requirements","Data Collection and Event Mapping Requirements",[467,4617],"For this report to function correctly, SDK data transmission must be properly configured in the SessionEvent and Transaction models. This configuration is handled at the SDK integration level. It is important to note that we cannot account for every possible event name defined by developers. To ensure accurate data collection, we rely on standardized event code names for event detection. The Comment column specifies the key terms we use in event names to extract the relevant metrics. The Model Name column indicates the specific SDK model where the data must be sent for metric tracking. Example: To collect the Users Opened Attempts metric, the SDK must send an event containing '%level%open%' or '%level%started%' in its name to the SessionEvent model.",{"id":4661,"title":4662,"titles":4663,"content":4664,"level":1120},"/reports-and-dashboards/level-progress-report#transaction-model-event-processing","Transaction Model Event Processing",[467,4617],"Event processing from the Transaction model is configured individually upon request. In this report, the system maps numeric values (1-10) to in-game currency names. For example, in an application with two boosters — Star and Heart —we assign: Heart = Event 1Star = Event 2 As a result: The number of Hearts spent will be recorded in Spend Event 1.The number of Hearts received will be counted in Receive Event 1.The number of Stars spent will be recorded in Spend Event 2.The number of Stars received will be counted in Receive Event 2. This mapping system ensures that in-game currency transactions are accurately tracked and reported based on predefined event codes. MetricDescriptionModelCommentUsers Opened AttemptsThe number of users who opened a level.SessionEventUsers with event %level%open% or %level%started%Users Completed AttemptsThe number of users who completed a level.SessionEventUsers with event %level%complet%Failed AttemptsThe number of attempts when users had an unsuccessful result within a level.SessionEventAttempts with event %level%failed%Users Failed 1 AttemptThe number of users who had 1 unsuccessful attempt within a level.SessionEventUsers with 1 event %level%failed% within the levelUsers Failed 2 AttemptsThe number of users who had 2 unsuccessful attempts within a level.SessionEventUsers with 2 events %level%failed% within the levelUsers Failed 3 AttemptsThe number of users who had 3 unsuccessful attempts within a level.SessionEventUsers with 3 events %level%failed% within the levelUsers Failed 4 AttemptsThe number of users who had 4 unsuccessful attempts within a level.SessionEventUsers with 4 events %level%failed% within the levelUsers Failed 5 AttemptsThe number of users who had 5 unsuccessful attempts within a level.SessionEventUsers with 5 events %level%failed% within the levelUsers Failed 6 AttemptsThe number of users who had 6 unsuccessful attempts within a level.SessionEventUsers with 6 events %level%failed% within the levelUsers Failed 7 AttemptsThe number of users who had 7 unsuccessful attempts within a level.SessionEventUsers with 7 events %level%failed% within the levelUsers Failed 8 AttemptsThe number of users who had 8 unsuccessful attempts within a level.SessionEventUsers with 8 events %level%failed% within the levelUsers Failed 9 AttemptsThe number of users who had 9 unsuccessful attempts within a level.SessionEventUsers with 9 events %level%failed% within the levelUsers Failed More than 10 AttemptsThe number of users who had more than 10 unsuccessful attempts within a level.SessionEventUsers with more than 10 events %level%failed% within the levelSpend Event 1The number of times users spent booster #1.TransactionBooster usage from the bonus_type column (configured individually per application upon request)Spend Event 2The number of times users spent booster #2.TransactionBooster usage from the bonus_type column (configured individually per application upon request)Spend Event 3The number of times users spent booster #3.TransactionBooster usage from the bonus_type column (configured individually per application upon request)Spend Event 4The number of times users spent booster #4.TransactionBooster usage from the bonus_type column (configured individually per application upon request)Spend Event 5The number of times users spent booster #5.TransactionBooster usage from the bonus_type column (configured individually per application upon request)Receive Event 1The number of times users received booster #1.TransactionBooster receipt from the bonus_type column (configured individually per application upon request)Receive Event 2The number of times users received booster #2.TransactionBooster receipt from the bonus_type column (configured individually per application upon request)Opened AttemptsThe number of times users opened a level.SessionEventEvents %level%open% or %level%started% from the session events tableInterstitial CountThe number of times users saw an interstitial.SessionEventEvents interstitial_view from the session events tableReward CountThe number of times users received a reward.SessionEventEvents %reward% from the session events tableDAUThe number of unique active users per day.SessionEventUnique client_id from the session events tableFailed RateThe level difficulty metric.SessionEventRatio: failed_attempts/cnt_completedPreHalf Level FailedThe number of failed attempts in the first half of the level (FuuFactor = 0). Each application defines what is considered the first half of the level.SessionEventFuuFactor is the ratio of combined tiles to the total number. It is a parameter sent by the client. In JSON, the parameter FuuFactor=0 must be included.PastHalf Level FailedThe number of failed attempts in the second half of the level (FuuFactor = 1). Each application defines what is considered the second half of the level.SessionEventFuuFactor is the ratio of combined tiles to the total number. It is a parameter sent by the client. In JSON, the parameter FuuFactor=1 must be included.",{"id":4666,"title":4667,"titles":4668,"content":4669,"level":1104},"/reports-and-dashboards/level-progress-report#level-progress-dashboard","Level Progress Dashboard",[467],"The Level Progress Dashboard provides insights into user progression across game levels. It enables tracking of player engagement, level completion rates, and potential drop-off points, helping optimize game balance and user experience. Update Frequency: Once per dayDisplayed Date Range: The dashboard shows a fixed range of the last 24 days plus the current day.",{"id":4671,"title":4672,"titles":4673,"content":4674,"level":1120},"/reports-and-dashboards/level-progress-report#level-progress-dashboard-widgets","Level Progress Dashboard Widgets",[467,4667],"The Level Progress Dashboard provides various widgets to analyze user progression, engagement, and level performance. Below is a detailed description of each widget, including its purpose, calculation rules, and limitations. % Completed Levels to First Start This widget calculates the percentage of users who started Level 1 on a given day and successfully completed the specified level. It helps analyze user engagement and identify levels where an abnormal drop-off occurs. Calculation Rules & Limitations:Tracks levels from the predefined list: [1, 2, 3, 4, 5, 10, 15, 20].A level is considered startedbased on the following event triggers:\n'Level Started', 'level_open', 'Level_Started', 'core_game_started', 'm3_game_started', 'level_started', 'level_start'A level is considered completedbased on:\n'Level Complete', 'level_completed', 'Level_Completed', 'core_game_finished', 'm3_game_finished'The event must have the parameter Result = ‘won’.Only levels where level = maxLevel or maxLevel is one level higher than level are considered (except for mycat and tamadog, where maxLevel is ignored).Events are counted only for mode 'default' or 'single'.For some applications, stats are collected based on 'level_start', meaning the widget will display the percentage of users who started Level 1 on that day and also reached the specified level. % Completed Levels to Started (+Avg) This widget calculates the percentage of users who started a specific level on a given day and successfully completed it. It is useful for identifying difficult levels that may impact engagement. Calculation Rules & Limitations:Uses the same event restrictions as % Completed Levels to First Start.The Average metric is calculated as the mean of relevant levels where at least 100 level starts occurred on that day. Tutorial Completion Rate This widget measures the percentage of users who completed each step of the tutorial compared to those who started it. It helps assess tutorial effectiveness and identify potential bottlenecks. Calculation Rules & Limitations:Tutorial Start Events(varies by app):\n'tutorial_step1_zoom', 't1_score_bar_tapped', 'ftue_01_politics_show', 'Tutorial Started''tutorial_screen' with parameter {\"progress\":\"not_started\"}'Tutorial_Shown_1', 'tutorial_started'Tutorial Step Identification Rules(varies by app):\nEvent name contains 'tutor' (lower(event_name) like '%tutor%')Event name matches '^t[0-9]' (e.g., 't1', 't2')Event name contains 'ftue' (lower(event_name) like '%ftue%') % Completed TLE Levels to First Start This widget calculates the percentage of users who started Level 1 of a Time-Limited Event (TLE) on a given day and successfully completed the specified level. TLE modes include easter_tle, halloween_tle, etc. Calculation Rules & Limitations:Tracks levels 1 to 10.A TLE level is considered startedbased on:\n'TLE Level Started', 'ShortTLE Level Started'A TLE level is considered completedbased on:\n'TLE Level Complete', 'TLE Level Completed', 'ShortTLE Level Complete'maxLevel is not considered.Only non-'default' mode events are counted.Only levels with at least 100 starts per day are included. % Completed TLE Levels to Started (+Avg) Calculates the percentage of users who started a specific TLE level on a given day and successfully completed it. This helps evaluate the effectiveness of TLE levels. Calculation Rules & Limitations:Uses the same event restrictions as % Completed TLE Levels to First Start.The Average metric is calculated as the mean of relevant levels where at least 100 level starts occurred on that day. Churn Rate, 1/ARPU Rate, Failed Rate These metrics provide insights into player retention, revenue, and level difficulty. Metric Definitions: Churn Rate: (Total churned users) / (Total unique users)1/ARPU Rate: 1 / (Total revenue / Total unique users)Failed Rate: (Total failed attempts) / (Total successful completions) Calculation Rules & Limitations:Displays Top 10 values.Data is aggregated from Level Report and Level Failed Report.Includes levels 15+ with mode in ('default', 'single').Data is calculated over a 7-day period.\nExample: Stats for June 7 are based on data from June 1 to June 7.DAU per level is calculated using SessionEvent table over 7 days, counting unique users who triggered any event at the selected level.Only levels with at least 50 unique users are considered.The Average metric is the mean of all levels meeting the above conditions. Level Completed Events per DAU This widget calculates how many levels are completed on average per Daily Active User (DAU). It helps determine whether players are progressing through levels or exiting the game early. Calculation Rules & Limitations:DAU is calculated from the AppLaunch model for the given day.Data is sourced from SessionEvent model.Events considered:\nTLE Level Completed: 'TLE Level Complete', 'TLE Level Completed', 'ShortTLE Level Complete'Level Completed: 'Level Complete', 'level_completed', 'Level_Completed', 'core_game_finished', 'm3_game_finished'",{"id":390,"title":389,"titles":4676,"content":4677,"level":1110},[],"Overview of Mediation Report",{"id":4679,"title":467,"titles":4680,"content":467,"level":1110},"/reports-and-dashboards/mediation-report#",[],{"id":4682,"title":4322,"titles":4683,"content":4684,"level":1104},"/reports-and-dashboards/mediation-report#overview-and-key-features",[467],"The Mediation Report is a tool for analyzing and monitoring ad network performance across your applications. It helps you track key metrics like revenue, impressions, and fill rate, providing insights to optimize your mediation setup and maximize monetization. This guide highlights the core features of the Mediation Report, its metrics, and how to interpret them for data-driven decision-making and performance improvement. Report Objective: The Mediation Report provides detailed information on the performance of ad networks, helping you evaluate the efficiency of your monetization strategy. Additionally, it serves as a tool for validating the performance of the mediation SDK, ensuring accurate tracking of impressions and other metrics.",{"id":4686,"title":4687,"titles":4688,"content":4689,"level":1120},"/reports-and-dashboards/mediation-report#data-source","Data Source",[467,4322],"The data in this report is sourced directly from the Applovin MAX and LevelPlay dashboards through their APIs. This means the metrics available in the report, such as impressions, revenue, and requests, are specifically tracked by the MAX and LevelPlay mediation platforms.",{"id":4691,"title":4342,"titles":4692,"content":4693,"level":1120},"/reports-and-dashboards/mediation-report#filters-and-dimensions",[467,4322],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionDateThe specific day for which the data is reported.MonthThe specific month for which the data is aggregated.AppThe name of the application associated with the data.CountryThe country where the ad impressions or revenue were generated.Ad FormatThe format of the ad (e.g., banner, interstitial, rewarded video).NetworkThe name of the monetization network (original name as provided by the network). This is a combination of Network (MAX and LevelPlay) and Custom Network values received from the mediation platform, mapped to our media sources.Original NetworkThe name of the monetization network as it appears in MAX and LevelPlay (customized within the MAX and LevelPlay mediation platforms). This reflects the exact format in which the mediation platform provides the data, without any modifications on our side.Custom NetworkThe name of custom networks, cross-promo campaigns, or direct deals. This reflects the exact format in which the mediation platform provides the data, without any modifications on our side.Network PlacementThe unique placement identifier (Placement ID) used for each network and ad format.",{"id":4695,"title":4347,"titles":4696,"content":4697,"level":1120},"/reports-and-dashboards/mediation-report#metrics",[467,4322],"Below is an explanation of the key metrics used in the Mediation Report for analyzing ad performance: MetricDescriptionRequestsThe number of times the application requested an ad to be loaded.ImpressionsThe total number of ad impressions. MAX and LevelPlay data may differ from ad network data due to factors such as time zone differences or viewability checks.AttemptsThe number of times a demand source (or ad source) was called to fill an ad request. A single ad request can attempt to fill ads from multiple sources.FillsThe number of times ad requests were successfully filled with an ad.Fill RateThe percentage of ad requests that were successfully filled. Formula: Fill Rate = Fills / Attempts.Display RateThe percentage of attempts that resulted in impressions. Formula: Display Rate = Impressions / Attempts × 100.eCPMEffective cost per thousand impressions, calculated as eCPM = Revenue / Impressions × 1000. MAX and LevelPlay data may differ from ad network data due to factors like viewability or incorrectly entered eCPM in the MAX and LevelPlay dashboard.RevenueRevenue generated from ads. MAX and LevelPlay data may differ from ad network data due to time zone differences, viewability checks, or incorrectly entered eCPM.",{"id":4699,"title":4700,"titles":4701,"content":4702,"level":1120},"/reports-and-dashboards/mediation-report#note-on-the-requests-metric","Note on the Requests Metric",[467,4322],"The Requests metric is available only within the following dimensions: DateAppCountryAd Format Important: The Requests metric does not exist within the Network or Network Placement dimensions, as these levels track Attempts instead.",{"id":4704,"title":4705,"titles":4706,"content":4707,"level":1104},"/reports-and-dashboards/mediation-report#the-most-common-waterfall-performance-analysis-example","The Most Common Waterfall Performance Analysis Example",[467],"To maximize revenue, developers use mediation platforms such as Applovin MAX and LevelPlay to aggregate and monetize across multiple ad networks. This report provides insights to help you manage your waterfalls within the mediation platform.",{"id":4709,"title":4710,"titles":4711,"content":4712,"level":1120},"/reports-and-dashboards/mediation-report#what-is-an-ad-waterfall","What is an Ad Waterfall?",[467,4705],"The ad waterfall refers to the traditional programmatic method of serving ads. It organizes ad sources in a hierarchical structure to ensure the highest CPMs for advertisers and maximize revenue for publishers. The waterfall prioritizes ad networks based on bid rates, delivering the most profitable ads first. This structure allows publishers to optimize their ad inventory and advertisers to secure premium placements at competitive rates.",{"id":4714,"title":4715,"titles":4716,"content":467,"level":1120},"/reports-and-dashboards/mediation-report#traditional-waterfall","Traditional waterfall",[467,4705],{"id":4718,"title":4719,"titles":4720,"content":4721,"level":1120},"/reports-and-dashboards/mediation-report#why-analyze-an-ad-waterfall","Why Analyze an Ad Waterfall?",[467,4705],"The biggest limitation of waterfall mediation is that it requests ads from one network at a time, moving down the list to the next highest bidder until an ad request is filled. However, gaps between bidders can result in missed revenue opportunities—a different ad network might have been able to fill the ad slot at a higher price. To maximize revenue, it's essential to track potential gaps, optimize bid placements, and effectively manage your ad waterfalls.",{"id":4723,"title":4724,"titles":4725,"content":4726,"level":1120},"/reports-and-dashboards/mediation-report#how-to-set-up-report-for-ad-waterfall-analysis","How to set up report for Ad Waterfall Analysis",[467,4705],"To evaluate the performance of ad waterfalls, follow these steps: Select the application you are interested in analyzing.Choose a specific ad format, such as Rewarded.Retain the dimensions Network and Network Placement for detailed breakdowns.Sort the data by eCPM in descending order to identify the highest-performing placements. A significant gap between this analytics and your mediation platform settings is a sign that this waterfall can do better.",{"id":4728,"title":467,"titles":4729,"content":467,"level":1120},"/reports-and-dashboards/mediation-report#_1",[467,4705],{"id":394,"title":393,"titles":4731,"content":467,"level":1110},[],{"id":4733,"title":4322,"titles":4734,"content":4735,"level":1104},"/reports-and-dashboards/monetization-insights#overview-and-key-features",[393],"The Monetization Insights Report and Dashboard are tools designed for analyzing and monitoring monetization performance. They enable you to track the effective cost per thousand impressions (eCPM) and provide detailed insights to evaluate and optimize the performance of your applications or advertising campaigns. This article explores the core functionalities of the Monetization Insights Report and Dashboard, their key metrics, and how to interpret them. You will learn how to use these tools for in-depth revenue analysis, trend identification, and data-driven decision-making.",{"id":4737,"title":4738,"titles":4739,"content":4740,"level":1104},"/reports-and-dashboards/monetization-insights#monetization-insights-report","Monetization Insights Report",[393],"Report Objective: Evaluate the performance of configured campaigns and their key metrics. This report includes data on advertising campaigns, their nested structure (Parent and Nested Campaigns), and detailed metrics for analyzing their performance. The Monetization Insights Report allows you to assess profitability, user engagement, conversions, and other critical aspects of monetization. Before using the report, familiarize yourself with the campaign nesting system. Read more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.",{"id":4742,"title":4743,"titles":4744,"content":4745,"level":1120},"/reports-and-dashboards/monetization-insights#what-the-monetization-insights-report-includes","What the Monetization Insights Report Includes",[393,4738],"This report contains data on all active and completed campaigns, along with their key metrics:",{"id":4747,"title":4748,"titles":4749,"content":4750,"level":1120},"/reports-and-dashboards/monetization-insights#key-benefits-of-the-monetization-insights-report","Key Benefits of the Monetization Insights Report",[393,4738],"Convenient campaign profitability analysis: The report provides key metrics to help identify which campaigns generate the highest revenue.Performance monitoring: Enables tracking metrics over time (by day, week, month).Support for nested structure: Work with Parent and Nested Campaigns for detailed analysis.Filtering and sorting: Easily customize filters to analyze data by specific applications, countries, traffic sources, and more.",{"id":4752,"title":4342,"titles":4753,"content":4754,"level":1120},"/reports-and-dashboards/monetization-insights#filters-and-dimensions",[393,4738],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionAppApplication Name.DayDate of impression, click, or purchase.WeekWeek of impression, click, or purchase.MonthMonth of impression, click, or purchase.CountryCountry of impression, click, or purchase.App VersionVersion of the app used on the user's device.LanguageLanguage of the user's device.EventName of the event that triggered the impression, click, or purchase.In-App StatusUser status at the time of impression, click, or purchase, indicating whether the user is a paying customer. The status can be one of the following: free, paying, or unknown. At the time of the first purchase, the user is in the free status.Subscription StatusCurrent subscription status of the user at the time of impression, click, or purchase. The status can be one of the following: free, paid, paid cancelled, trial, or trial cancelled.Parent Monetization ModelThe monetization type of the parent campaign to which the campaign belongs. The following types are available:In-App Monetization: Includes in-app purchases.Ad Monetization: Covers interstitial ads, rewarded ads, and banners.Subscription Monetization: Includes subscription-based models.Non-Monetization: Refers to activities not related to monetization, such as rate requests, notifications, and similar actions.Cross-promotion Monetization: Involves cross-promotion of other applications or products.Mixed Monetization: A combination of multiple monetization types.Bonus Monetization: Includes additional rewards offered to users, such as bonuses for app logins, completing tasks, or participating in special promotions.This classification helps identify the revenue model of parent campaigns and ensures clear segmentation for analysis and reporting.Nested Monetization ModelMonetization model of the nested campaigns: In-app, Ad, Subscription, Cross-promotion, etc.Campaign TypeCampaign type: Banner, Interstitial, Rewarded Video, External, Subscription, Cross-promotion, etcEvent NumberThe event sequence counter tracks the order of events throughout the entire lifecycle of the application without resetting.Events are grouped and displayed within the following ranges:Range 1–50: Each event is displayed incrementally with a step of 1. For example, event #5 is displayed as 5.Above 300: All events beyond this value are represented as 301.This format enables efficient event data processing and simplifies the analysis of application activity.CreativeCreative used in the campaign.Product ID TypeType of product: consumable product ID, bonus product ID, non consumable product ID, etcProduct IDUnique identifier of the product.Parent CampaignName of the parent campaign that includes nested campaigns.Read more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.Nested CampaignName of the nested campaign within the Parent Campaign.Read more about Parent and Nested Campaigns in the Understanding Parent and Nested Campaigns article.Media SourceMedia source from which the user installed the app.A/B TestName of the A/B test for campaigns that were part of testing.A/B Test GroupName of the group within the A/B test.A/B Test StatusCurrent status of the A/B test. Used only in report filters.ConfigConfiguration type: default or non-default.LevelThe level at which the event occurred (e.g., click, purchase).Max LevelThe maximum level reached by the user.ModeMode associated with the action.ParametersAdditional parameters defined for the event. To activate the functionality, you need to select an event. The event must be one that includes at least some parameters being sent.Promo CampaignThe name of the UA campaign through which the user installed the application.",{"id":4756,"title":4347,"titles":4757,"content":4758,"level":1120},"/reports-and-dashboards/monetization-insights#metrics",[393,4738],"Below is a detailed list of the primary metrics available in the report, each accompanied by a description to clarify its purpose and usage: MetricDescriptionImpressionsThe total number of ad impressions, excluding those from Nested Rewarded Video Campaign. More details are provided below the table in the relevant section.ClicksThe total number of clicks on the campaign ads.Trial StartedThe number of trial activations within the selected date range.Trial ConvertedThe number of conversions to a paid subscription after the trial period ends for a group of users within the selected date range. Trial Converted is attributed to the subscription start date based on data from the validator by Magify*.First PaymentThe first subscription renewals are recorded for a group of users within the selected date range. We account for both the first renewals after activating a paid subscription and those following trial conversions.First RenewFirst subscription renewals are recorded for a group of users within the selected date range. We account for both initial renewals following the activation of a paid subscription and those occurring after trial conversions.RenewsThe total number of subscription renewals, including first renewals, for a group of users within the selected date range. Renewals are attributed to the date when the subscription campaign was displayed. The data accumulation period for renewals spans 180 days, starting from the subscription campaign display date.PurchasesTotal number of in-app purchases.RevenueRevenue generated from banner, interstitial, rewarded, subscription, and in-app campaigns. For subscriptions, revenue is calculated over 180 days based on data from the validator by Magify*.CTR (%)Click-through rate calculated as Clicks / Impressions.adCVR (%)Percentage of impressions converted into rewarded video views.pCVR (%)Percentage of impressions converted into first payments.tCVR (%)Percentage of impressions converted into free trials.inappCVR (%)Percentage of impressions converted into in-app purchases.eCPMEffective cost per thousand impressions, calculated as Revenue / Impressions * 1000.Rewarded eCPMRevenue per thousand impressions for Nested Rewarded Video campaigns, calculated as Revenue (Nested) / Impressions (Nested) * 1000.Rewarded ImpressionsTotal impressions generated by Nested Rewarded Video campaigns.Ad ImpressionsTotal number of ad impressions.Ad RevenueRevenue generated from ads.Active UsersThe number of unique client IDs participating in the selected campaign.IMPAUImpressions per active user, calculated as Impressions / Active Users.Renews (RC)Total renewals within the selected date range, calculated based on data from the validator by Magify*.Sub Revenue (RC)Revenue generated from subscription campaigns, calculated over 180 days from the transaction date (based on the validator by Magify*).Unique SubscribersNumber of unique users with first payments, trial conversions, or renewals within the selected date range.First PurchaseNumber of users who made their first in-app purchase.Rev/Active UserRevenue per active user, calculated as Revenue / Active Users.CRp (%)Conversion rate per user, calculated as Purchases * 100 / Active Users.In-App RevenueRevenue generated from in-app purchases.In-App Paying UsersNumber of users who made in-app purchases.Average CheckAverage purchase value, calculated as In-App Revenue / Purchases.IAPPUAverage revenue per paying user, calculated as Purchases / In-App Paying Users. NoteMetrics such as Revenue, Renews, Unique Subscribers, and Sub Revenue are calculated using the validator by Magify. Alternatively, we support data validation from RevenueCat.",{"id":4760,"title":4761,"titles":4762,"content":4763,"level":1104},"/reports-and-dashboards/monetization-insights#impressions-and-rewarded-impressions-tracking-for-rewarded-video-campaigns","Impressions and Rewarded Impressions Tracking for Rewarded Video Campaigns",[393],"The Impressions metric includes data from all campaign types; however, there are specific considerations for Nested Rewarded Video campaigns. These rules ensure accurate tracking and proper differentiation between creative displays and rewarded ad impressions, enabling more detailed analysis of campaign performance.",{"id":4765,"title":4766,"titles":4767,"content":4768,"level":1120},"/reports-and-dashboards/monetization-insights#impressions-and-rewarded-impressions-with-creative","Impressions and Rewarded Impressions with Creative",[393,4761],"Rewarded Video campaigns of the Nested Rewarded Video Type with Creative involve the following user flows:",{"id":4770,"title":4771,"titles":4772,"content":4773,"level":1120},"/reports-and-dashboards/monetization-insights#impressions-and-rewarded-impressions-without-creative","Impressions and Rewarded Impressions without Creative",[393,4761],"Rewarded Video campaigns of the Nested Rewarded Video Type without creative involve the following user flows:",{"id":4775,"title":4776,"titles":4777,"content":4778,"level":1104},"/reports-and-dashboards/monetization-insights#important-considerations-for-cross-promo-monetization-revenue","Important Considerations for Cross-Promo Monetization Revenue",[393],"When analyzing revenue generated from the Cross-Promo monetization model, it is important to note that selecting multiple applications may lead to an inaccurate total. This is because the Cross-Promo monetization model can duplicate revenue generated by other monetization models (e.g., In-apps, Ads) from different applications. Example: If a user transitions via Cross-Promo from App A to App B and views ads generating $50 in revenue, the report will reflect the following: Revenue attributed to App B (Ads Model): $50.Revenue attributed to A (Cross-Promo Model): $50. This duplication occurs because the revenue generated in App B is also credited to the Cross-Promo campaign in App A. If a user transitions from App A to App B via a Cross-Promo campaign and generates $50 in ad revenue in App B, the report will display the following: AppMonetization ModelTotalApp ACross-Promo monetization model$50App BAd monetization model$50$100 As seen in the example, the revenue generated in App B is also attributed to the Cross-Promo model in App A, resulting in duplication. Recommendation: avoid analyzing the total revenue across multiple applications when Cross-Promo campaigns are included.",{"id":4780,"title":4781,"titles":4782,"content":4783,"level":1120},"/reports-and-dashboards/monetization-insights#monetization-insights-dashboard","Monetization Insights Dashboard",[393,4776],"The Monetization Insights Dashboard shares the same primary objective as the Monetization Insights Report: Evaluate the performance of configured campaigns and their key metrics. Both tools are designed to provide insights into the efficiency of your campaigns by analyzing core performance indicators, such as revenue, impressions, clicks, and eCPM. While the Report offers detailed data tables for granular analysis, the Dashboard delivers a visual, high-level overview of the same metrics, enabling faster trend identification and decision-making. These complementary tools ensure that you can monitor campaign performance effectively, regardless of whether you need an in-depth review or a quick summary.",{"id":4785,"title":4431,"titles":4786,"content":4787,"level":1120},"/reports-and-dashboards/monetization-insights#filters",[393,4776],"Below is a detailed list of the filters available in the dashboard, each accompanied by a description to clarify its purpose and usage: FilterDescriptionMedia SourceAppApplication Name.CountryCountry of impression, click, or purchase.Media SourceThe name of the advertising source from which the user installed the application.",{"id":4789,"title":4790,"titles":4791,"content":4792,"level":1120},"/reports-and-dashboards/monetization-insights#breakdown-options","Breakdown Options",[393,4776],"Each dashboard widget includes elements that serve as filters for visualizing data. These filters allow users to customize the dashboard view for more in-depth analysis and interpretation of key metrics. For example:",{"id":4794,"title":4347,"titles":4795,"content":4796,"level":1120},"/reports-and-dashboards/monetization-insights#metrics-1",[393,4776],"Below is a detailed list of the metrics available in the dashboard, each accompanied by a description to clarify its purpose and usage: MetricDescriptionImpressionsThe total number of campaign impressions, excluding Nested Rewarded Video (Ads).RevenueRevenue generated from campaigns such as banner, interstitial, rewarded, subscription, and in-app campaigns.eCPMEffective cost per mille (eCPM), calculated as Revenue / Impressions × 1000.Purch Revenue by EventsThe share of revenue generated by subscription and in-app campaigns, broken down by event. The chart highlights the top 10 events by total revenue for the selected period.pCVR by EventsThe percentage of impressions that converted to purchases (first payments + in-apps) broken down by event. The chart displays the top 10 events by purchase volume for the selected period.Purch Status Share of Active UsersThe share of Active Users broken down by in-app status.Purch Type ShareThe share of purchases (first payments + in-apps) broken down by product type (consumable and non-consumable) and in-app status.Purch Per Active UsersThe number of purchases (first payments + in-apps) per user.Purch Revenue Share by ModeThe share of revenue generated by subscription and in-app campaigns, broken down by mode.Purch Share by ModeThe share of purchases (first payments + in-apps) broken down by mode.Imp Per Active UsersThe number of impressions per user, broken down by campaign type. The chart displays the top 5 campaign types by total impressions for the selected period.A/B Test ImpressionsThe total number of impressions recorded for campaigns participating in an A/B test. NoteThe metrics in the dashboard are calculated in the same way as in the Monetization Insights Report (e.g., Revenue, Impressions) and are their equivalents.For Nested Rewarded Video campaigns, the Impressions metric in the dashboard reflects only the displays of creatives, such as images and others. This is confirmed by the examples and workflows provided above. This approach ensures data consistency between the report and the dashboard, enabling accurate analysis of campaign performance.",{"id":4798,"title":467,"titles":4799,"content":467,"level":1120},"/reports-and-dashboards/monetization-insights#",[393,4776],{"id":398,"title":397,"titles":4801,"content":4802,"level":1110},[],"Overview of Product Dashboard and All Product Dashboard",{"id":4804,"title":467,"titles":4805,"content":467,"level":1110},"/reports-and-dashboards/product-dashboard-and-all-product-dashboard#",[],{"id":4807,"title":4322,"titles":4808,"content":4809,"level":1104},"/reports-and-dashboards/product-dashboard-and-all-product-dashboard#overview-and-key-features",[467],"The Product Dashboard and All Product Dashboard are designed to track and analyze key product metrics, providing insights into their performance and trends over time. These dashboards help monitor changes in core KPIs, allowing for data-driven decision-making and product optimization. The All Product Dashboard functions similarly to the Product Dashboard, with the key difference being that it allows the selection of multiple applications in the filter, enabling a comparative analysis across multiple products. Key Features: Product Performance Monitoring – Tracks key metrics of a product and their changes over time.Multi-Product Analysis (All Product Dashboard) – Allows selection and comparison of multiple applications in one view.Dynamic Trend Evaluation – Visualizes changes in key KPIs to identify patterns and trends.Customizable Filters – Enables filtering by various dimensions to focus on specific insights.Comprehensive Data Overview – Provides a structured and easy-to-read interface for product performance evaluation. These dashboards empower teams to assess product health, compare multiple applications, and make informed strategic decisions based on real-time data.",{"id":4811,"title":4431,"titles":4812,"content":4813,"level":1104},"/reports-and-dashboards/product-dashboard-and-all-product-dashboard#filters",[467],"Below is a detailed list of the filters available in the dashboards, each accompanied by a description to clarify its purpose and usage: FilterDescriptionAppThe name of the application.CountryThe country where the ad was served.",{"id":4815,"title":4347,"titles":4816,"content":4817,"level":1104},"/reports-and-dashboards/product-dashboard-and-all-product-dashboard#metrics",[467],"Below is a detailed list of the metrics available in the dashboards, each accompanied by a description to clarify its purpose and usage: MetricDescriptionDAUThe number of daily active users.InstallsThe number of app installations.RetentionThe percentage of users who returned to the app on Day X after installation. Retention Day X is calculated for the cohort as the value for a specific date (D - X day). For example, Retention Day 4 on July 22 in the graph represents Retention Day 4 for the cohort from July 18.In-AppsThe number of in-app purchases (based on data from the validator by Magify. Alternatively, we support data validation from RevenueCat).ARPDAUAverage revenue per daily active user, calculated based on monetization grabbers.RevenueThe total revenue generated during the selected time period. Data sources: RevenueCat (in-apps and subscriptions), monetization grabbers (ads).Sessions per UserThe average number of sessions per user, calculated as Sessions / User.Avg. In-Apps CheckThe average in-app purchase value (based on data from the validator by Magify. Alternatively, we support data validation from RevenueCat).Sessions StatisticsIncludes median session duration, average session length, and average time spent per user.SubscriptionsThe number of subscriptions tracked (based on data from the validator by Magify. Alternatively, we support data validation from RevenueCat).ARPU D0The average revenue per user on Day 0.ARPU D4The average revenue per user on Day 4.% Paying UsersThe percentage of paying users relative to the cohort of users who installed the app.UninstallsThe number of app uninstalls tracked via Adjust.Adoption RateThe adoption rate of the app version during the selected time period.Rolling RetentionRolling Retention Day X includes users from the cohort who were active on any day between Day X and Day X+30 of their app lifecycle. For example, Rolling Retention Day 4 on July 22 in the graph represents Rolling Retention Day 4 for the cohort from July 18.Predicted RevenueThe forecasted revenue.",{"id":402,"title":401,"titles":4819,"content":4820,"level":1110},[],"Overview of Retention Report",{"id":4822,"title":4180,"titles":4823,"content":4824,"level":1104},"/reports-and-dashboards/retention-report#overview",[401],"The Retention Report is designed to analyze and track how one-time users transition into loyal, long-term players over time. It helps you track how many users return to your application after their first interaction, providing valuable insights into user engagement and product stickiness. This guide covers the core functionalities of the Retention Report, its key metrics, and how to interpret the data. By using this tool, you can analyze retention trends, identify areas for improvement, and make data-driven decisions to enhance long-term user engagement and retention strategies. Report Objective: Retention Analysis The objective of the Retention Report is to evaluate user retention and return rates. Retention is a metric that answers the question: how many users returned on Day X (Week X, Month X) after their first interaction with the product? It represents the number or percentage of returning users from the original cohort of new users. This report helps assess how users continue to engage with the product over time.",{"id":4826,"title":4342,"titles":4827,"content":4828,"level":1120},"/reports-and-dashboards/retention-report#filters-and-dimensions",[401,4180],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionAppName of the application.Install DayThe day the application was installed.Install WeekThe week the application was installed.Install MonthThe month the application was installed.Media SourceThe advertising source from which the user installed the application.Promo CampaignName of the promotional campaign (UA campaign).AdsetName of the ad set (UA campaign).AdName of the ad (UA Campaign).DeviceName of the device.Device TypeThe type of device (e.g., iPhone, Android).Initial App VersionThe version of the app downloaded by the user for the first time.CountryThe user's country.Attribution StatusAttribution status: installed or reattributed.Paying StatusIndicates whether a user has made a purchase. Users are initially marked as \"free\" and transition to \"paying\" after completing their first transaction (in-app purchase, subscription, etc.).Important Notes:The system checks whether a user has made a validated purchase only within the first 30 days after installation.This filter does not rely on inAppStatus or subscriptionStatus attributes \\ features from the SDK events but instead verifies actual validated purchases.Filters:Free – Users who have not made a purchase.Paying (made a purchase within 30 days of install) – Users who completed a transaction within the first 30 days after installation.Dimensions:Free – Users who have not made a purchase.Paying (made a purchase within 30 days of install) – Users who completed a transaction within the first 30 days after installation.This distinction ensures that filters allow broader segmentation, while dimensions focus on purchase behavior within a defined timeframe.LanguageLanguage of the user's device.OS VersionThe operating system version on the user's device.",{"id":4830,"title":4831,"titles":4832,"content":4833,"level":1120},"/reports-and-dashboards/retention-report#retention-calculation-formula","Retention Calculation Formula",[401,4180],"Day N Retention = (Users Day N / Users Day 0) * 100 Example: In the chart above, Day 2 retention for the October 25 cohort is 11%, calculated as: 15/139*100 = 10,79% Note: Magify and Adjust use different retention calculation methodologies.Magify: by calendar days (Day 1 = the next calendar day after the install calendar day).Adjust: in 24-hour periods starting from the exact install time. This may cause slight differences in reported retention metrics.",{"id":4835,"title":4836,"titles":4837,"content":4838,"level":1120},"/reports-and-dashboards/retention-report#data-display-modes","Data Display Modes",[401,4180],"The Retention Report offers two data display modes: Rate Mode (as shown in the screenshot above): Displays retention as a percentage.Value Mode (as shown in the screenshot below): Displays the raw number of users. Additionally, you can filter results based on cohort size using the Cohort Size From field for more precise analysis.",{"id":406,"title":405,"titles":4840,"content":467,"level":1110},[],{"id":4842,"title":4322,"titles":4843,"content":4844,"level":1104},"/reports-and-dashboards/ua-cohort-report-and-dashboard#overview-and-key-features",[405],"The UA Cohort Report and Dashboard provide detailed insights into user acquisition (UA) campaign performance by analyzing data segmented into cohorts based on the installation date. All data is collected for users who installed the application within a specified time period, ensuring an accurate cohort-based assessment. The report is designed to evaluate UA campaign costs and results, with data updating for six months from the installation date. The dashboard complements the report by presenting key performance indicators (KPIs) in an interactive format, allowing for an in-depth analysis of acquisition effectiveness. What is a Cohort?A cohort is a group of users who share one or more defining characteristics:A specific action they performed (e.g., purchase, registration, click).A time period in which the action occurred.Cohort vs. SegmentA cohort should not be confused with a segment, which represents a broader classification.For example, users acquired through a Facebook Ads campaign in January 2025 form one cohort, while users acquired through Google Ads in January 2025 form another. However, both belong to the broader segment of users acquired in January 2025.Similarly, users who installed an app from a specific UA campaign and made a purchase within the first 7 days belong to one cohort, while users from the same campaign who made their first purchase after 30 days belong to another. However, both groups are part of the segment of users from that UA campaign.Cohort AnalysisCohort analysis is a research method where users are divided into groups based on shared characteristics, and their behavior is tracked over a specific time period. This approach allows for analyzing user actions dynamically and identifying behavioral patterns over time. UA Cohort Report Features: User Acquisition Performance Tracking – Displays detailed statistics for UA campaigns, including cost, revenue, and retention metrics.Cohort-Based Data Analysis – Groups users based on their installation date, enabling a structured evaluation of campaign efficiency over time.Two Types of Metrics:Lifetime Cohort Metrics – Aggregated for the entire duration of the report.Fixed-Day Metrics – Collected for a specific number of days post-installation (e.g., D0, D4, D7, D30).Revenue Segmentation by Time Period:Total Revenue – The total revenue accumulated by the cohort during the report’s data collection period.D0 Revenue – Revenue generated on the day of installation.D30 Revenue – Revenue generated within the first 30 days post-installation. UA Cohort Dashboard Features: Aggregated UA Campaign Overview – Displays essential acquisition KPIs in a centralized dashboard for streamlined analysis.Cohort Growth and Monetization Trends – Enables tracking of user behavior and revenue trends over time.Customizable Performance Analysis – Allows users to adjust filters and visualization settings to focus on specific cohorts or KPIs.Fixed-Day Data Drill-Down – Provides insights into user behavior on key milestone days (e.g., D0, D7, D30, D180).Campaign Optimization Insights – Highlights high-performing acquisition channels and regions, assisting in UA strategy refinement. Together, these tools help marketers and analysts evaluate UA efficiency, optimize acquisition budgets, and improve monetization strategies based on real cohort data.",{"id":4846,"title":4847,"titles":4848,"content":4849,"level":1104},"/reports-and-dashboards/ua-cohort-report-and-dashboard#ua-cohort-report","UA Cohort Report",[405],"Report Objective: The UA Cohort Report analyzes the performance of user acquisition (UA) campaigns, segmenting data into cohorts based on the installation date. UA Cohort Report Variants: UA Cohort Short – Includes fixed-day metrics only up to D30, providing a concise view of short-term campaign performance.UA Cohort Long – Includes fixed-day metrics up to D180 (some up to D365). This report provides a long-term performance analysis but may run slower due to the volume of data.",{"id":4851,"title":4342,"titles":4852,"content":4853,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#filters-and-dimensions",[405,4847],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionPlatformThe platform of the application (e.g., iOS, Android).AppThe name of the application.DateThe installation date of the app, which determines the cohort.WeekThe installation week of the app, defining the cohort for that week.MonthThe installation month of the app, defining the cohort for that month.CountryThe user's country.Media SourceThe source of the installation (e.g., Facebook Ads, Google Ads).Promotion CampaignThe campaign name associated with the user’s app installation.Promotion Campaign IDThe campaign identifier linked to the user’s app installation.AdsetThe name of the ad set associated with the installation (if applicable to the ad network) or the publisher name.AdThe name of the specific ad associated with the installation (if applicable to the ad network) or the publisher name.DeviceThe name of the device on which the application was installed.OS VersionThe operating system version of the device where the application was installed. Explanation of Ad and AdsetIn the UA Cohort Report, dimensions are structured from broader categories to more granular ones in the following hierarchy:Media Source → Promotion Campaign → Adset → AdThis means:Media Source contains multiple Promotion Campaigns.Promotion Campaign consists of multiple Adsets.Adset includes multiple Ads.However, not all traffic sources follow a structure that separates Adset and Ad into two distinct levels. Depending on the ad network’s setup, Adset or Ad may contain either the publisher’s name or ID instead of a distinct hierarchy.",{"id":4855,"title":4347,"titles":4856,"content":4857,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#metrics",[405,4847],"General Metrics General metrics are high-level aggregated indicators calculated for all users within a cohort. These metrics provide a comprehensive assessment of user acquisition performance and serve as a foundation for evaluating the overall effectiveness of UA campaigns. MetricDescriptionImpressionsThe total number of times ads were displayed for the selected cohort.ClicksThe total number of clicks generated by campaigns for the selected cohort.CTR (%)Click-through rate (CTR) = (Clicks / Impressions) * 100%.InstallsThe total number of app installs for the selected cohort.CVR (IR, %)Conversion Rate (CVR) or Install Rate (IR) = (Installs / Clicks) * 100%.IPMInstalls per Mille (IPM) = (Installs / Impressions) * 1000.CostThe total acquisition cost for the selected cohort.CPICost per Install (CPI) = Cost / Installs.CPMCost per Mille (CPM) = (Cost / Impressions) * 1000.CPCCost per Click (CPC) = Cost / Clicks.Total RevenueCumulative revenue generated by the selected cohort over its lifetime and for specific time intervals: D0, D3, D4, D7, D14, D30, D60, D90, D120, D150, D180, D210, D240, D270, D300, D330, D365.D{x} RevenueRevenue for the cohort accumulated within a specific time period (e.g., D7 Revenue is revenue accumulated within the first 7 days).ROASReturn on Advertising Spend (ROAS) = (Revenue / Cost) * 100%.D{x} ROASROAS for specific time periods: D0, D3, D4, D7, D14, D30, D60, D90, D120, D150, D180, D210, D240, D270, D300, D330, D365.ARPUAverage Revenue per User (ARPU) = Revenue / Installs.D{x} ARPUARPU for specific time periods: D0, D3, D4, D7, D14, D30, D60, D90, D120, D150, D180, D210, D240, D270, D300, D330, D365.ROIReturn on Investment (ROI) = (Revenue - Cost) / Cost * 100%. Revenue Type Metrics The metrics in this section are components of the aggregate metrics described in the previous section. For example: Total Revenue = Ad Revenue + In-App Revenue + Subscription Revenue These metrics are used to evaluate specific revenue sources and assess the effectiveness of different monetization strategies. MetricDescription",{"id":4859,"title":4860,"titles":4861,"content":4862,"level":1104},"/reports-and-dashboards/ua-cohort-report-and-dashboard#use-case-ua-campaign-performance-monitoring-and-optimization","Use Case: UA Campaign Performance Monitoring and Optimization",[405],"The metrics and filters in these reports are designed for monitoring performance and optimizing user acquisition (UA) campaigns. The data analysis process consists of several key steps: High-Level Trend Analysis – Start by reviewing key metrics across days, weeks, and months to identify overall trends.Detailed Breakdown by Key Segments – Next, analyze performance by channel, campaign, and geo for deeper insights.Key Metrics– The most commonly used performance indicators include:\nSpend (total ad costs)CPI (cost per install)Cohort-based ARPUCohort-based ROASRetention ratesConversion to paying usersReal-Time and Retrospective Analysis – Retrospective data analysis helps identify when significant performance changes occurred and link them to specific UA adjustments that impacted results. Since UA campaigns follow a clear weekly seasonality pattern, analyzing data with a weekly breakdown is the most effective approach.",{"id":4864,"title":4865,"titles":4866,"content":4867,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#example-analyzing-a-ua-campaign-for-higher-quality-traffic","Example: Analyzing a UA Campaign for Higher-Quality Traffic",[405,4860],"This example presents data from an ad campaign aimed at acquiring higher-quality traffic. In the UA Predict Report, it is essential to correctly set return expectations: Target ROAS – Expected return on ad spend by day 150.Target Margin – Target profitability of +10%. Additionally, in this case, the analysis includes organic traffic, which is selected in the Predict Model filter. This approach enables flexible UA management, ROI forecasting, and the ability to evaluate the impact of different traffic sources on long-term performance. First, we analyze CPI. In November 2024, this app attempted to acquire more expensive traffic with the goal of improving its quality.",{"id":4869,"title":4870,"titles":4871,"content":4872,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#analyzing-arpu-and-cpi-trends","Analyzing ARPU and CPI Trends",[405,4860],"Looking at ARPU, we see that these users indeed generate higher average revenue. The weeks of October 28 and November 4 have a similar number of installs, but while CPI increased, ARPU across the entire funnel did not grow significantly. It seems that the increase in CPI was not necessarily due to attracting a different audience but rather just a CPI increase.Additional checks should be performed:\nDid IPM drop?Did the composition of acquired countries change?How did organic traffic distribution shift?It's also important to clarify when exactly UA campaign changes were made—was it midweek?Investigate whether UA network algorithms were adjusting due to traffic quality optimizations around this time. The week of November 11 shows a clear qualitative difference in ARPU, but CPI during this period is significantly higher than in October. Beyond this point, ARPU differences compared to October become less pronounced, but CPI remains significantly different.This suggests that, in addition to attempts to improve traffic quality, there may have also been efforts to scale acquisition volumes. Next, we observe a decline in ROAS, which indicates that while the traffic quality improved in terms of average revenue per user, the increase in quality does not recompense for the higher acquisition costs.",{"id":4874,"title":4875,"titles":4876,"content":4877,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#retention-and-traffic-quality-assessment","Retention and Traffic Quality Assessment",[405,4860],"Looking at retention, we observe that these users are less loyal. Since this is an ad-monetized app (with no paid transactions), there is no expectation of long-term revenue growth from purchases. Instead, advertising revenue directly depends on high retention rates. This leads to a key insight: In this case, improving traffic quality does not justify the increased acquisition costs, and alternative UA strategies should be explored.",{"id":4879,"title":4880,"titles":4881,"content":4882,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#additional-considerations-before-making-a-decision","Additional Considerations Before Making a Decision",[405,4860],"Before finalizing any decisions, it is essential to check whether any external factors have changed, such as: Geo distributionCreative mixCampaign structure For example, previously, optimization may have been focused solely on D7, while now D28 optimization has been added, leading to a restructuring of UA network algorithms. In such cases, performance during the algorithm adjustment period should not be used as a basis for decision-making.",{"id":4884,"title":4885,"titles":4886,"content":4887,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#data-volume-consideration","Data Volume Consideration",[405,4860],"Additionally, the number of installs in this example is quite low, making it difficult to draw reliable conclusions, even for experienced analysts. With this volume of installs, predictive models will not provide accurate results, as they require a larger dataset for meaningful projections.",{"id":4889,"title":4890,"titles":4891,"content":4892,"level":1120},"/reports-and-dashboards/ua-cohort-report-and-dashboard#recommended-action-revisiting-the-strategy","Recommended Action: Revisiting the Strategy",[405,4860],"The original goal of this experiment was to increase traffic quality. However, if higher-quality traffic does not justify the additional costs, it is advisable to revert to the October strategy and attempt to scale it. October's ROAS values appear to be very strong, making it a viable baseline for scaling.Scaling considerations: If the UA data shows a significant overperformance on ROAS by the target day, a more expensive acquisition strategy with lower short-term metrics at D30 might still be viable.If scaling is possible, it should be done gradually, ensuring that metrics remain stable after each scaling iteration. By carefully monitoring performance at each stage, it becomes possible to balance acquisition volume and profitability, ensuring that traffic quality improvements align with sustainable revenue growth.",{"id":410,"title":409,"titles":4894,"content":4895,"level":1110},[],"Overview of Daily Marketing Profit & Loss Report",{"id":4897,"title":467,"titles":4898,"content":467,"level":1110},"/reports-and-dashboards/daily-marketing-profit-and-loss-report#",[],{"id":4900,"title":4180,"titles":4901,"content":4902,"level":1104},"/reports-and-dashboards/daily-marketing-profit-and-loss-report#overview",[467],"The Daily Marketing Profit & Loss Report offers a high-level summary of monetization revenue and user acquisition (UA) spend. It is designed to help teams quickly assess the financial performance of their apps and determine whether monetization and UA strategies are effective. This report is also the primary place to check if data is being successfully ingested after setting up grabbers.",{"id":4904,"title":4460,"titles":4905,"content":4906,"level":1120},"/reports-and-dashboards/daily-marketing-profit-and-loss-report#data-sources",[467,4180],"This report aggregates data from the following sources: Ad Monetization Networks – Data is pulled via APIs directly from ad networks. For mediation platforms, the report reflects only the impressions directly attributed to the mediation network itself. Aggregated (not user-level) mediation data is used here.User Acquisition Networks – Spend and impression data are retrieved from the UA networks’ APIs.Mobile Measurement Partners (MMPs) – If the app uses Adjust or AppsFlyer, install and attribution data is sourced from these platforms. Note: If an MMP is not connected, installs are estimated using Magify’s internal AppLaunch model based on SDK data.",{"id":4908,"title":4909,"titles":4910,"content":4911,"level":1120},"/reports-and-dashboards/daily-marketing-profit-and-loss-report#install-attribution-without-mmp","Install Attribution Without MMP",[467,4180],"If no MMP is connected: Installs are estimated based on the first tracked app launch (via the Magify SDK).If a user has not launched the app for more than 90 days, the next launch is counted as a re-attribution (i.e., a new install).All installs captured in this way are considered organic installs.",{"id":4913,"title":4914,"titles":4915,"content":4916,"level":1120},"/reports-and-dashboards/daily-marketing-profit-and-loss-report#primary-use-cases","Primary Use Cases",[467,4180],"Get a quick overview of daily or periodic profit and loss.Validate that grabbers are properly collecting monetization and UA data.Analyze return on ad spend (ROAS) using key UA and monetization metrics.",{"id":4918,"title":4342,"titles":4919,"content":4920,"level":1120},"/reports-and-dashboards/daily-marketing-profit-and-loss-report#filters-and-dimensions",[467,4180],"Below is a detailed list of the primary filters and dimensions available in the report, each accompanied by a description to clarify its purpose and usage: Filter and DimensionDescriptionDateThe specific date the data refers toWeekThe calendar week the data refers to.MonthThe calendar month the data refers to.ApplicationThe name of the application.CountryThe country associated with the user or event.Ad NetworkThe name of the monetization network providing ad data.Media SourceThe name of the user acquisition (UA) network.",{"id":4922,"title":4347,"titles":4923,"content":4924,"level":1120},"/reports-and-dashboards/daily-marketing-profit-and-loss-report#metrics",[467,4180],"Below is a detailed list of the primary metrics available in the report, each accompanied by a description to clarify its purpose and usage: MetricDescriptionAds ImpressionsThe number of monetization impressions collected from monetization networks. Metric filter included.Ads RevenueThe total revenue from ad monetization sources. Metric filter included.eCPMEffective Cost Per Mille – the effective revenue from advertising per 1,000 impressions. Calculated as: Ads Revenue / Ads Impressions × 1000. Metric filter included.UA ImpressionsThe number of user acquisition (UA) ad impressions collected from UA networks. Metric filter included.UA SpendThe total UA spend from UA networks. Metric filter included.CPMCost Per Mille – the cost of advertising per 1,000 impressions. Calculated as: UA Spend / UA Impressions × 1000. Metric filter included.InstallsThe number of installs from MMPs, including installs without ID. If no MMP is available, Magify estimates installs using SDK AppLaunch data. Metric filter included.IPMInstalls Per Mille – the number of installs per 1,000 impressions. Calculated as: Installs / UA Impressions × 1000. Metric filter included.CPICost Per Install – the cost of one install. Calculated as: UA Spend / Installs. Metric filter included.Profit (Calendar)Represents the net profit calculated as the difference between Total Revenue and UA Spend for a given day or selected period. Calculated as: Total Revenue − UA Spend.",{"id":420,"title":419,"titles":4926,"content":4927,"level":1110},[],"Product Report: Ad Revenue analyzes ad revenue in a mobile app, including impressions, ad formats, performance, and load errors.",{"id":4929,"title":4180,"titles":4930,"content":4931,"level":1104},"/reports-and-dashboards/daily-report/ad-revenue#overview",[419],"In Product Report, you can analyze ad revenue and the performance of different ad formats. This helps you understand how ad impressions and formats impact revenue and how their performance changes over time.",{"id":4933,"title":4934,"titles":4935,"content":4936,"level":1104},"/reports-and-dashboards/daily-report/ad-revenue#what-you-can-analyze","What you can analyze",[419],"With Product Report, you can: analyze total ad revenue;compare performance of ad formats;evaluate ad impressions;analyze revenue per user and per impression;identify ad load issues.",{"id":4938,"title":4939,"titles":4940,"content":4941,"level":1104},"/reports-and-dashboards/daily-report/ad-revenue#recommended-metrics","Recommended metrics",[419],"Banner ImpressionsInterstitial ImpressionsRewarded ImpressionsBanner RevenueInterstitial RevenueRewarded RevenueAVG Banner RevenueAVG Interstitial RevenueAVG Rewarded RevenueAU Banner ImpressionAU Interstitial ImpressionAU Rewarded Impression",{"id":4943,"title":4944,"titles":4945,"content":4946,"level":1104},"/reports-and-dashboards/daily-report/ad-revenue#recommended-breakdowns","Recommended breakdowns",[419],"ApplicationDateDay Of WeekWeekMonthCountryApp VersionAd FormatNetwork NameCampaign (available when using Advanced SDK)LanguageInstall First Media Source ExampleAnalyze ad formats to understand:which format generates the most revenue;how many impressions users see;whether there are ad load issues.",{"id":4948,"title":4949,"titles":4950,"content":467,"level":1104},"/reports-and-dashboards/daily-report/ad-revenue#use-cases","Use cases",[419],{"id":4952,"title":4953,"titles":4954,"content":4955,"level":1120},"/reports-and-dashboards/daily-report/ad-revenue#ad-monetization-analysis","Ad monetization analysis",[419,4949],"Use to: optimize ad revenue;compare ad format performance;analyze ad fill and delivery. Key metrics Ads RevenueAds ImpressionsRevenue by formatAVG RevenueImpression Fail Rate",{"id":424,"title":423,"titles":4957,"content":4958,"level":1110},[],"Product Report: Campaign Analysis analyzes LiveOps campaign performance, including impressions, clicks, CTR, conversion funnels, campaign settings, and technical issues.",{"id":4960,"title":4180,"titles":4961,"content":4962,"level":1104},"/reports-and-dashboards/daily-report/campaign-analysis#overview",[423],"In Product Report, you can analyze the performance of LiveOps campaigns and evaluate how creatives, settings, and campaign parameters affect user behavior and conversion. This analysis is available when using Advanced SDK.",{"id":4964,"title":4934,"titles":4965,"content":4966,"level":1104},"/reports-and-dashboards/daily-report/campaign-analysis#what-you-can-analyze",[423],"With Product Report, you can: evaluate how many users see promotional materials;analyze user response to creatives;track seasonality and campaign effects;evaluate how campaign settings impact conversion.",{"id":4968,"title":4939,"titles":4969,"content":4970,"level":1104},"/reports-and-dashboards/daily-report/campaign-analysis#recommended-metrics",[423],"Nested Campaign ImpressionsParent Campaign ImpressionsImpression Fail RateClicksCTRIn-App Purchases CompletedPaid Subscription Activation CompletedTrial Subscription Activation Completed",{"id":4972,"title":4944,"titles":4973,"content":4974,"level":1104},"/reports-and-dashboards/daily-report/campaign-analysis#recommended-breakdowns",[423],"ApplicationDateDay Of WeekWeekMonthCountryCampaignInstall First Media SourceLevelGame ModeEventCreativeProduct ExampleUse impressions, clicks, and conversion metrics to build a funnel:user saw a campaign;user clicked;user completed an action.",{"id":4976,"title":4949,"titles":4977,"content":467,"level":1104},"/reports-and-dashboards/daily-report/campaign-analysis#use-cases",[423],{"id":4979,"title":4980,"titles":4981,"content":4982,"level":1120},"/reports-and-dashboards/daily-report/campaign-analysis#liveops-campaign-performance-analysis","LiveOps campaign performance analysis",[423,4949],"Use to: evaluate campaign ROI;optimize creatives and targeting;run A/B tests. Key metrics Campaign ImpressionsClicksCTRAU Campaign Impressions",{"id":4984,"title":4985,"titles":4986,"content":4987,"level":1120},"/reports-and-dashboards/daily-report/campaign-analysis#advanced-analytics","Advanced analytics",[423,4949],"Key metrics Campaign Type Impression NumberCampaign Type Session Impression NumberImpression NumberSession Impression NumberSession NumberEvent NumberSession Event Number",{"id":4989,"title":4990,"titles":4991,"content":4992,"level":1120},"/reports-and-dashboards/daily-report/campaign-analysis#config-based-analysis","Config-based analysis",[423,4949],"(no key metrics — dimensions-driven block)",{"id":4994,"title":4995,"titles":4996,"content":4997,"level":1120},"/reports-and-dashboards/daily-report/campaign-analysis#technical-analysis-and-debugging","Technical analysis and debugging",[423,4949],"Use to: identify technical issues;analyze device coverage;debug ad errors. Key metrics Impression FailedImpression Fail ReasonSDK Version",{"id":4999,"title":5000,"titles":5001,"content":5002,"level":1104},"/reports-and-dashboards/daily-report/campaign-analysis#funnel-clarification-important","Funnel clarification (important)",[423],"These metrics form a funnel from campaign impression to user action, allowing you to analyze conversion step by step — from seeing a campaign to completing a target action.",{"id":428,"title":427,"titles":5004,"content":5005,"level":1110},[],"Product Report: Game Analytics analyzes gameplay, including levels, bonuses, game economy, and player behavior.",{"id":5007,"title":4180,"titles":5008,"content":5009,"level":1104},"/reports-and-dashboards/daily-report/game-analytics#overview",[427],"In Product Report, you can analyze gameplay and evaluate how users interact with levels, bonuses, and game mechanics. This helps you understand player behavior and balance your game economy.",{"id":5011,"title":4934,"titles":5012,"content":5013,"level":1104},"/reports-and-dashboards/daily-report/game-analytics#what-you-can-analyze",[427],"With Product Report, you can: analyze how users progress through levels;evaluate how bonuses and in-game currency are used;identify where users fail most often;analyze balance of game economy.",{"id":5015,"title":4939,"titles":5016,"content":5017,"level":1104},"/reports-and-dashboards/daily-report/game-analytics#recommended-metrics",[427],"Bonuses ReceivedBonuses Received per Uniq UsersBonuses SpentBonuses Spent per Uniq UsersBonuses BalanceBonuses SurplusLevel StartedLevel FailedLevel CompletedLevel Fill RateSpend Bonuses per Level FailedSpend Bonuses per Level Completed",{"id":5019,"title":4944,"titles":5020,"content":5021,"level":1104},"/reports-and-dashboards/daily-report/game-analytics#recommended-breakdowns",[427],"ApplicationDateDay Of WeekWeek (Monday)Week (Sunday)MonthCountryLevelGame Mode ExampleUse level and bonus metrics to:understand where users struggle;evaluate how bonuses are used during gameplay;identify imbalances in progression.",{"id":5023,"title":4949,"titles":5024,"content":467,"level":1104},"/reports-and-dashboards/daily-report/game-analytics#use-cases",[427],{"id":5026,"title":5027,"titles":5028,"content":5029,"level":1120},"/reports-and-dashboards/daily-report/game-analytics#game-economy-and-progression-analysis","Game economy and progression analysis",[427,4949],"Use to: balance game economy;analyze bonus usage;understand level progression. Key metrics Bonus TransactionsBonuses Received / Bonuses SpentLevel Started / Completed / FailedLevel Fill RateSpend Bonuses per Level Failed / Completed",{"id":5031,"title":5032,"titles":5033,"content":5034,"level":1120},"/reports-and-dashboards/daily-report/game-analytics#example-balancing-game-economy","Example: balancing game economy",[427,4949],"Use the report to: ensure that in-game currency is not over-accumulated;adjust level difficulty;balance bonus generation and spending.",{"id":5036,"title":5037,"titles":5038,"content":5039,"level":1104},"/reports-and-dashboards/daily-report/game-analytics#important-notes","Important notes",[427],"Game analytics requires additional setup: level events must be sent as custom events (e.g., \"level started\", \"level failed\", \"level completed\");Advanced SDK is required for full functionality.",{"id":432,"title":431,"titles":5041,"content":5042,"level":1110},[],"Product Report: In-App Purchases & Subscriptions analyzes purchases and subscriptions, including revenue, conversion, renewals, and average check.",{"id":5044,"title":4180,"titles":5045,"content":5046,"level":1104},"/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions#overview",[431],"In Product Report, you can analyze purchases and subscriptions and evaluate how users generate revenue through transactions.",{"id":5048,"title":4934,"titles":5049,"content":5050,"level":1104},"/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions#what-you-can-analyze",[431],"With Product Report, you can: analyze purchase volume and revenue;track trial-to-paid conversion;analyze subscription renewals;evaluate average check;analyze refunds.",{"id":5052,"title":4939,"titles":5053,"content":5054,"level":1104},"/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions#recommended-metrics",[431],"In-App Purchases InitialisedIn-App Purchases CompletedAverage In-App Purchase CheckIn-App Purchases RefundedAverage In-App Refund CheckIn-App PurchasesIn-App RevenuePaid Subscription Activation InitialisedPaid Subscription Activation CompletedAverage Paid Subscription Activation CheckTrial Subscription Activation InitialisedTrial Subscription ConversionsAverage Trial Subscription Conversions CheckSubscription RenewalsAverage Renewals CheckSubscription RefundsSubscription Revenue",{"id":5056,"title":4944,"titles":5057,"content":5058,"level":1104},"/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions#recommended-breakdowns",[431],"ApplicationDateDay Of WeekWeek (Monday)Week (Sunday)MonthCountryIs AB UserIs No Install UserProductProduct TypeStore Name ExampleAnalyze purchases to:identify best-performing products;understand purchasing behavior by country;evaluate average check.",{"id":5060,"title":4949,"titles":5061,"content":467,"level":1104},"/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions#use-cases",[431],{"id":5063,"title":5064,"titles":5065,"content":5066,"level":1120},"/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions#in-app-purchase-analysis","In-app purchase analysis",[431,4949],"Use to: analyze conversion to purchase;understand paying user behavior;optimize pricing. Key metrics In-App Purchases CompletedIn-App RevenueAverage Purchase CheckConversion Rate",{"id":5068,"title":5069,"titles":5070,"content":5071,"level":1120},"/reports-and-dashboards/daily-report/in-app-purchases-and-subscriptions#subscription-analysis","Subscription analysis",[431,4949],"Use to: analyze subscription model;track trial conversion;analyze retention. Key metrics Paid Subscription Activation CompletedTrial Subscription Activation CompletedTrial Subscription ConversionsSubscription RenewalsSubscription Revenue",{"id":436,"title":435,"titles":5073,"content":5074,"level":1110},[],"Product Report: Methodology and FAQ explains report methodology, including user counting, activity metrics, refunds, installs, data delays, and limitations.",{"id":5076,"title":4180,"titles":5077,"content":5078,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#overview",[435],"This article explains how Product Report data is collected, calculated, and interpreted. Understanding these principles is essential for correctly analyzing metrics and avoiding incorrect conclusions.",{"id":5080,"title":5081,"titles":5082,"content":467,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#user-counting-and-gdpr","User counting and GDPR",[435],{"id":5084,"title":5085,"titles":5086,"content":5087,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#why-users-are-counted-separately-across-apps","Why users are counted separately across apps",[435,5081],"In Product Report, users are counted separately for each application. This means that if the same person uses two different apps, they will be counted as two different users. This is required by GDPR and privacy regulations.",{"id":5089,"title":5090,"titles":5091,"content":5092,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#how-it-works","How it works",[435,5081],"Each app assigns its own unique user identifier. These identifiers are not shared or linked across apps. As a result: one app → accurate unique usersmultiple apps → sum of users without deduplication",{"id":5094,"title":5095,"titles":5096,"content":5097,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#example","Example",[435,5081],"If: 5 users play only App A3 users play only App B2 users play both Then: App A → 7 usersApp B → 5 usersTotal (combined) → 12 users",{"id":5099,"title":5100,"titles":5101,"content":5102,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#key-takeaway","Key takeaway",[435,5081],"Unique users are accurate per appCross-app deduplication is not possibleThis behavior is expected and required",{"id":5104,"title":5105,"titles":5106,"content":467,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#active-users-au-vs-aual","Active Users: AU vs AUAL",[435],{"id":5108,"title":4180,"titles":5109,"content":5110,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#overview-1",[435,5105],"Product Report provides two types of active user metrics: AU and AUAL. They are calculated differently and may produce different results.",{"id":5112,"title":5113,"titles":5114,"content":5115,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#au-active-users","AU (Active Users)",[435,5105],"Users with any recorded activity. counted on every day with activityincludes all user interactions",{"id":5117,"title":5118,"titles":5119,"content":5120,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#aual-au-app-launch","AUAL (AU App Launch)",[435,5105],"Users who launched the app. counted only on app launchactivity after launch is attributed to the same day",{"id":5122,"title":5095,"titles":5123,"content":5124,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#example-1",[435,5105],"A user: opens app at 23:55continues activity after midnight → AU: counted for two days \n→ AUAL: counted for one day",{"id":5126,"title":5127,"titles":5128,"content":5129,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#when-to-use","When to use",[435,5105],"use AU → general activityuse AUAL → strict daily audience",{"id":5131,"title":5132,"titles":5133,"content":5134,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#ab-test-data-interpretation","A/B test data interpretation",[435],"Product Report shows A/B test data based on campaign interaction. This means: you see interactions related to a specific testnot full user activity within that test For full A/B analysis, use A/B Test Cohort Report.",{"id":5136,"title":5137,"titles":5138,"content":5139,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#bonus-and-game-economy-data","Bonus and game economy data",[435],"Bonus data is not automatically filtered for anomalies. This is because: each game has its own economyonly you know what values are normal",{"id":5141,"title":5142,"titles":5143,"content":5144,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#recommendation","Recommendation",[435,5137],"Use filters such as: Bonus ValueBonus TypeLevelGame Mode to define valid ranges for your game.",{"id":5146,"title":5147,"titles":5148,"content":5149,"level":1110},"/reports-and-dashboards/daily-report/methodology-and-faq#install-data-limitations","Install data limitations",[],"Install data in Product Report: is not intended for cohort analysismay differ from MMP reportsis available for a limited time window",{"id":5151,"title":5127,"titles":5152,"content":5153,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#when-to-use-1",[5147],"Use Product Report installs for: operational monitoringcampaign interaction analysis For cohort analysis, use UA Cohort / Predict Reports.",{"id":5155,"title":5156,"titles":5157,"content":467,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#refunds-and-subscription-renewals","Refunds and subscription renewals",[5147],{"id":5159,"title":4180,"titles":5160,"content":5161,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#overview-2",[5147,5156],"Refunds are deducted in total revenue metrics. This means you see net revenue.",{"id":5163,"title":5164,"titles":5165,"content":5166,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#important-limitation","Important limitation",[5147,5156],"Refund data does not include campaign metadata. This means refunds cannot be attributed to: campaignscreativeslevels",{"id":5168,"title":5169,"titles":5170,"content":5171,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#how-data-is-shown","How data is shown",[5147,5156],"total > includes refundsbreakdowns > exclude refunds",{"id":5173,"title":5100,"titles":5174,"content":5175,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#key-takeaway-1",[5147,5156],"totals > accurate net revenuebreakdowns > comparable but not net",{"id":5177,"title":5178,"titles":5179,"content":5180,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#data-freshness-window","Data freshness window",[5147],"Product Report includes only events received within 7 days after they occurred.",{"id":5182,"title":5183,"titles":5184,"content":5185,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#why-this-matters","Why this matters",[5147,5178],"Some users play offline. Their data may be sent later and excluded from the report.",{"id":5187,"title":5095,"titles":5188,"content":5189,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#example-2",[5147,5178],"A user plays offline for a week and sends data later. > events older than 7 days are not included",{"id":5191,"title":5100,"titles":5192,"content":5193,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#key-takeaway-2",[5147,5178],"report shows fresh datadelayed events are excludeddifferences with other systems are expected",{"id":5195,"title":5196,"titles":5197,"content":5198,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#deduplication-and-data-cleaning","Deduplication and data cleaning",[5147],"Ad revenue data is: deduplicatedcleaned from duplicates and errors This improves accuracy but may differ from raw data.",{"id":5200,"title":5201,"titles":5202,"content":5203,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#campaign-hierarchy-advanced-sdk","Campaign hierarchy (Advanced SDK)",[5147],"Campaigns may have hierarchy: parentnested Metrics are not additive between them. Important noteDo not sum nested metrics to match parent metrics.Use dedicated metrics:Parent Campaign ImpressionsNested Campaign Impressions",{"id":5205,"title":5206,"titles":5207,"content":5208,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#installs-vs-mmp","Installs vs MMP",[5147],"Installs in Product Report represent confirmed installs: user installeduser opened the app",{"id":5210,"title":5211,"titles":5212,"content":5213,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#why-numbers-differ","Why numbers differ",[5147,5206],"MMP may count installs without app activity. Product Report counts only active users.",{"id":5215,"title":5216,"titles":5217,"content":5218,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#how-to-validate","How to validate",[5147,5206],"Use: Days After Install = 0Active Users",{"id":5220,"title":5221,"titles":5222,"content":5223,"level":1104},"/reports-and-dashboards/daily-report/methodology-and-faq#retention-explanation","Retention explanation",[5147],"Retention measures how many users return after installation.",{"id":5225,"title":5164,"titles":5226,"content":5227,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#important-limitation-1",[5147,5221],"Retention cannot be calculated using a single filter. It requires combining multiple cohorts.",{"id":5229,"title":5230,"titles":5231,"content":5232,"level":1120},"/reports-and-dashboards/daily-report/methodology-and-faq#example-insight","Example insight",[5147,5221],"Retention can be analyzed by level to understand player behavior.",{"id":5234,"title":5037,"titles":5235,"content":5236,"level":1110},"/reports-and-dashboards/daily-report/methodology-and-faq#important-notes",[],"Product Report is not a cohort reportmetrics may differ across reportssome data is delayed or limitedinterpretation requires context",{"id":440,"title":439,"titles":5238,"content":5239,"level":1110},[],"Product Report: Metrics and Dimensions provides a complete overview of all available metrics and breakdowns, including user activity, monetization, campaigns, gameplay, and attribution data.",{"id":5241,"title":4180,"titles":5242,"content":5243,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#overview",[439],"This is the complete reference of all dimensions and metrics available in Product Report. All definitions are preserved as provided, structured for readability.",{"id":5245,"title":5246,"titles":5247,"content":467,"level":1110},"/reports-and-dashboards/daily-report/metrics-and-dimensions#dimensions-ultra-full","Dimensions (Ultra Full)",[],{"id":5249,"title":5250,"titles":5251,"content":5252,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#core","Core",[5246],"DimensionDescriptionNotesApplicationThe name of application you set when adding your app. (Internally, we use the Short Name for SDK key matching.)SDKDateThe date of the event (impression, click, purchase etc).SDKDay Of WeekThe number of weekday, starting from one (Monday = 1).SeasonalityWeek (Monday)Week starting from Monday—Week (Sunday)Week starting from Sunday—MonthMonth of event—",{"id":5254,"title":5255,"titles":5256,"content":5257,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#device-environment","Device & Environment",[5246],"DimensionDescriptionDeviceDevice nameOS VersionOS versionDevice TypeDevice typeOrientationScreen orientationCountryUser countryLanguageDevice language",{"id":5259,"title":5260,"titles":5261,"content":5262,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#app-sdk","App & SDK",[5246],"DimensionDescriptionApp VersionCurrent app versionInitial App VersionVersion at first launchFirst Launch DateFirst launch dateSDK VersionSDK versionEnvironment (Sandbox)Live or sandbox",{"id":5264,"title":5265,"titles":5266,"content":5267,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#user-attributes","User attributes",[5246],"DimensionDescriptionIAP StatusFree / Paying / UnknownSubscription StatusSubscription stateNew User0/1/2 flagInitial App Version PlayerVersion matchIDFA AvailableIDFA flagA/B Test UserAB test flagNo-Install UserInstall info flag",{"id":5269,"title":5270,"titles":5271,"content":5272,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#install-mmp","Install (MMP)",[5246],"DimensionDescriptionInstall Activity KindMMP activityInstall Cost ModelCost modelInstall Campaign NameCampaignInstall Campaign IDCampaign IDInstall Ad Set NameAd setInstall Ad NameAdInstall DateInstall dateDays After InstallDays differenceInstall Media SourceLast sourceInstall First Media SourceFirst source",{"id":5274,"title":5275,"titles":5276,"content":5277,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#gameplay","Gameplay",[5246],"DimensionDescriptionLevelGame levelMax LevelMax levelGame ModeMode",{"id":5279,"title":5280,"titles":5281,"content":5282,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#bonus","Bonus",[5246],"DimensionDescriptionBonus SourceSourceBonus ActionSpend/ReceiveBonus BalanceBalanceBonus TypeTypeBonus ValueValueBonus GroupGroup",{"id":5284,"title":5285,"titles":5286,"content":5287,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#campaign-advanced-sdk","Campaign (Advanced SDK)",[5246],"DimensionDescriptionCampaignCampaignCampaign ParentParentCampaign TypeTypeCampaign HierarchyHierarchyCampaign A/B TestTestCampaign A/B GroupGroupCampaign EventsEventsCampaign PlacementsPlacementsCampaign ProductProductCampaign Product CostCostCampaign CreativeCreative",{"id":5289,"title":5290,"titles":5291,"content":5292,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#ads","Ads",[5246],"DimensionDescriptionAd Format (SDK)RawAd Format (mapped)NormalizedNetwork Name (SDK)RawNetwork Name (mapped)NormalizedImpression Fail ReasonFail reason",{"id":5294,"title":5295,"titles":5296,"content":467,"level":1110},"/reports-and-dashboards/daily-report/metrics-and-dimensions#metrics-ultra-full","Metrics (Ultra Full)",[],{"id":5298,"title":447,"titles":5299,"content":5300,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#user-activity",[5295],"MetricDescriptionDAUNumber of unique users with any SDK activityEvents SentTotal number of eventsEvents per Active UserEvents / AU",{"id":5302,"title":5303,"titles":5304,"content":5305,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#app-launch","App Launch",[5295],"MetricDescriptionUsers with App LaunchesAUALApp LaunchesTotal launchesApp Launches per UserLaunches / AUAL",{"id":5307,"title":5308,"titles":5309,"content":467,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#ads-full-set","Ads — FULL SET",[5295],{"id":5311,"title":5312,"titles":5313,"content":5314,"level":1120},"/reports-and-dashboards/daily-report/metrics-and-dimensions#general","General",[5295,5308],"MetricDescriptionAd ImpressionsTotal impressionsUsers with Ad ImpressionsUsersAd RevenueRevenue",{"id":5316,"title":5317,"titles":5318,"content":5319,"level":1120},"/reports-and-dashboards/daily-report/metrics-and-dimensions#banner","Banner",[5295,5308],"MetricDescriptionBanner Impr.Banner impressionsUsers with Banner Impr.UsersBanner Impr. per Active UserPer AUBanner Impr. per App Launch UserPer AUALBanner Impr. per Ad ViewerPer AUAIBanner Impr. per Banner UserPer AUBIBanner Rev.RevenueBanner Rev. per Active UserPer AUBanner Rev. per App Launch UserPer AUALBanner Rev. per Ad ViewerPer AUAIBanner Rev. per Banner UserPer AUBIAverage Banner Rev.Rev / Impr",{"id":5321,"title":5322,"titles":5323,"content":5324,"level":1120},"/reports-and-dashboards/daily-report/metrics-and-dimensions#interstitial","Interstitial",[5295,5308],"MetricDescriptionInterstl Impr.Interstitial impressionsUsers with Interstl Impr.UsersInterstl Impr. per Active UserPer AUInterstl Impr. per App Launch UserPer AUALInterstl Impr. per Ad ViewerPer AUAIInterstl Impr / Interstl UserPer AUIIInterstl Rev.RevenueInterstl Rev. per Active UserPer AUInterstl Rev. per App Launch UserPer AUALInterstl Rev. per Ad ViewerPer AUAIInterstl Rev per Interstl UserPer AUIIAverage Interstl Rev.Avg",{"id":5326,"title":5327,"titles":5328,"content":5329,"level":1120},"/reports-and-dashboards/daily-report/metrics-and-dimensions#rewarded","Rewarded",[5295,5308],"MetricDescriptionRewarded Impr.ImpressionsUsers with Rewarded Impr.UsersRewarded Impr. per Active UserPer AURewarded Impr. per App Launch UserPer AUALRewarded Impr. per Ad ViewerPer AUAIRewarded Impr / Rewarded UserPer AURIRewarded Rev.RevenueRewarded Rev. per Active UserPer AURewarded Rev. per App Launch UserPer AUALRewarded Rev. per Ad ViewerPer AUAIRewarded Rev per Rewarded UserPer AURIAverage Rewarded Rev.Avg",{"id":5331,"title":595,"titles":5332,"content":5333,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#campaigns",[5295],"MetricDescriptionCampaign Impr.ImpressionsUsers with Campaign Impr.UsersCampaign Impr. per Active UserPer AUCampaign Impr. per App Launch UserPer AUALCampaign Impr / Campaign ViewerPer AUCIParent Campaign Impr.ParentNested Campaign Impr.NestedCampaign ClicksClicksUsers Who ClickedUsersCTR%",{"id":5335,"title":5336,"titles":5337,"content":5338,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#technical","Technical",[5295],"MetricDescriptionFailed ImpressionsFailUsers with Failed ImpressionsUsersImpression Failure Rate%",{"id":5340,"title":5341,"titles":5342,"content":5343,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#iap-full","IAP — FULL",[5295],"MetricDescriptionIAP Purchases InitiatedSDKUsers Who Initiated an IAP PurchaseUsersIAP Purchases CompletedStoreUsers Who Completed an IAP PurchaseUsersIAP Completion RateRatioValidated IAPs per Active UserPer AUValidated IAPs per App Launch UserPer AUALCompleted IAP Purchases per Paying UserPer payerIAP Revenue (GROSS)GrossIAP Revenue per Active UserPer AUIAP Revenue per App Launch UserPer AUALIAP Revenue per UserPer payerAverage IAP Purchase ValueAvg",{"id":5345,"title":5346,"titles":5347,"content":5348,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#iap-refunds","IAP Refunds",[5295],"MetricDescriptionRefunded IAPsCountUsers with Refunded IAPsUsersRefunded In-App per Active UserPer AURefunded In-App per App Launch UserPer AUALRefunded IAPs per Refunding UserPer userRefunded IAP RevenueRevenueIAP Refund Revenue per Active UserPer AUIAP Refund Revenue per App Launch UserPer AUALIAP Refund Revenue per UserPer userAverage IAP Refund ValueAvg",{"id":5350,"title":5351,"titles":5352,"content":5353,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#net-iap","Net IAP",[5295],"MetricDescriptionIAP PurchasesNet purchasesIAP RevenueNet revenue",{"id":5355,"title":5356,"titles":5357,"content":5358,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#subscriptions-full","Subscriptions — FULL",[5295],"MetricDescriptionPaid Sub StartsStartedPaid Sub ActivationsCompletedPaid Sub Conversion RateRatioValid Paid Subs per Active UserPer AUValid Paid Subs per App Launch UserPer AUALPaid Sub Revenue (GROSS)RevenuePaid Sub Revenue per Active UserPer AUPaid Sub Revenue per App Launch UserPer AUALAverage Paid Sub ValueAvg",{"id":5360,"title":5361,"titles":5362,"content":5363,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#trial","Trial",[5295],"MetricDescriptionTrial Sub StartsStartedTrial Sub ActivationsCompletedTrial Sub Conversion RateRatioValid Trial Subs per Active UserPer AUValid Trial Subs per App Launch UserPer AUAL",{"id":5365,"title":5366,"titles":5367,"content":5368,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#trial-paid","Trial → Paid",[5295],"MetricDescriptionTrial-to-Paid ConversionsCountTrial Conversions per Active UserPer AUTrial Conversions per App Launch UserPer AUALTrial-to-Paid Conversion RevenueRevenueTrial Conv. Revenue per Active UserPer AUTrial Conv. Revenue per App Launch UserPer AUALAverage Trial Conversion ValueAvg",{"id":5370,"title":5371,"titles":5372,"content":5373,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#renewals","Renewals",[5295],"MetricDescriptionSub RenewalsCountSub Renewals per Active UserPer AUSub Renewals per App Launch UserPer AUALSubscription Renewal RevenueRevenueSub Renewal Revenue per Active UserPer AUSub Renewal Revenue per App Launch UserPer AUALAverage Renewal ValueAvg",{"id":5375,"title":5376,"titles":5377,"content":5378,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#subscription-refunds","Subscription Refunds",[5295],"MetricDescriptionSub RefundsCountUsers with Refunded SubscriptionsUsersSub Refunds per Active UserPer AUSub Refunds per App Launch UserPer AUALSub Refunds per UserPer userSubscription Refund RevenueRevenueSub Refund Revenue per Active UserPer AUSub Refund Revenue per App Launch UserPer AUALSub Refund Revenue per UserPer user",{"id":5380,"title":5381,"titles":5382,"content":5383,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#combined-subscription","Combined Subscription",[5295],"MetricDescriptionSubscription PurchasesNetSubscription RevenueNet",{"id":5385,"title":5386,"titles":5387,"content":5388,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#revenue","Revenue",[5295],"MetricDescriptionTotal RevenueAds + IAP + SubsRevenue per UserARPUTotal Revenue per App Launch UserPer AUALTotal Revenue per 1000 ImpressionseCPMTotal Revenue per 100 Clicks—",{"id":5390,"title":5391,"titles":5392,"content":5393,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#bonus-economy","Bonus / Economy",[5295],"MetricDescriptionBoosters interactionsTransactionsUsers with Boosters interactionsUsersBoosters EngagedCountReceived Boosters interactionsReceiveUsers with Bonus Receive TransactionsUsersBoosters ReceivedCountBoosters Received %%Boosters Received per UserPer userSpend Boosters interactionsSpendUsers with Bonus Spend TransactionsUsersBoosters SpentCountBoosters Spent %%Boosters Spent per UserPer userBonus BalanceBalanceBonus SurplusRatio",{"id":5395,"title":5275,"titles":5396,"content":5397,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#gameplay-1",[5295],"MetricDescriptionLevels StartedStartLevels FailedFailLevels CompletedCompleteLevels Started per Active UserPer AULevels Failed per Active UserPer AULevels Completed per Active UserPer AULevel Complete-to-Fail RatioRatioBoosters Spent per Failed LevelPer levelBoosters Spent per Completed LevelPer level",{"id":5399,"title":5400,"titles":5401,"content":5402,"level":1104},"/reports-and-dashboards/daily-report/metrics-and-dimensions#installs-retention","Installs & Retention",[5295],"MetricDescriptionInstallsVerified installsRetention D1Day 1Retention D3Day 3Retention D7Day 7Retention D30Day 30",{"id":444,"title":443,"titles":5404,"content":5405,"level":1110},[],"UA Report is a cohort-based report that combines user acquisition, monetization, and user behavior data, allowing you to evaluate campaign performance and user payback over time.",{"id":5407,"title":467,"titles":5408,"content":467,"level":1110},"/reports-and-dashboards/daily-report/ua-report#",[],{"id":448,"title":447,"titles":5410,"content":5411,"level":1110},[],"Product Report: User Activity is a report for analyzing mobile app user activity, including app launches, sessions, time spent, and behavior.",{"id":5413,"title":4180,"titles":5414,"content":5415,"level":1104},"/reports-and-dashboards/daily-report/user-activity#overview",[447],"In Product Report, you can analyze user activity and behavior over time. This helps you understand how users interact with your application and how their activity changes across different periods, app versions, and other parameters.",{"id":5417,"title":4934,"titles":5418,"content":5419,"level":1104},"/reports-and-dashboards/daily-report/user-activity#what-you-can-analyze",[447],"With Product Report, you can: track active users (AU, AUAL);analyze app launches and sessions;evaluate session duration and total playtime;analyze changes in user activity over time;use filters and breakdowns (country, device, app version).",{"id":5421,"title":4939,"titles":5422,"content":5423,"level":1104},"/reports-and-dashboards/daily-report/user-activity#recommended-metrics",[447],"AU (Active Users)AUAL (AU App Launch)App LaunchesNumber SessionsAVG Session DurationAVG User PlaytimeLevel Started per AULevel Failed per AULevel Completed per AUBanner ImpressionsInterstitial ImpressionsRewarded Impressions",{"id":5425,"title":4944,"titles":5426,"content":5427,"level":1104},"/reports-and-dashboards/daily-report/user-activity#recommended-breakdowns",[447],"ApplicationDateDay Of WeekWeekMonthCountryApp VersionDeviceOS VersionDevice Type ExampleIf you select:metric: AUorder by: Dategroup by: App Versionyou can evaluate version adoption over time.",{"id":5429,"title":4949,"titles":5430,"content":467,"level":1104},"/reports-and-dashboards/daily-report/user-activity#use-cases",[447],{"id":5432,"title":5433,"titles":5434,"content":5435,"level":1120},"/reports-and-dashboards/daily-report/user-activity#basic-user-activity-analysis","Basic user activity analysis",[447,4949],"Use to: monitor overall app health;understand user retention;analyze session activity. Key metrics Active Users (AU)AU App Launch (AUAL)App LaunchesNumber SessionsAVG Session DurationAVG User Playtime",{"id":5437,"title":5438,"titles":5439,"content":5440,"level":1120},"/reports-and-dashboards/daily-report/user-activity#evaluating-update-performance","Evaluating update performance",[447,4949],"Use to: compare user activity before and after updates;analyze changes in session time;evaluate impact on revenue and technical stability.",{"id":414,"title":413,"titles":5442,"content":5443,"level":1110},[],"Product Report is a daily report for analyzing user activity, revenue, campaigns, and purchases in a mobile app.",{"id":5445,"title":4180,"titles":5446,"content":5447,"level":1104},"/reports-and-dashboards/daily-report#overview",[413],"Product Report provides comprehensive daily analytics for mobile applications collected via the Magify SDK. It is designed for daily monitoring and operational analysis of user behavior, monetization, and campaign performance. Data is automatically collected by the SDK from user devices, except for refunds and subscription renewals, which are received from app stores. The report is enriched with Magify internal dictionaries (e.g., configuration labels) and external data such as currency rates for normalization into USD. Product Report is based on daily data and is intended for operational analytics, not cohort analysis.",{"id":5449,"title":5450,"titles":5451,"content":5452,"level":1104},"/reports-and-dashboards/daily-report#what-you-can-analyze-in-this-report","What you can analyze in this report",[413],"With Product Report, you can analyze key aspects of your product: User activity active users and trends;sessions, launches, and time spent; Monetization ad revenue;in-app purchases and subscriptions; Campaign performance Magify campaign effectiveness;impressions, clicks, and user behavior; Product and gameplay (for games) level progression;bonus usage and economy balance; Technical and attribution data installs and traffic sources;devices, app versions, and ad errors.",{"id":5454,"title":5455,"titles":5456,"content":5457,"level":1104},"/reports-and-dashboards/daily-report#getting-started","Getting started",[413],"Recommended workflow: Start with the overall picture:\nactive users trend;total revenue.Define your analysis goal:\nactivity, monetization, campaigns, or gameplay.Drill down into details:\nuse filters and breakdowns (country, device, app version, etc.).Compare time periods:\nevaluate changes after releases, campaigns, or product updates. If you need help configuring the report or interpreting data, contact the Magify team.",{"id":5459,"title":5460,"titles":5461,"content":467,"level":1104},"/reports-and-dashboards/daily-report#key-analysis-areas","Key analysis areas",[413],{"id":5463,"title":447,"titles":5464,"content":5465,"level":1120},"/reports-and-dashboards/daily-report#user-activity",[413,5460],"Analyze core user engagement: DAU/WAU/MAU;app launch frequency;sessions and time spent;impact of updates. Learn more: Product Report: User Activity",{"id":5467,"title":419,"titles":5468,"content":5469,"level":1120},"/reports-and-dashboards/daily-report#ad-revenue",[413,5460],"Analyze advertising monetization: total ad revenue;performance of ad formats;impressions per user;ad load issues. Learn more: Product Report: Ad Revenue",{"id":5471,"title":5472,"titles":5473,"content":5474,"level":1120},"/reports-and-dashboards/daily-report#campaign-analysis-advanced-sdk","Campaign Analysis (Advanced SDK)",[413,5460],"Analyze Magify campaigns: impressions, clicks, and CTR;creative performance;impact of campaign settings;A/B testing. Learn more: Product Report: Campaign Analysis",{"id":5476,"title":5477,"titles":5478,"content":5479,"level":1120},"/reports-and-dashboards/daily-report#in-app-purchases-and-subscriptions","In-App Purchases and Subscriptions",[413,5460],"Analyze transactional monetization: in-app purchases;subscriptions and trials;renewals and refunds;average check and conversion. Learn more: Product Report: In-App Purchases and Subscriptions",{"id":5481,"title":5482,"titles":5483,"content":5484,"level":1120},"/reports-and-dashboards/daily-report#game-analytics","Game Analytics",[413,5460],"Analyze gameplay (for gaming apps): level progression;bonus usage;economy balance;player behavior. Learn more: Product Report: Game Analytics",{"id":5486,"title":5487,"titles":5488,"content":5489,"level":1104},"/reports-and-dashboards/daily-report#data-sources","Data sources",[413],"The report uses the following data sources: SDK data — user activity, ads, game events;Store data — refunds and subscription renewals;MMP data — installs and attribution;Internal dictionaries — configuration and metadata;Currency data — exchange rates.",{"id":5491,"title":5037,"titles":5492,"content":5493,"level":1104},"/reports-and-dashboards/daily-report#important-notes",[413],"Before using the report, keep in mind: Product Report is not a cohort report. Use it for operational analytics. For LTV and user quality analysis, use UA Cohort / Predict Reports.Install data is operational, not final. It may differ from MMP data.Some metrics are not available across all breakdowns. This depends on how and when events are recorded.Refund and renewal data may be delayed. Financial metrics may update over time.Bonus and game economy data require interpretation. They depend on your product logic and cannot be universally normalized. Learn more: Product Report: Methodology and FAQ",{"id":452,"title":451,"titles":5495,"content":5496,"level":1110},[],"Overview of Revenue Type Cohorts Report",{"id":5498,"title":467,"titles":5499,"content":467,"level":1110},"/reports-and-dashboards/revenue-type-cohorts-report#",[],{"id":5501,"title":4180,"titles":5502,"content":5503,"level":1104},"/reports-and-dashboards/revenue-type-cohorts-report#overview",[467],"The Revenue type cohorts report is a powerful tool for teams looking to dive deeper into how different monetization models impact user behavior and revenue. While it’s built with flexibility in mind, a bit of familiarity with cohort analysis and monetization logic will help you get the most value out of it. This report gives you full control over how metrics are calculated and displayed, so you can tailor insights to fit your specific analytical goals.",{"id":5505,"title":5506,"titles":5507,"content":5508,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#key-usage-guidelines","Key Usage Guidelines",[467,4180],"Mandatory Monetization Model Selection Users must select a specific monetization model for metric calculation. For detailed guidance on model selection and how it impacts calculations, refer to: Revenue Type Cohorts | Monetization Model SelectionRevenue Metrics Representation All monetary values are displayed in USD, calculated net of platform fees, regional markups, and refunds. However, each metric may have its own specific data treatment rules. For full definitions and logic behind each metric, refer to: Revenue Type Cohorts | Metric DefinitionsUnderstanding Paying Users For accurate interpretation of metrics, it’s important to understand how paying users are identified within this report. Details are available here: Revenue Type Cohorts | Paying User Inclusion Logic NoteThis article provides only the minimum instructions necessary to start using the report. We recommend reviewing the linked resources above to ensure accurate analysis and effective use of the report’s capabilities.",{"id":5510,"title":5511,"titles":5512,"content":5513,"level":1104},"/reports-and-dashboards/revenue-type-cohorts-report#metric-definitions","Metric Definitions",[467],"This section provides definitions for each metric included in the Revenue Type Cohorts report. It explains the general logic behind each metric, how it is calculated, and any important considerations. Specific details related to monetization models are covered in separate sections.",{"id":5515,"title":5516,"titles":5517,"content":5518,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#cohort-size","Cohort Size",[467,5511],"Cohort Size represents the total number of users who installed the application during the date range selected in the Date filter. Install data is sourced from Adjust or AppsFlyer. If no MMP is connected, install data is estimated using Magify’s internal AppLaunch model based on SDK signals. In this case: The first tracked app launch is considered the install date.If a user does not launch the app for 90 days, the next launch is treated as a re-attribution (i.e., a new install).All installs tracked this way are considered organic. Note: This metric does not depend on the selected monetization model. It is calculated once — on the install day — and remains unchanged.",{"id":5520,"title":5521,"titles":5522,"content":5523,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#paying-users-pu0-pu4-pu7-pu14-etc","Paying Users: PU0, PU4, PU7, PU14, etc.",[467,5511],"Paying Users (PU) indicates the number of users within the cohort who made at least one purchase within a specific number of days since installing the app. PU0 – Number of users who made a purchase on the same day they installed the app.PU4 – Number of users who made a purchase within the first 4 days post-install.PU7, PU14, etc. follow the same logic with longer windows. These metrics are cumulative and typically follow this pattern: PU0 ≤ PU4 ≤ PU7 ≤ PU14 However, this may not hold true in some scenarios — for instance, if a significant number of users request refunds after making purchases (e.g., subscription issues or billing errors). Such cases can be identified by monitoring the Refund Number metric.",{"id":5525,"title":5526,"titles":5527,"content":5528,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#tarppu0-tarppu4-tarppu7-tarppu14-etc","TARPPU0, TARPPU4, TARPPU7, TARPPU14, etc.",[467,5511],"TARPPU (Total Average Revenue Per Paying User) represents the average revenue generated by paying users within a cohort over a specific number of days after app installation. It is calculated as the total revenue from all paying users divided by the number of unique users who made a purchase in the given period: TARPPU = Total_PU_Revenue / PU Examples:TARPPU0 — the average revenue per user who made a purchase on the day of install.TARPPU4 — the average revenue from users who made at least one purchase within the first 4 days after install.Unlike PU metrics, TARPPU is not guaranteed to increase over time. Here's an example where the value decreases over time:Example:A cohort contains 10 users. On Day 0, three users each make a $10 purchase. TARPPU0 = (10 + 10 + 10) / 3 = $10Over the next 3 days, three more users make $2 purchases. TARPPU4 = (10 + 10 + 10 + 2 + 2 + 2) / 6 = $6In this case, as the cohort grows with lower-value purchases, the average drops. Why TARPPU Usually Increases In real-world scenarios, TARPPU typically increases over time because: Purchase values among users tend to be stable or increase on average.Users who make a purchase often continue generating ad revenue, which contributes to overall revenue and offsets low-value purchases by others. Relation to IARPPU and AdARPPU TARPPU is the sum of two separate metrics: TARPPU = IARPPU + AdARPPU IARPPU — Average revenue from in-app purchases per paying user.AdARPPU — Average revenue from ads per paying user. All three metrics share the same denominator (PU), and the TARPPU numerator is the sum of revenues from purchases and ads. Minor rounding differences may occur. Deriving Total Revenue from Paying Users Although the total revenue from paying users is not shown directly in the report, it can be calculated using: Total_PU_Revenue = PU × TARPPU Again, rounding may result in slight variations.",{"id":5530,"title":5531,"titles":5532,"content":5533,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#tarpu0-tarpu4-tarpu7-tarpu14-etc","TARPU0, TARPU4, TARPU7, TARPU14, etc.",[467,5511],"TARPU (Total Average Revenue Per User) represents the average revenue generated by all users in a cohort, regardless of whether they made a purchase. It is calculated by dividing the total revenue generated by the cohort by the total number of users in that cohort (Cohort Size): TARPU = Total_Cohort_Revenue / Cohort_Size Unlike TARPPU, which includes only paying users, TARPU accounts for all users, making it a more general indicator of monetization performance across an entire cohort. How It's Calculated TARPU0 — Total revenue generated by the cohort on Day 0 (day of install) divided by the cohort size.TARPU4 — Total revenue generated by the cohort in the first 4 days after install, divided by the original cohort size. Note: Cohort Size is calculated once — on the install date — and does not change over time. Why TARPU Tends to Increase Unlike TARPPU, TARPU tends to grow over time for mathematical reasons: The denominator (cohort size) remains constant.The numerator (total cohort revenue) increases cumulatively as users continue to generate revenue.Refunds may reduce revenue slightly but typically have minimal impact compared to ongoing ad or in-app revenue growth. Deriving Total Cohort Revenue Although total cohort revenue is not explicitly shown in the report, it can be derived from the TARPU value: Total_Cohort_Revenue = TARPU × Cohort_Size Minor rounding differences may occur depending on precision settings.",{"id":5535,"title":5536,"titles":5537,"content":5538,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#iarppu0-iarppu4-iarppu7-iarppu14-etc","IARPPU0, IARPPU4, IARPPU7, IARPPU14, etc.",[467,5511],"IARPPU (In-App Average Revenue Per Paying User) represents the average revenue from in-app purchases (including subscriptions) generated by paying users in a cohort. It is calculated by dividing the total in-app revenue by the number of paying users (PU): IARPPU = Inapp_PU_Revenue / PU This metric excludes ad revenue and focuses solely on monetization through in-app transactions. Subscriptions are treated as part of in-app revenue. How It's Calculated IARPPU0 — In-app revenue on Day 0 (install day), divided by the number of users who made a purchase that day.IARPPU4 — Cumulative in-app revenue over the first 4 days after install, divided by the number of users who made at least one purchase during that time. Key Characteristics Like TARPPU, this metric does not inherently increase over time. While total in-app revenue may grow, the addition of new payers with smaller purchase amounts can lower the average. However, in practice, IARPPU often grows over the cohort’s lifetime due to typical user behavior patterns and balanced spending. Note: Unlike TARPPU, IARPPU excludes ad-based revenue. Relationship to Other Metrics IARPPU contributes to the overall TARPPU (Total Average Revenue Per Paying User), together with ad revenue per paying user: TARPPU = IARPPU + AdARPPU These metrics share the same denominator (PU), and the numerator of TARPPU equals the sum of the numerators of IARPPU and AdARPPU. Minor discrepancies may appear due to rounding. Deriving In-App Revenue Total in-app revenue from paying users in a cohort can be calculated using: Inapp_PU_Revenue = PU × IARPPU As with other calculated values, small rounding errors may occur.",{"id":5540,"title":5541,"titles":5542,"content":5543,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#adarppu0-adarppu4-adarppu7-adarppu14-etc","AdARPPU0, AdARPPU4, AdARPPU7, AdARPPU14, etc.",[467,5511],"AdARPPU (Advertisement Average Revenue Per Paying User) represents the average advertising revenue generated by paying users in a cohort. It is calculated by dividing the total ad revenue attributed to paying users by the number of paying users (PU): AdARPPU = Ad_PU_Revenue / PU This metric accounts only for revenue generated from advertisements and excludes in-app purchases. How It’s Calculated AdARPPU0 — Ad revenue generated on the install day, divided by the number of users who made a purchase that day.AdARPPU4 — Cumulative ad revenue over the first 4 days post-install, divided by the number of unique users who made at least one purchase during that time. Key Characteristics This metric typically increases over the cohort’s lifetime, as paying users continue to generate ad revenue over time. In general: AdARPPU0 ≤ AdARPPU4 ≤ AdARPPU7 ≤ AdARPPU14 ... However, exceptions can occur—for example, when a large number of users make a purchase and later receive a refund (e.g., due to support tickets or payment issues). Such users are excluded from the cohort and, if they had high ad revenue, their removal can lower the metric. This behavior is similar to the effects seen with TARPPU, and anomalies can be investigated by checking the Refund Number metric. Relationship to Other Metrics AdARPPU, together with IARPPU, forms the TARPPU value: TARPPU = IARPPU + AdARPPU All three metrics share the same denominator (PU). The numerators for IARPPU and AdARPPU sum to equal that of TARPPU. Minor discrepancies may occur due to rounding. Deriving Total Ad Revenue from Paying Users The total advertising revenue generated by paying users can be calculated using: Ad_PU_Revenue = PU × AdARPPU As with other calculations, slight differences may appear due to rounding.",{"id":5545,"title":5546,"titles":5547,"content":5548,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#pu0-pu4-pu7-pu14-etc","%PU0, %PU4, %PU7, %PU14, etc.",[467,5511],"%PU (Percentage of Paying Users) represents the percentage of users within a cohort (based on install date) who made at least one in-app purchase within a given number of days post-install. It is calculated as follows: %PU = PU / Cohort_Size %PU0 – The percentage of users who made a purchase on the same day they installed the app.%PU4 – The percentage of users who made a purchase within the first 4 days after installation. The Cohort Size (number of users who installed the app during the selected date range) is fixed and does not change over time. Therefore, %PU reflects the cumulative growth in the number of paying users within the cohort. Key Characteristics This metric typically increases over the cohort’s lifetime, as more users make purchases over time. Thus, it is generally true that: %PU0 ≤ %PU4 ≤ %PU7 ≤ %PU14 ... This is because the denominator (Cohort Size) remains constant, while the number of paying users (PU) generally increases as time progresses. Exceptions and Edge Cases There are rare scenarios where this progression may not hold true. For instance, if many users in the cohort made a purchase and later requested a refund (e.g., due to a technical issue or accidental charge), they would be removed from the paying user count (PU), potentially lowering the %PU metric. These anomalies can be investigated using the Refund Number metric to identify cohorts with a high volume of refunded transactions.",{"id":5550,"title":5551,"titles":5552,"content":5553,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#purch0-purch4-purch7-purch14-etc","Purch0, Purch4, Purch7, Purch14, etc.",[467,5511],"Purchases (Purch) represents the total number of in-app purchases made by users from the selected cohort between the install date and a specified number of days after installation. This metric includes both standard one-time purchases and subscription renewals. Each renewal is counted as a separate purchase. For example, if a user renews a subscription four weeks in a row, this counts as four purchases. Metric Interpretation Purch0 – Total number of purchases made by cohort users on the day they installed the app.Purch4 – Total number of purchases made by the same users during the first 4 days after installation.And so on for Purch7, Purch14, etc. Since the purchase count accumulates over time, the following relationship usually holds: Purch0 ≤ Purch4 ≤ Purch7 ≤ Purch14 ... Exceptions and Edge Cases In rare cases, the typical metric progression may not apply. For example, if a significant number of users in a cohort made purchases but later requested refunds (e.g., due to technical issues or accidental charges), those users would no longer be counted as paying users (PU). This can lead to an unexpected drop in the %PU metric. To identify such anomalies, you can use the Refund Number metric, which highlights cohorts with unusually high volumes of refunded transactions.",{"id":5555,"title":5556,"titles":5557,"content":5558,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#ppu0-ppu4-ppu7-ppu14-etc","PPU0, PPU4, PPU7, PPU14, etc.",[467,5511],"Purchases per Paying User (PPU) represents the average number of purchases made by each paying user within the cohort, calculated over a defined number of days since app installation. The formula is: PPU = Purch / PU Where: Purch – Total number of purchases made by the cohort within the defined period.PU – Number of unique paying users in the cohort during the same period. Metric Interpretation PPU0 – Number of purchases made on the install day divided by the number of users who made purchases that day.PPU4 – Total number of purchases during the first 4 days divided by the number of unique users who made those purchases. Expected Behavior This metric generally increases over time as cohorts age: 1 ≤ PPU0 ≤ PPU4 ≤ PPU7 ≤ PPU14 ... The minimum value is 1, since by definition a paying user must have made at least one purchase. Related Metrics PPU is directly linked to IARPPU (In-App Average Revenue per Paying User) and MPP (Mean Purchase Price): IARPPU = PPU × MPP Where: MPP (Mean Purchase Price) = Total In-App Revenue / Number of Purchases This relationship reflects that the in-app revenue per paying user is a product of the number of purchases per paying user and the average value of each purchase.",{"id":5560,"title":5561,"titles":5562,"content":5563,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#mpp0-mpp4-mpp7-mpp14-etc","MPP0, MPP4, MPP7, MPP14, etc.",[467,5511],"Mean Purchase Price (MPP) represents the average value of a single in-app purchase made by users in a given cohort during a specified period. The formula is: MPP = Inapp_PU_Revenue / Purch Where: Inapp_PU_Revenue – Total revenue from in-app purchases (including subscriptions) made by the cohort during the selected period.Purch – Total number of purchases made during that period. Metric Interpretation MPP0 – In-app revenue from purchases made on the installation day, divided by the number of purchases made on that day.MPP4 – In-app revenue from purchases made in the first 4 days after installation, divided by the total number of purchases during those 4 days. Expected Behavior This metric does not necessarily increase over time but tends to do so in most practical cases: Min_Price ≤ MPP0 ≤ MPP4 ≤ MPP7 ≤ MPP14 ... The minimum possible value is determined by the cheapest available product in the store, which defines the lower bound of this metric. Important NotesAll monetary values in this report are net: calculated after commission, fees, and refunds.Revenue is reported in USD, which means MPP is influenced by currency exchange rates and local pricing policies.If comparing MPP to actual in-app store prices, be sure to account for these adjustments. Related Metrics MPP is directly tied to IARPPU (In-App Average Revenue per Paying User) and PPU (Purchases per Paying User): IARPPU = PPU × MPP This relationship holds mathematically: Inapp_PU_Revenue / PU = Purch / PU × Inapp_PU_Revenue / Purch Note: Small rounding differences may occur due to decimal precision during calculations.",{"id":5565,"title":5566,"titles":5567,"content":5568,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#max-ind-purch-rev","Max Ind Purch Rev",[467,5511],"Maximal Individual Purchase Revenue (Max Ind Purch Rev) represents the highest total in-app purchase revenue generated by a single user within the selected cohort. This metric helps identify whether the cohort includes a user with an unusually high purchase amount, which may indicate outlier behavior or heavy spender patterns. Calculation Logic For each unique user in the cohort: The total revenue from all in-app purchases (including subscriptions) is calculated starting from the app installation date and up to a maximum of 150 days.The system then determines the maximum of these user-level revenue totals. Use Case This metric is especially useful for: Detecting outlier spenders within a cohort.Comparing the highest user spend to the Mean Purchase Price (MPP) of the cohort to assess the impact of individual users on total revenue. A large gap between Max Ind Purch Rev and the cohort’s average purchase values may suggest the presence of high-value customers or unusual purchasing behavior.",{"id":5570,"title":5571,"titles":5572,"content":5573,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#refunds","Refunds",[467,5511],"Refund Number refers to the total number of in-app purchase refunds issued within the selected cohort. This metric captures the count of transactions where users received a monetary reimbursement. A common scenario for refunds includes users who contact the app store's support due to bugs, unintentional purchases, or billing errors. Refund Revenue represents the total amount of revenue lost due to these refunded transactions. This value reflects the financial impact of refunds on the cohort’s overall profitability. These metrics are important for evaluating the net revenue and identifying potential issues in the purchase flow that may be causing users to request refunds.",{"id":5575,"title":5576,"titles":5577,"content":5578,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#ind-purch-rev-51015-or-from-0520-to-52050","Ind Purch Rev > $5/$10/$15 or from $0/$5/$20 to $5/$20/$50",[467,5511],"Individual Purchase Revenue (Ind Purch Rev) > $5/$10/$15 or within $0/$5/$20 to $5/$20/$50 — this metric represents the number of users in the cohort whose cumulative in-app purchase revenue exceeds a given threshold ($5, $10, or $15), or falls within specific revenue intervals (e.g., from $0 to $5, $5 to $20, or $20 to $50). How it's calculated: For each unique user, the total value of in-app purchases is accumulated starting from the app install date, over a maximum period of 150 days. Once all users' cumulative purchase values are calculated, the system determines how many users meet either of the following conditions: Their total purchase revenue exceeds $5, $10, or $15Their total purchase revenue falls within one of the specified intervals:\n$0 to $5$5 to $20$20 to $50 This metric helps identify user segments by their total lifetime spend, providing insight into monetization tiers and high-value user behavior.",{"id":5580,"title":5581,"titles":5582,"content":5583,"level":1104},"/reports-and-dashboards/revenue-type-cohorts-report#monetization-model-selection","Monetization Model Selection",[467],"The Revenue Type Cohorts report requires the selection of a monetization model to calculate and display data. The chosen model directly affects how all core metrics are computed and interpreted. This article outlines the unique characteristics of each available monetization model. For general metric definitions and behavior, please refer to the Metric Descriptions section.",{"id":5585,"title":5586,"titles":5587,"content":5588,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#inapp-monetization","Inapp Monetization",[467,5581],"This model includes only users who made in-app purchases, based on data from RevenueCat or Magify’s internal validator. Revenue from subscriptions and ad impressions is not included. Model-specific behaviors: Only users who purchased in-app products are counted as paying users (PU).Revenue includes only in-app purchases. If a user bought both a subscription and an in-app, only the in-app value is counted.Ad revenue is excluded from all calculations.As a result:\nTARPPU = IARPPUAdARPPU = 0TARPU may be very low due to the exclusion of ads.If a user made both a subscription and an in-app purchase, only one purchase is counted.Refunds are not included (since they are generally related to subscriptions).",{"id":5590,"title":5591,"titles":5592,"content":5593,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#subscription-monetization","Subscription Monetization",[467,5581],"This model is structurally similar to the In-App Purchases Only model but focuses exclusively on subscriptions. Model-specific behaviors: Only users who purchased a subscription are counted as paying users.Revenue includes only subscription income. In-app purchases are excluded.Ad revenue is excluded.As a result:\nTARPPU = IARPPUAdARPPU = 0TARPU may be very low due to the exclusion of ads.If a user bought both a subscription and an in-app, only one purchase is counted.Each subscription renewal counts as an additional purchase (e.g., 4 renewals = 4 purchases).Refunds are included, as they are common in subscription-based monetization.",{"id":5595,"title":5596,"titles":5597,"content":5598,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#subscription-inapp-monetization","Subscription & Inapp Monetization",[467,5581],"This hybrid model includes all users who made any purchase, whether subscription or in-app. Model-specific behaviors: All paying users are included (subscription and in-app).Revenue includes all purchase types.Ad revenue is excluded.As a result:\nTARPPU = IARPPUAdARPPU = 0TARPU may appear low due to lack of ad data.If a user purchased both subscription and in-app, both purchases are counted.Renewals are treated as additional purchases.Refunds are included.",{"id":5600,"title":5601,"titles":5602,"content":5603,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#ad-monetization","Ad Monetization",[467,5581],"This model excludes all purchases and focuses entirely on ad revenue, considering all users regardless of purchasing behavior. Model-specific behaviors: Purchases are not tracked; therefore, PU = 0.All per-paying-user metrics (TARPPU, IARPPU, AdARPPU) = 0.TARPU is the only meaningful metric available.Provides insight into ad-driven monetization performance.",{"id":5605,"title":5606,"titles":5607,"content":5608,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#in-app-purchases-ad-monetization","In-App Purchases & Ad Monetization",[467,5581],"This model includes only in-app purchasers, but their ad revenue is also counted. Model-specific behaviors: Only in-app purchasers are counted as PUs.Purchase revenue includes only in-apps.Ad revenue is included for those users.As a result:\nTARPPU = IARPPU + AdARPPUIf a user also bought a subscription, only one purchase is counted (in-app).Refunds are not included, as they pertain mostly to subscriptions.",{"id":5610,"title":5611,"titles":5612,"content":5613,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#subscriptions-ad-monetization","Subscriptions & Ad Monetization",[467,5581],"This model includes only subscription purchasers, and their ad revenue is also counted. Model-specific behaviors: Only subscription purchasers are counted as PUs.Purchase revenue includes only subscriptions.Ad revenue is included for those users.As a result:\nTARPPU = IARPPU + AdARPPUIf a user also made an in-app purchase, only one purchase is counted (subscription).Renewals are counted as separate purchases.Refunds are included.",{"id":5615,"title":5616,"titles":5617,"content":5618,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#all-monetization-models","All Monetization Models",[467,5581],"This model includes all monetization sources — subscriptions, in-app purchases, and ad revenue — and is recommended for comprehensive financial performance tracking. Model-specific behaviors: All paying users are included (subscriptions and in-apps).Revenue includes all purchases and ad revenue.As a result:\nTARPPU = IARPPU + AdARPPUIf a user made both types of purchases, both are counted.Renewals are counted as additional purchases.Refunds are included. Each model should be chosen based on the specific analysis goal and the available monetization sources for the application. Accurate interpretation of report metrics depends on the proper selection of the monetization model.",{"id":5620,"title":5621,"titles":5622,"content":467,"level":1104},"/reports-and-dashboards/revenue-type-cohorts-report#paying-user-inclusion-logic","Paying User Inclusion Logic",[467],{"id":5624,"title":5625,"titles":5626,"content":5627,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#general-arppu-calculation","General ARPPU Calculation",[467,5621],"In general terms: ARPPU = Revenue / Users Users refers to individuals who have made at least one purchase (either an in-app or subscription). If a user requests and receives a full refund for a subscription, they are removed from the paying user cohort on the day the refund is processed.Revenue is calculated in USD, net of store commissions, regional markups, and currency exchange rates, and falls into three categories:\nIARPPU – In-app and subscription revenue onlyAdARPPU – Ad revenue from paying users onlyTARPPU – Total revenue from both purchases and ads (paid user cohort only) How ARPPU Is Calculated Calculations are based on a combination of: Purchase data from RevenueCat or Magify’s internal validatorInstall data from Adjust or AppsFlyer If no MMP (Mobile Measurement Partner) is connected, install data is estimated using the AppLaunch model from the Magify SDK. The first recorded app launch is considered the install. If no launches occur within 90 days, the next launch is treated as a re-install. All such installs are classified as organic. Example: Standard ARPPU Calculation Suppose a user installs the app on March 1. They activate a free trial on March 2, purchase a $5 subscription on March 3, and renew it with another $5 payment on March 10. If this user is the only one in the cohort, ARPPU would be calculated as follows: DayRevenuePaying UsersARPPUDay 0$000Day 4$51$5Day 7$51$5Day 14$101$10Day 30$101$10 Example: Refund Scenario If the same user refunds the second payment on March 16, calculations change: DayRevenuePaying UsersARPPUDay 0$000Day 4$51$5Day 7$51$5Day 14$101$10Day 30$51$5 If the first payment is refunded instead (on March 6), and not the second: DayRevenuePaying UsersARPPUDay 0$000Day 4$51$5Day 7$000Day 14$000Day 30$000",{"id":5629,"title":5630,"titles":5631,"content":5632,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#arppu-for-ad-revenue","ARPPU for Ad Revenue",[467,5621],"Ad revenue is tracked separately and included only if the user is considered a paying user. Assume the user above views $1 worth of ads daily, and purchases are the same as in the original scenario (March 3 and 10): DayRevenuePaying UsersARPPUDay 0$000Day 4$41$4Day 7$71$7 If the user loses paying user status (e.g., refund on March 6), all accumulated ad revenue is removed: DayRevenuePaying UsersARPPUDay 0$000Day 4$41$4Day 7$010",{"id":5634,"title":5635,"titles":5636,"content":5637,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#ab-test-arppu-specifics","A/B Test ARPPU Specifics",[467,5621],"In standard ARPPU calculations, the cohort is defined by install date. In A/B test reports, the cohort is defined by the date the user enters the test group — and all prior revenue is excluded. Best Practice: Run A/B tests on new users only to ensure revenue capture aligns with the user's full lifecycle. Otherwise, ARPPU values may underrepresent user behavior due to missing historical revenue data.",{"id":5639,"title":5640,"titles":5641,"content":5642,"level":1104},"/reports-and-dashboards/revenue-type-cohorts-report#cohort-lifetime-considerations","Cohort Lifetime Considerations",[467],"Metrics in the Revenue Type Cohorts report are calculated with respect to each user’s install date and how long they have remained active in the app. There are three main types of metrics based on how cohort lifetime is considered:",{"id":5644,"title":5645,"titles":5646,"content":5647,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#_1-metrics-based-on-the-cohort-formation-date","1. Metrics Based on the Cohort Formation Date",[467,5640],"This applies to metrics like Cohort Size. The Cohort Size is calculated once — on the user’s install date — and remains fixed thereafter.It includes all users who installed the app within the selected date range (based on Adjust, AppsFlyer, or Magify AppLaunch if no MMP is connected).",{"id":5649,"title":5650,"titles":5651,"content":5652,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#_2-metrics-based-on-a-specific-day-in-the-cohorts-lifecycle","2. Metrics Based on a Specific Day in the Cohort’s Lifecycle",[467,5640],"This applies to most metrics in the report, such as ARPPU7, PU4, IARPPU14, etc. For each metric, only users who have reached the specified day in their lifecycle are included in the calculation.Example: To calculate ARPPU7, users must have been installed at least 7 days ago. Let’s say today is the 7th of the month, and we analyze a cohort of users who installed the app on the 1st: These users have completed 7 days in the app.Therefore, ARPPU7 will be available and calculated based on their data. Now assume the cohort includes users from both the 1st and 2nd: On the 7th, only users from the 1st have reached day 7.On the 8th, users from the 2nd also become eligible, and ARPPU7 will include both dates. Recommendation: Use fixed-day metrics (e.g., ARPPU7) only when all users in the cohort have reached the required age; otherwise, results may be skewed due to partial cohort data.",{"id":5654,"title":5655,"titles":5656,"content":5657,"level":1120},"/reports-and-dashboards/revenue-type-cohorts-report#_3-metrics-based-on-the-maximum-available-lifetime","3. Metrics Based on the Maximum Available Lifetime",[467,5640],"Some metrics, such as: Refund RevenueMax Individual Purchase Revenue ...are calculated based on the maximum number of days each user has existed in the app, up to the available data window (typically 150 days). These metrics do not require a specific day threshold like ARPPU7, and instead reflect the full lifetime of each user within the selected cohort range. However, use caution when interpreting totals: If you select a single day 7 days ago, the report compares users who installed the app on that exact day.If you select a week-long range (e.g., 14–7 days ago), users will have different lifespans—some may have 14 days of activity, while others only 7. Recommendation: Use these metrics in daily breakdowns or with cohorts that have all passed at least 30 days. Most revenue (~2/3) is typically generated within the first 30 days, making such insights more representative.",{"id":455,"title":443,"titles":5659,"content":5405,"level":1110},[],{"id":5661,"title":4180,"titles":5662,"content":5663,"level":1104},"/reports-and-dashboards/ua-report#overview",[443],"UA Report provides a unified view of acquisition cost, user behavior, and monetization, allowing you to evaluate not just traffic volume, but its actual value and payback over time. It helps you understand how effectively your campaigns perform, which traffic sources bring higher-value users, and how quickly users start generating revenue. The report helps answer key questions: How quickly users start generating revenueWhether advertising campaigns are profitableWhich traffic sources bring higher-value usersHow user behavior and monetization evolve over time All data in the report is grouped into cohorts — users who installed the app within a selected time period. What is a cohort?A cohort is a group of users who share a common characteristic, most commonly the app install date.In UA Report:- cohorts are defined by install date- all metrics are calculated relative to the install day (D0)A cohort should not be confused with a segment.A cohort groups users by a specific point in time (e.g. install date), while a segment represents a broader group of users based on shared attributes.Cohort analysis allows tracking how user behavior and monetization evolve over time after acquisition.",{"id":5665,"title":5666,"titles":5667,"content":5668,"level":1104},"/reports-and-dashboards/ua-report#how-data-is-structured","How data is structured",[443],"This is the core principle of the report — all metrics are aligned to user lifetime after installation. Each row represents a cohort of users grouped by install dateAll metrics are calculated relative to D0 (install day)Metrics labeled as D{x} represent cumulative values over X days after installUnless stated otherwise, all values are cumulative Data is updated daily and available for up to 720 days since install. Aggregation is performed based on selected filters.",{"id":5670,"title":5671,"titles":5672,"content":5673,"level":1104},"/reports-and-dashboards/ua-report#how-to-find-the-report","How to find the report",[443],"To access the UA Report in Magify: Magify > Analytics > Reports > UA Report",{"id":5675,"title":5676,"titles":5677,"content":5678,"level":1104},"/reports-and-dashboards/ua-report#data-types","Data types",[443],"The report combines two types of metrics: Fact — actual data collected from sourcesPredict — forecasted values generated by ML models Predict metrics allow estimating future cohort performance at early stages, before full data is available. Predict metrics are recalculated as additional fact data becomes available. Metrics can be divided into: accumulated (lifetime) metricsfixed-period metrics (D0, D1, D7, etc.)",{"id":5680,"title":5487,"titles":5681,"content":5682,"level":1104},"/reports-and-dashboards/ua-report#data-sources",[443],"The report is built on data from external services and internal systems, combined at the user level. Main sources: MMP (Adjust / AppsFlyer) — installs, attribution, traffic sourcesTransaction Validator (Magify / RevenueCat) — purchases and refundsAd mediation (AppLovin MAX / LevelPlay) — ad monetizationMagify SDK — sessions, user activity, and events",{"id":5684,"title":5685,"titles":5686,"content":5687,"level":1104},"/reports-and-dashboards/ua-report#filters-dimensions","Filters / Dimensions",[443],"Dimensions are structured from higher-level groups to more granular ones: Media Source > Campaign > Promo Creative > Creative Type > Adset > Ad Not all traffic sources support the same structure. Depending on the source, Adset and Promo Creative fields may contain publisher IDs or names. FilterDescriptionDateThe user install date used to define the cohortApplicationThe app for which the data is collectedMedia SourceThe traffic source that generated the installCampaignThe advertising campaign associated with the installPromo CreativeThe specific creative or ad associated with the installCreative TypeThe type or format of the creativePlatformThe platform of the device (iOS or Android)CountryThe country of the userTraffic TypeThe type of traffic (e.g. UA, Organic)WeekThe install week of the cohortMonthThe install month of the cohortAdsetThe ad group associated with the installDeviceThe device model used by the userDevice TypeThe type of device (e.g. phone, tablet)OS VersionThe operating system version of the devicePromotion Campaign IDThe unique identifier of the campaignCampaign AssigneeThe current owner of the campaignCampaign Initial AssigneeThe initial owner of the campaignPromotion Campaign Type (new)The type or classification of the campaignCreative ProducerThe person responsible for the creativeCreatives LinkA link to the creative assetCreative TagsTags assigned to the creativeCreative KindThe category or type of creativeCreative ParentThe parent creative in the hierarchyCreative DurationThe duration of the creativeEnd Card LocalizationThe localization of the end cardEnd Card NameThe name of the end cardEnd Card TypeThe type of the end cardIs EcIndicates whether an end card is presentCreative LocalizationThe localization of the creative",{"id":5689,"title":4347,"titles":5690,"content":5691,"level":1104},"/reports-and-dashboards/ua-report#metrics",[443],"Metrics labeled as D{x} represent cumulative values over X days after install. Examples: D7 Revenue — revenue within 7 daysD30 Revenue — revenue within 30 days",{"id":5693,"title":5694,"titles":5695,"content":5696,"level":1104},"/reports-and-dashboards/ua-report#general-metrics","General metrics",[443],"These metrics provide a high-level overview of traffic acquisition performance and are calculated for all users within the cohort.  They are used to evaluate the efficiency of user acquisition campaigns. NameDescriptionImpressionsThe total number of ad impressionsClicksThe total number of clicksCTRThe click-through rate (Clicks / Impressions)InstallsThe total number of installsCostThe total cost of traffic acquisitionCPIThe cost per install (Cost / Installs)CPMThe cost per 1000 impressions (Cost / Impressions * 1000)CPCThe cost per click (Cost / Clicks)IPMInstalls per 1000 impressions (Installs / Impressions * 1000)",{"id":5698,"title":5699,"titles":5700,"content":5701,"level":1104},"/reports-and-dashboards/ua-report#revenue-metrics","Revenue metrics",[443],"These metrics represent the total revenue generated by the cohort and its components. Total revenue consists of multiple monetization sources: Total Revenue D{x} = Ad Revenue D{x} + IAP Revenue D{x} + Subs Revenue D{x} Revenue metrics are available in different formats: before ref — before refundsNet — after refundsRef. — refunds Predicted metrics are derived from predicted revenue: Predicted ARPU = Predicted Revenue / InstallsPredicted ROAS = Predicted Revenue / CostPredicted ARPPU = Predicted Revenue / Paying Users NameDescriptionAct. Rev. before ref. D{x}The actual cumulative cohort revenue before refunds, net of platform fees and taxesAct. Revenue D{x} (Net)The actual cumulative cohort revenue after refundsAct. Revenue D{x} (Ref.)The total amount of refunds within the cohortPred. Revenue D{y} → D{x} (Net)The predicted revenue increase between two time horizons, where D{y} is the starting point and D{x} is the target horizonAct. ROAS D{x} (Net)Return on ad spend calculated as Revenue / SpendPred. ROAS D{x} (Net)Forecasted ROAS based on predicted revenue. This metric uses the latest available D{y} and is updated as new data becomes availableAct. ARPU D{x} (Net)Average revenue per user (Revenue / Installs)Pred. ARPU D{y} → D{x} (Net)Forecasted ARPU based on predicted revenueROIReturn on investment ((Revenue - Spend) / Spend)Act. Ad Revenue D{x}The actual cumulative ad revenue of the cohortPred. Ad Revenue D{y} → D{x}The predicted ad revenue growth between two time horizonsAct. Ad ROAS D{x}ROAS calculated using ad revenuePred. Ad ROAS D{x}Forecasted ROAS based on predicted ad revenue. This metric uses the latest available D{y} and is updated over timeAct. Ad ARPU D{x}Average ad revenue per userPred. Ad ARPU D{y} → D{x}Forecasted ad ARPUAct. IAP Rev. before ref. D{x} (Net)The actual cumulative IAP revenue before refundsAct. IAP Revenue D{x} (Net)The actual cumulative IAP revenue after refundsAct. IAP Revenue D{x} (Ref.)The total IAP refundsPred. IAP Revenue D{y} → D{x} (Net)The predicted IAP revenue growth between two time horizonsAct. IAP ROAS D{x}ROAS calculated using IAP revenuePred. IAP ROAS D{x}Forecasted ROAS based on predicted IAP revenue. This metric uses the latest available D{y} and is updated over timeAct. IAP ARPU D{x}Average IAP revenue per userPred. IAP ARPU D{y} → D{x} (Net)Forecasted IAP ARPUAct. Subs Rev. before ref. D{x} (Net)The actual cumulative subscription revenue before refundsAct. Subs Revenue D{x} (Net)The actual cumulative subscription revenue after refundsAct. Subs Revenue D{x} (Ref.)The total subscription refundsPred. Subs Revenue D{y} → D{x} (Net)The predicted subscription revenue growth between two time horizonsAct. Subs ROAS D{x}ROAS calculated using subscription revenuePred. Subs ROAS D{x} (Net)Forecasted ROAS based on predicted subscription revenue. This metric uses the latest available D{y} and is updated over timeAct. Subs ARPU D{x}Average subscription revenue per userPred. Subs ARPU D{y} → D{x} (Net)Forecasted subscription ARPU",{"id":5703,"title":5704,"titles":5705,"content":5706,"level":1104},"/reports-and-dashboards/ua-report#paying-users-analysis","Paying users analysis",[443],"These metrics include all types of purchases and are used to evaluate campaigns focused on acquiring paying users. NameDescriptionPU D{x} (Net)The number of paying users in the cohort by day D{x}PU Revenue D{x} (Net)The total revenue generated by paying usersCVR (Install → PU) D{x}Conversion rate from install to paying userARPPU D{x}Average revenue per paying userAct. Purchases per PU D{x}The average number of purchases per paying userCPA PU D{x}Cost per paying user (Cost / Paying Users)",{"id":5708,"title":5069,"titles":5709,"content":5710,"level":1104},"/reports-and-dashboards/ua-report#subscription-analysis",[443],"These metrics include only subscription-related events and are used to evaluate campaigns focused on subscription conversions. NameDescriptionTrial Starts D{x}The number of trial starts within the cohortTrial Conversions D{x}The number of users converted from trial to paidPaid Starts D{x} (Sub)The number of first payments without a trialRenewals D{x}The number of subscription renewalsCVR (Install → Trial Start) D{x}Conversion rate from install to trialCVR (Trial → Paid) D{x}Conversion rate from trial to paidCVR (Install → Paid) D{x}Conversion rate from install to paidCPA Trial Start D{x}Cost per trial startCPA Trial Conversion D{x}Cost per trial conversionCPA Paid Start D{x}Cost per first payment",{"id":5712,"title":5713,"titles":5714,"content":5715,"level":1104},"/reports-and-dashboards/ua-report#iap-analysis","IAP analysis",[443],"These metrics include only one-time purchases and are used to evaluate campaigns focused on in-app purchases. NameDescriptionIAP Purchases D{x} (Net)The number of IAP purchases excluding refundsIAP Purchases D{x} before ref.The number of IAP purchases before refundsIAP Purchases D{x} (Ref.)The number of refunded IAP purchasesIAP PU D{x}The number of users who made IAP purchasesCVR (Install → IAP) D{x}Conversion rate from install to IAP purchaseIAP ARPPU D{x} (Net)Average revenue per IAP paying userIAP Purchases per PU D{x}The average number of purchases per userCPA IAP D{x}Cost per IAP paying user",{"id":5717,"title":5718,"titles":5719,"content":5720,"level":1104},"/reports-and-dashboards/ua-report#customer-loyalty","Customer loyalty",[443],"These metrics are used to track user retention and understand how users return to the app over time. Retention may differ depending on the data source: NameDescriptionRetention D{x} SDKCalculated as D{x} / D0, where D{x} is the number of users active on day x and D0 is the number of users active on the install day, based on SDK session dataRetention D{x} MMPCalculated as D{x} / D0, where D{x} is the number of users active on day x and D0 is the number of users active on the install day, based on MMP data",{"id":5722,"title":5723,"titles":5724,"content":5725,"level":1104},"/reports-and-dashboards/ua-report#predict-specific-metrics","Predict-specific metrics",[443],"These metrics are used to estimate future cohort performance based on early data. Predictions are calculated for the following horizons: D1 / D7 / D30 / D90 / D180 / D360 / D720 NameDescriptionPred. Total Revenue D{y} → D{x} (Net)The predicted cumulative cohort revenue at the target horizon D{x}, based on data available at D{y}Pred. ARPU D{x}The predicted average revenue per userPred. ROAS D{x}The predicted return on ad spendPred. ARPPU D{x}The predicted revenue per paying userPrediction Error(Predicted Revenue - Actual Revenue) / Actual Revenue",{"id":5727,"title":5728,"titles":5729,"content":5730,"level":1104},"/reports-and-dashboards/ua-report#how-the-ml-revenue-prediction-model-works","How the ML revenue prediction model works",[443],"The model uses a baseline + residual prediction approach. Predictions are calculated at the user level (client_id) and then aggregated at the report level.",{"id":5732,"title":5733,"titles":5734,"content":5735,"level":1120},"/reports-and-dashboards/ua-report#baseline","Baseline",[443,5728],"Uses early-stage revenue: D1D7D30",{"id":5737,"title":5738,"titles":5739,"content":5740,"level":1120},"/reports-and-dashboards/ua-report#residual","Residual",[443,5728],"Predicts additional revenue beyond baseline.",{"id":5742,"title":5743,"titles":5744,"content":5745,"level":1120},"/reports-and-dashboards/ua-report#how-revenue-prediction-is-built","How revenue prediction is built",[443,5728],"The model uses early user data: revenue progressionbehavioral patternscontextual attributes (country, app, source, device) Based on this, it predicts: Total RevenueAd RevenueIAP RevenueSubscription Revenue Derived metrics: Predicted ARPUPredicted ROASPredicted ARPPUPrediction Error",{"id":5747,"title":5748,"titles":5749,"content":5750,"level":1120},"/reports-and-dashboards/ua-report#data-requirements","Data requirements",[443,5728],"At least 1000 users within the analyzed time window (depending on the prediction horizon)Availability of early revenue (D1 / D7 / D30)D1 Revenue > $100 recommendedHistorical data improves prediction accuracy",{"id":5752,"title":5753,"titles":5754,"content":5755,"level":1120},"/reports-and-dashboards/ua-report#when-to-use-predict","When to use Predict",[443,5728],"early performance evaluationcampaign scaling decisionstraffic quality comparison",{"id":5757,"title":5758,"titles":5759,"content":5760,"level":1104},"/reports-and-dashboards/ua-report#use-case","Use case",[443],"The report is used to monitor performance and optimize acquisition campaigns. Analysis typically starts at the overall app level and can be broken down into traffic sources, campaigns, and geographies. Common metrics: SpendCPIARPUROASRetentionpayer conversion Weekly analysis is recommended due to strong seasonality in traffic acquisition. ExampleWeek 1 cohort: ROAS D7 = 15%Week 2 cohort: ROAS D7 = 25%This reflects differences in cohort performance across time.",{"id":459,"title":458,"titles":5762,"content":5763,"level":1110},[],"Guide to Using Daily & Monthly Product Dashboards",{"id":5765,"title":4180,"titles":5766,"content":5767,"level":1104},"/reports-and-dashboards/daily-and-monthly-product-overview#overview",[458],"These dashboards provide a consolidated view of your key business metrics at daily and monthly levels. They highlight trends in installs by traffic source, and revenue from in-app purchases, subscriptions, and ads — including ad revenue broken down by type. Revenue figures are fully normalized based on exchange rates, store fees, and tax multipliers (e.g., VAT), enabling consistent cross-product comparison and ROI analysis. The dashboards rely entirely on grabber data (MMPs, app stores, mediation platforms). The only exception is install count, which may optionally fall back to SDK-based AppLaunch for apps without an MMP.",{"id":5769,"title":1140,"titles":5770,"content":5771,"level":1120},"/reports-and-dashboards/daily-and-monthly-product-overview#key-features",[458,4180],"Two dashboards available:\nDaily Product Overview Dashboards – shows performance by day for the past monthMonthly Product Overview Dashboards – aggregates data by month for the past yearUnified tracking of installs, IAP revenue, subscriptions, and ad monetizationCurrency- and tax-normalized revenue for accurate financial insightsGrabber-only data pipeline (no in-game event data)Optional SDK fallback for installs if MMP is not integrated. The following section describes the available filters, dimensions, and metrics used in these dashboards.",{"id":5773,"title":4342,"titles":5774,"content":5775,"level":1104},"/reports-and-dashboards/daily-and-monthly-product-overview#filters-and-dimensions",[458],"Below is a detailed list of the primary filters and dimensions available in the dashboards. NameDescriptionApplicationThe name of the application. Multiple selections are supported.",{"id":5777,"title":4347,"titles":5778,"content":5779,"level":1104},"/reports-and-dashboards/daily-and-monthly-product-overview#metrics",[458],"Below is a detailed list of the primary metrics available in the dashboards, each accompanied by a description to clarify its meaning and calculation logic. NameDescriptionTotal InstallsMMP grabbers (Adjust or AppsFlyer, depending on the app).SDK-based AppLaunch model for apps without an MMP.See the MMP Grabber Setup Guide for details.Installs by Media SourceNumber of installs broken down by media source.Total RevenueTotal revenue, normalized using FX rates, store fees, and tax multipliers (VAT).Aggregated from:Store grabbers (Google Play, iTunes, Amazon) for purchase revenueMediation grabbers (AppLovin MAX, LevelPlay) for ad revenue.See the Ads Mediation Data guide for details.Store grabber guide – coming soon.Revenue by TypeRevenue broken down by type: in-app purchases, subscriptions, and ads.Ads MediationTotal ad revenue. Sourced from mediation grabbers (AppLovin MAX, LevelPlay).See the Ads Mediation Data guide for details.Ads Mediation by TypeAd revenue broken down by ad sources.",{"id":471,"title":470,"titles":5781,"content":5782,"level":1110},[],"This article explains the different campaign states, their impact on availability in configurations and reports, and how to manage them effectively.",{"id":5784,"title":467,"titles":5785,"content":467,"level":1110},"/campaign/campaign-status#",[],{"id":5787,"title":4180,"titles":5788,"content":5789,"level":1104},"/campaign/campaign-status#overview",[467],"A campaign status defines the current state of a campaign and determines its availability in configuration files and reports. Understanding the meaning and functionality of each status is essential for managing campaigns effectively. Below is a breakdown of all available statuses, their behavior, and practical use cases.",{"id":5791,"title":5792,"titles":5793,"content":5794,"level":1104},"/campaign/campaign-status#statuses-and-their-functions","Statuses and Their Functions",[467],"RunningDefinition: A campaign with the \"Running\" status is active and included in the configuration.Behavior:The campaign is live and will be executed based on its settings.The status can be changed to Paused or Archived.A campaign can be moved to \"Running\" only from Draft or Paused.Example: A Cross-Promo campaign that is currently displaying ads for your other applications.PausedDefinition: A campaign with the \"Paused\" status is inactive and not included in the configuration.Behavior:The campaign remains visible in the system but does not function until reactivated.The status can be changed to Running or Archived.A campaign can be moved to \"Paused\" only from Running or Draft.Example: Temporarily pausing an In-App campaign due to performance issues or seasonal adjustments.DraftDefinition: The default status when creating any new campaign. Draft campaigns are inactive and excluded from configurations.Behavior:Draft campaigns cannot be linked to active A/B tests or configurations.The status can be changed to Running, Paused, or Archived, but not back to Draft.Example: A new Interstitial campaign being configured and reviewed by the marketing team before activation.ArchivedDefinition: An archived campaign is inactive, with its elements excluded from reports and configurations.Behavior:Campaigns in Paused automatically transition to Archived after 100 days.The \"Archived\" status is permanent; it cannot revert to another status.Archived campaigns can still be used as templates for cloning new campaigns.Example: An older Rewarded Video campaign for a discontinued event archived for record-keeping purposes.",{"id":5796,"title":5797,"titles":5798,"content":5799,"level":1104},"/campaign/campaign-status#key-rules-for-managing-campaign-statuses","Key Rules for Managing Campaign Statuses",[467],"Campaigns in Running status actively impact user experiences and should be monitored closely.Use Paused status for temporary adjustments or debugging.Keep new campaigns in Draft until they are fully reviewed and ready to go live.Use Archived status to retire campaigns while preserving their data for future reference.",{"id":5801,"title":5802,"titles":5803,"content":5804,"level":1104},"/campaign/campaign-status#practical-use-cases","Practical Use Cases",[467],"Launching a Campaign:Move a campaign from Draft to Running after finalizing its configuration.Seasonal Campaigns:Use Paused to temporarily disable campaigns during off-peak times, such as after a seasonal promotion ends.Legacy Campaigns:Archive outdated campaigns to keep your dashboard clean while retaining access for cloning or analysis.",{"id":475,"title":474,"titles":5806,"content":467,"level":1110},[],{"id":5808,"title":5809,"titles":5810,"content":5811,"level":1104},"/campaign/filters-and-payment-statuses#user-statuses-overview-and-description","User Statuses: Overview and Description",[474],"The campaign configuration interface provides three filters for segmenting users: Subscription Status, In-App Status, and Paying Status. These filters help determine which users will see the campaign based on their activity and purchasing behavior.",{"id":5813,"title":5814,"titles":5815,"content":5816,"level":1104},"/campaign/filters-and-payment-statuses#_1-subscription-status","1. Subscription Status",[474],"The Subscription Status filter classifies users based on their subscription activity. Available options include: Free Users: The user has never had an active subscription (paid or trial) or has canceled it.Trial: The user currently has an active trial subscription.Paid: The user currently has an active paid subscription.Trial or Paid: The user has any active subscription, whether trial or paid.All Users: Includes all users, regardless of their subscription activity.Trial Cancelled: The trial subscription was canceled, and the user did not transition to a paid subscription.Paid Cancelled: The user canceled their paid subscription.Never Subscribed: The user has never subscribed, including trial periods. NotesUnlike in-app purchases, subscription statuses are dynamically updated by the application as the SDK does not track subscription durations, trial periods, or cancellations independently.",{"id":5818,"title":5819,"titles":5820,"content":5821,"level":1104},"/campaign/filters-and-payment-statuses#_2-in-app-status","2. In-App Status",[474],"The In-App Status filter targets users based on their activity with in-app purchases: All Users: All users, regardless of their in-app purchasing activity.Free Users: Users who have never made in-app purchases (items or subscriptions).Paying Users: Users who have made at least one in-app purchase. NotesThe In-App Status is independent of subscription activity and does not account for user subscriptions.",{"id":5823,"title":5824,"titles":5825,"content":5826,"level":1104},"/campaign/filters-and-payment-statuses#_3-paying-status","3. Paying Status",[474],"The Paying Status filter focuses on users' overall purchasing behavior, including subscriptions and in-app purchases: All Users: All users, regardless of their purchasing activity.Free: Users who have made no purchases (including subscriptions or in-app items).Paying: Users who have made at least one purchase.",{"id":5828,"title":5829,"titles":5830,"content":5831,"level":1120},"/campaign/filters-and-payment-statuses#configuring-paying-status-in-campaigns","Configuring Paying Status in Campaigns",[474,5824],"When using the Paying Status filter in a campaign, special considerations apply. If the Paying Status is set to any value other than all_users (e.g., free or paying), the Subscription Status and In-App Status must be set to all_users for the campaign to work correctly. Key Rules: NotesMisconfigured filters will result in the campaign being unsuitable for the intended audience. For example:In logs, the system might return Suitable: FALSE – on paying status.",{"id":5833,"title":5834,"titles":5835,"content":5836,"level":1104},"/campaign/filters-and-payment-statuses#general-notes-for-all-statuses","General Notes For All Statuses",[474],"Filter Combination: You can combine multiple filters for more precise campaign targeting.Filter Priority: If multiple filters are applied, the campaign will be shown only to users who meet all selected criteria.Default Settings: By default, each filter is set to All Users, covering the entire audience.Independent Filters: In-App Status and Subscription Status are separate filters. A user’s subscription activity does not influence their in-app purchase status and vice versa.Dynamic Subscription Tracking: The application must track and communicate subscription changes (e.g., transitioning from trial to paid or cancellation) to the SDK to ensure accurate targeting.",{"id":5838,"title":5839,"titles":5840,"content":5841,"level":1104},"/campaign/filters-and-payment-statuses#filters-overview-and-description","Filters: Overview and Description",[474],"Filters allow campaigns to be delivered to users based on specific product purchases. For example: Deliver Campaign A to users who purchased product_A_id for $3.99.Exclude users who have not purchased product_A_id. By combining product-specific filters, groups, and include/exclude logic, campaigns can be tailored to meet your exact needs.",{"id":5843,"title":5844,"titles":5845,"content":5846,"level":1120},"/campaign/filters-and-payment-statuses#filter-configuration-fields","Filter Configuration Fields",[474,5839],"Exclude or Include Filters",{"id":5848,"title":5849,"titles":5850,"content":5851,"level":1120},"/campaign/filters-and-payment-statuses#group-configuration","Group Configuration",[474,5839],"Filters can group multiple product IDs: Include Group If Any Purchased: Deliver campaigns to users who purchased any product within the group.Include Group If All Purchased: Deliver campaigns to users who purchased all products in the group.Exclude Group If Any Purchased: Exclude users who purchased any product within the group.Exclude Group If All Purchased: Exclude users who purchased all products in the group. Steps to Create Groups: Create a group and add the desired product IDs.Select the group in the appropriate filter field (e.g., Include group if any purchased).Editing the group will dynamically update the context for all campaigns using the group. For more advanced configurations, refer to the related article: Native Elements Group (add link).",{"id":5853,"title":5854,"titles":5855,"content":5856,"level":1120},"/campaign/filters-and-payment-statuses#example-filter-logic-in-action","Example: Filter Logic in Action",[474,5839],"Include Group If Any Purchased: A user who purchased any product in the group qualifies for the campaign.Exclude Group If Any Purchased: A user who purchased any product in the group is excluded from the campaign.Combine Include and Exclude: Campaign logic can include and exclude specific users simultaneously.",{"id":5858,"title":5859,"titles":5860,"content":5861,"level":1120},"/campaign/filters-and-payment-statuses#sdk-dynamic-behavior","SDK Dynamic Behavior",[474,5839],"Campaign filters are processed dynamically, ensuring real-time targeting based on user activity. Unlike segmentation, filters are evaluated client-side, allowing immediate application without requiring a config refresh. Key Points: Campaigns dynamically adapt to user actions, such as purchasing a product.No need to restart the application to apply new filters.",{"id":5863,"title":5864,"titles":5865,"content":5866,"level":1104},"/campaign/filters-and-payment-statuses#filter-use-cases-for-campaigns","Filter Use Cases for Campaigns",[474],"Below are detailed scenarios illustrating how filters operate under different configurations. This includes examples with various combinations of product inclusions and exclusions. The results demonstrate whether the campaign is shown or not based on the filters settings.",{"id":5868,"title":5869,"titles":5870,"content":5871,"level":1120},"/campaign/filters-and-payment-statuses#in-app-status-paying-users","In-App Status: Paying Users",[474,5864],"Filter ConfigurationUser Purchase StatusCampaign OutcomeInclude if all purchased: product_A_idExclude if all purchased: product_B_idNo product IDs purchased.Campaign does not show.Include if all purchased: product_A_idExclude if all purchased: product_B_idPurchased product_A_idCampaign shows.Include if all purchased: product_A_idExclude if all purchased: product_B_1Purchased product_A_id and product_B_1Campaign does not show.Include if all purchased: product_A_idExclude if all purchased: product_B_id, product_C_idPurchased product_A_id and product_C_id.Campaign shows.Include if all purchased: product_A_idExclude if all purchased: product_B_id, product_C_idPurchased product_A_id,product_B_id, andproduct_C_idCampaign does not show.Include if all purchased: product_A_id, product_B_idExclude if all purchased: product_C_idPurchased product_A_idCampaign does not show.Include if all purchased: product_A_id, product_B_idExclude if all purchased: product_C_idPurchased product_A_id, product_B_idCampaign shows.Include if all purchased: product_A_id, product_B_idExclude if all purchased: product_C_idPurchased product_A_id, product_B_id, and product_C_idCampaign does not show.Include if all purchased: Nothing is specified.Exclude if all purchased: product_A_idPurchased product_B_idCampaign shows.Include if any purchased: product_A_idExclude if any purchased: product_B_idPurchased product_A_idCampaign shows.Include if any purchased: product_A_idExclude if any purchased: product_B_idPurchased product_A_id , product_B_idCampaign does not show.Include if any purchased: product_A_idExclude if any purchased: product_B_id, product_C_idPurchased product_A_id , product_C_idCampaign does not show.Include if any purchased: product_A_id, product_C_idExclude if any purchased: product_B_idPurchased product_A_idCampaign shows.Include if any purchased: product_A_id, product_C_idExclude if any purchased: Nothing is specified.Purchased product_A_id, product_C_id, product_D_id, andproduct_E_idCampaign shows.Include if any purchased: Nothing is specified.Exclude if any purchased: product_A_idPurchasedproduct_D_idCampaign shows.Include if all purchased: product_A_id,product_C_idExclude if any purchased: product_B_id,product_D_idPurchasedproduct_A_id,product_C_idCampaign shows.Include if all purchased: product_A_id,product_C_idExclude if any purchased: product_B_id,product_D_idPurchasedproduct_A_id,product_C_id, and product_B_idCampaign does not show.Include if any purchased: product_A_id,product_C_idExclude if all purchased: product_B_id,product_D_idPurchasedproduct_A_idCampaign does not show.Include if any purchased: product_A_id,product_C_idExclude if all purchased: product_B_id,product_D_idPurchasedproduct_A_id, product_B_idCampaign shows.Include if any purchased: product_A_id,product_C_idExclude if all purchased: product_B_id,product_D_idPurchasedproduct_A_id, product_B_id, andproduct_D_idCampaign does not show.Include if all purchased: product_A_idExclude if all purchased: product_B_idInclude if any purchased: product_C_idExclude if any purchased: product_D_idPurchasedproduct_A_idCampaign does not show.Include if all purchased: product_A_idExclude if all purchased: product_B_idInclude if any purchased: product_C_idExclude if any purchased: product_D_idPurchasedproduct_A_id and product_C_idCampaign shows.Include if all purchased: product_A_idExclude if all purchased: product_B_idInclude if any purchased: product_C_idExclude if any purchased: product_D_idPurchasedproduct_A_id, product_C_id, and product_D_idCampaign does not show.",{"id":5873,"title":5874,"titles":5875,"content":5876,"level":1120},"/campaign/filters-and-payment-statuses#in-app-status-all-users","In-App Status: All Users",[474,5864],"Filter ConfigurationUser Purchase StatusCampaign OutcomeInclude if all purchased: Nothing is specified.Exclude if all purchased: product_A_idNothing Purchased.Campaign shows.Include if any purchased: Nothing is specified.Exclude if any purchased: product_A_idNothing Purchased.Campaign shows.",{"id":5878,"title":5879,"titles":5880,"content":5881,"level":1104},"/campaign/filters-and-payment-statuses#campaign-inclusion-in-configurations","Campaign Inclusion in Configurations",[474],"Campaigns are included in the configuration based on the user's segment, while filtering by status and campaign filters occurs directly on the client side. As a result, all campaigns matching the user's segmentation are delivered in the configuration, but the specific campaign displayed to the user is determined client-side. Example: For global audiences, there are three campaigns: Free users: Excludes the \"No Ads\" product group.Paying users: Excludes the \"No Ads\" product group.Paying users: Includes the \"No Ads\" product group. A user from the United States receives all three campaigns in their configuration. Upon receiving the config for the first time, the user is in the free status and only sees the campaign for free users. Campaigns for paying users are excluded based on their in-app status. If the user purchases the \"No Ads\" product, they immediately see the campaign for paying users with the \"No Ads\" inclusion, while other campaigns are excluded due to their status. Campaign updates occur instantly since the campaigns are already present in the configuration. Important Note: If segmentation is based on user attributes such as free/paying status or purchases (defined in the segment rather than campaign filters or statuses), additional time may be required for campaigns to appear. This happens because information about purchases must reach the server to update the configuration and deliver relevant campaigns. Example Scenario: In-App status, Subscription Status, Paying Status: All UsersCampaign filters: NoneSegmentation: Users with ≥2 purchases The campaign will only become available after the second purchase is processed by the server. This update may occur immediately or with a delay of up to 5 minutes, as the segment condition (≥2 purchases) wasn't met at the time of the initial configuration. Until then, the user will receive campaigns applicable to their campaign status, not their segment condition.",{"id":463,"title":467,"titles":5883,"content":467,"level":1110},[],{"id":5885,"title":5886,"titles":5887,"content":5888,"level":1104},"/campaign#campaigns-overview-and-essential-concepts","Campaigns: Overview and Essential Concepts",[467],"A campaign is a mechanism used to display offers or third-party ads within your application. It serves as a core element of the Magify SDK, allowing you to dynamically engage users based on specific in-app events or conditions. To use campaigns, you need to fully integrate the Magify SDK.",{"id":5890,"title":5891,"titles":5892,"content":5893,"level":1104},"/campaign#campaign-processing-the-core-of-the-sdk","Campaign Processing: The Core of the SDK",[467],"Campaign processing is a fundamental feature of the Magify SDK. For it to function properly, you must configure and initialize the Magify Service to support advanced features such as subscriptions, purchases, and dynamic configuration. Key points about campaign processing: Campaigns are tied to predefined in-app events.When an event triggers, the SDK processes any associated campaigns using asynchronous methods.Campaign execution time depends on its complexity, ranging from instantaneous to several minutes for more advanced configurations. For more details on how campaigns and the SDK work together, refer to the Campaigns section.",{"id":5895,"title":5896,"titles":5897,"content":5898,"level":1120},"/campaign#defining-a-campaign","Defining a Campaign",[467,5891],"A campaign acts as a handler for application events, triggering specific actions such as showing ads, delivering rewards, or tailoring user interactions. Example Workflow: Event: session_start (The start of a new user session in the game)Campaign Action: Display an In-app Campaign with predefined parameters and creative, allowing the user to purchase the offer and receive a reward. Campaigns are event-driven. When an event occurs, the SDK determines if a relevant campaign is available. If no campaign matches the event, the process ends immediately. If a campaign exists, its logic is executed, with the duration varying depending on the campaign’s complexity.",{"id":5900,"title":5901,"titles":5902,"content":5903,"level":1104},"/campaign#steps-to-set-up-a-campaign","Steps to Set Up a Campaign",[467],"General Process: Access Configuration > Remote Config > Campaign in the admin panel.Click Create New to initialize a campaign.Define the following settings:\nName: Provide a descriptive name for the campaign.Application: Select the app where the campaign will run.Type: Specify the type of campaign (e.g., rewarded ad, interstitial ad, in-app purchase, or other campaign types). The available settings will depend on the selected type.Description: Optionally, provide additional information about the campaign or include a link to the task related to its creation.Priority: Assign a priority level to the campaign. Higher priorities ensure the campaign is prioritized if multiple campaigns are eligible for the same event.Status: Set the campaign status (e.g., active or paused). Read more about this statuses in the Campaign Statuses article.User Conditions: Configure conditions for targeting users, such as:\nSubscription status.In-App StatusPaying StatusRead more about this statuses in the Filters and Payment Statuses article.Segmentation: Select the user segment that determines the campaign’s audience.Placement or Event: Specify the placement or in-app event that triggers the campaign, along with any required numbering.Additional fields for configuring a campaign will appear after selecting the campaign type. Each campaign type has its own unique settings and configuration fields.",{"id":5905,"title":5906,"titles":5907,"content":5908,"level":1104},"/campaign#key-components-of-campaigns","Key Components of Campaigns",[467],"A campaign consists of several essential components, each contributing to its functionality within your application. Campaigns can include configuration data, creative elements, and products. The specific components and their configuration depend on the campaign's goals and type. Below is an overview of these key components, along with links to related articles for further details. 1. Campaign Data Campaigns are built on a foundation of configuration data, which defines their type, triggering conditions, and behavior. This data serves as the structural backbone, ensuring the campaign functions as intended. 2. Creatives Creatives are the visual assets or interfaces displayed to users during the campaign. These may include: Images configured in the admin panel.Custom popups defined within your application.Dynamic assets, such as downloadable bundles. Each creative type serves different purposes, from presenting offers to delivering user experiences. For more details, see the Creatives article. 3. Products Products represent the rewards or items delivered to users upon completing a campaign. They are the core incentive for user interaction and can include: In-app items (e.g., coins, hints).Subscriptions.Bonuses or rewards.External or internal links with rewards. Products are configured and managed through the admin panel and linked to campaigns based on the desired outcome. For more details, see the Product ID article.",{"id":5910,"title":5911,"titles":5912,"content":5913,"level":1104},"/campaign#customization-based-on-campaign-type","Customization Based on Campaign Type",[467],"Each campaign type (e.g., Interstitial, Rewarded Video, or In-App Purchase) uses a tailored combination of these components. The flexibility in defining these elements allows campaigns to align closely with your business goals and user engagement strategies. For a detailed understanding of campaign types, refer to the campaign type sections below.",{"id":5915,"title":5916,"titles":5917,"content":5918,"level":1104},"/campaign#campaign-types","Campaign Types",[467],"Banner Campaign Displays banner ads within the application.Bonus Campaign: Provides users with free rewards or bonuses.Bonus LTO Campaign: Offers limited-time bonuses to encourage engagement.Cross-Promo Campaign: Promotes other applications within your portfolio.Cross-Promo LTO Campaign: Highlights cross-promotions for a limited time.Empty Campaign: Placeholder campaigns with no specific action or creative.External Campaign: Redirects users to external links, such as websites or app stores.External LTO Campaign: Limited-time offers tied to external links.In-App Campaign: Promotes in-app purchases with predefined rewards.In-App LTO Campaign: Limited-time offers for in-app purchases.Interstitial Campaign: Shows full-screen ads between app interactions or levels.Mixed Campaign: Combines elements of multiple campaign types.Mixed LTO Campaign: Offers a limited-time combination of various campaign types.Rate And Review Campaign: Encourages users to rate and review your application.Rewarded Video Campaign: Displays videos that reward users upon completion.Rewarded Video LTO Campaign: Offers limited-time rewarded video ads.Subscription Campaign: Promotes subscription-based services.Subscription LTO Campaign: Highlights limited-time subscription offers.",{"id":5920,"title":5921,"titles":5922,"content":5923,"level":1104},"/campaign#ab-test-campaign-types","A/B Test Campaign Types",[467],"All the listed campaign types also have A/B test variations, meaning they can participate in A/B testing scenarios. For example, if a regular subscription campaign has the type Subscription Campaign, its A/B test variation is designated as Subscription A/B Test Campaign. Banner A/B Test CampaignBonus A/B Test CampaignBonus LTO A/B Test CampaignCross-Promo A/B Test CampaignCross-Promo LTO A/B Test CampaignExternal A/B Test CampaignExternal LTO A/B Test CampaignIn-App A/B Test CampaignIn-App LTO A/B Test CampaignInterstitial A/B Test CampaignMixed A/B Test CampaignMixed LTO A/B Test CampaignRate And Review A/B Test CampaignRewarded Video LTO A/B Test CampaignRewarded Video A/B Test CampaignSubscription A/B Test CampaignSubscription LTO A/B Test Campaign For more details, see A/B Test article.",{"id":479,"title":478,"titles":5925,"content":5926,"level":1110},[],"The Campaign Priority article explains how priority levels determine the execution order of campaigns and how to configure them for optimal delivery.",{"id":5928,"title":467,"titles":5929,"content":467,"level":1110},"/campaign/campaign-priority#",[],{"id":5931,"title":4180,"titles":5932,"content":5933,"level":1104},"/campaign/campaign-priority#overview",[467],"Campaign priority determines the execution order when multiple campaigns are set to trigger on the same event. The SDK processes the configuration from top to bottom, ensuring that higher-priority campaigns (those listed earlier) are executed first, while lower-priority ones are only considered if higher-priority campaigns do not meet all required conditions. Properly configuring campaign priority ensures that: ✔ The most relevant campaigns are triggered first. ✔ Lower-priority campaigns serve as fallback options. ✔ Campaign execution follows a structured and predictable order.",{"id":5935,"title":5936,"titles":5937,"content":5938,"level":1120},"/campaign/campaign-priority#priority-value-range","Priority Value Range",[467,4180],"1 – The lowest priority.2,500,000 – The highest priority. By setting campaign priorities correctly, you can optimize the delivery sequence and ensure that campaigns are executed based on their importance and relevance.",{"id":5940,"title":5941,"titles":5942,"content":5943,"level":1104},"/campaign/campaign-priority#how-campaign-priority-works","How Campaign Priority Works",[467],"Different Priorities with the Same Conditions When multiple campaigns have the same targeting conditions but different priorities, the SDK selects the campaign with the highest priority and stops processing further. Example:You have three campaigns with no restrictions on impressions:CampaignEventPriorityCampaign 1Event 13Campaign 2Event 22Campaign 3Event 11The configuration order in the SDK will be:Campaign 1 (Event 1)Campaign 3 (Event 2)Campaign 2 (Event 1)Execution Flow:✅ Event 1 triggers → SDK processes the config:Campaign 1 matches → It is served.SDK stops searching for other campaigns (Campaign 2 is ignored).Campaign 3 is skipped as it does not match Event 1.✅ Event 2 triggers → SDK processes the config:Campaign 1 does not match (wrong event).Campaign 3 matches → It is served.SDK stops searching further.",{"id":5945,"title":5946,"titles":5947,"content":5948,"level":1120},"/campaign/campaign-priority#same-priorities-with-the-same-conditions","Same Priorities with the Same Conditions",[467,5941],"If multiple campaigns have the same priority and conditions, they are positioned randomly in the configuration but will trigger equally over time. Example:If Campaign 1 and Campaign 2 have the same priority and are set for the same event, they will randomly appear in one of two configurations:✔ 50% of the time:Campaign 1 firstCampaign 2 second✔ 50% of the time:Campaign 2 firstCampaign 1 secondThus, both campaigns will be served an equal number of times in the long run.",{"id":5950,"title":5951,"titles":5952,"content":5953,"level":1120},"/campaign/campaign-priority#different-priorities-with-different-conditions","Different Priorities with Different Conditions",[467,5941],"When campaigns have both different priorities and different conditions, the SDK will evaluate conditions first and then prioritize execution accordingly. Example:You want Campaign 1 to be served on the first trigger of Event 1 but Campaign 2 to be served only on the 5th trigger of Event 1 globally.CampaignEvent ConditionPriorityCampaign 1Event 1 (1/1 global)1Campaign 2Event 1 (5th occurrence globally)2Configuration Order:Campaign 2Campaign 1Execution Flow:✅ Event 3 triggers globally:Campaign 2 is skipped (not the 5th trigger yet).Campaign 1 matches → It is served.✅ Event 5 triggers globally:Campaign 2 matches (it was set for the 5th occurrence).SDK stops searching, and Campaign 1 is ignored for this trigger.",{"id":5955,"title":5956,"titles":5957,"content":5958,"level":1120},"/campaign/campaign-priority#priority-and-limits","Priority and Limits",[467,5941],"The same logic applies to campaigns with limits. If a limited campaign has a higher priority, it will be served until its limit is reached.Once the limit is exhausted, the SDK will switch to lower-priority unlimited campaigns.",{"id":5960,"title":5961,"titles":5962,"content":5963,"level":1120},"/campaign/campaign-priority#priority-across-different-campaign-types","Priority Across Different Campaign Types",[467,5941],"The campaign type does not affect priority.If both an Interstitial Campaign and an In-App Campaign are set for the same trigger, the SDK will select the one with the highest priority.",{"id":5965,"title":5966,"titles":5967,"content":5968,"level":1120},"/campaign/campaign-priority#lto-campaigns-and-priority-considerations","LTO Campaigns and Priority Considerations",[467,5941],"All LTO (Limited-Time Offers) campaigns triggered by a trigger (without display) rather than an event follow a separate logic. For more details, refer to the LTO Campaigns article.",{"id":5970,"title":5971,"titles":5972,"content":5973,"level":1120},"/campaign/campaign-priority#summary-of-priority-execution-in-sdk","Summary of Priority Execution in SDK",[467,5941],"✔ Higher-priority campaigns execute first when multiple campaigns match the same conditions. ✔ Equal-priority campaigns execute randomly but evenly over time. ✔ Different conditions override priority — triggers must match first. ✔ Limits affect execution — higher-priority campaigns with limits will be served first until exhausted. ✔ Campaign type does not influence priority — only configuration order matters. By properly setting campaign priorities, you ensure the correct campaigns are shown at the right time, improving user experience and campaign efficiency.",{"id":483,"title":482,"titles":5975,"content":5976,"level":1110},[],"This article explains how to configure and manage banner campaigns",{"id":5978,"title":467,"titles":5979,"content":467,"level":1110},"/campaign/banner-campaign#",[],{"id":5981,"title":4180,"titles":5982,"content":5983,"level":1104},"/campaign/banner-campaign#overview",[467],"A Banner Campaign is a type of campaign designed to display a banner ad at the top or bottom of the game screen. Banners are a form of ad monetization, allowing developers to generate revenue through persistent, non-intrusive advertising placements.",{"id":5985,"title":5986,"titles":5987,"content":5988,"level":1120},"/campaign/banner-campaign#types-of-banner-campaigns","Types of Banner Campaigns",[467,4180],"Banner Campaign – Standard banner display campaign.Banner A/B Test Campaign – A campaign designed for A/B testing different banner configurations.",{"id":5990,"title":5991,"titles":5992,"content":5993,"level":1104},"/campaign/banner-campaign#creating-a-new-banner-campaign","Creating a New Banner Campaign",[467],"To create a new Banner Campaign, navigate to: Configurations > Campaigns > Create New In the campaign setup window: Select the ApplicationSet the Campaign Type to Banner CampaignFill in the required fields",{"id":5995,"title":5996,"titles":5997,"content":5998,"level":1120},"/campaign/banner-campaign#main-fields-to-configure","Main Fields to Configure",[467,5991],"1. Campaign Name Follow best practices for naming conventions. For more details, refer to Naming Recommendations article. 2. Campaign Priority Leave the default value as 1.For more details on priority settings, see Campaign Priority article. 3. Subscription Status & In-App Status Define whether the campaign targets users with or without a subscription or previous in-app purchases.Read more in Filters and Payment Statuses article. 4. Filters Exclude non-consumable products or product groups that remove ads upon purchase.Learn more about this settings in Filters and Payment Statuses article. Filtering, Exclusion Rules, and StatusesBanner campaigns support filters and exclusion rules to prevent banners from displaying to users who:❌ Have an active subscription that removes ads.❌ Have purchased a non-consumable product that permanently disables ads.Example Campaign SettingsSetting Behavior Subscription Status = Free – The banner will only be displayed to users who do not have an active subscription.Non-Consumable Product Exclusion – The campaign excludes users who have purchased non-consumable products that disable ads.Final Campaign Behavior✔ The banner will be displayed only to users who:Do not have an active subscription (Subscription Status = Free).Have not purchased a non-consumable product that disables ads (Exclude if any / Exclude group if any).✔ In-App Status (FREE or PAYING) does not affect banner placements, as placements are independent of the user's purchase status.",{"id":6000,"title":467,"titles":6001,"content":6002,"level":4579},"/campaign/banner-campaign#_1",[467,5991,5996],"5. Segmentation Define the user segment for the campaign.Read more in Segmentation article. 6. Banner Position Determines where the banner will be displayed:\nBottom – Displays the banner at the bottom of the screen.Top – Displays the banner at the top of the screen.Before configuring, verify with the development team which positions are supported in the UI.If the UI only allows bottom placement, selecting Top will have no effect.A/B Testing: If testing Bottom vs. Top, ensure the game client supports both positions. 7. Placement Defines where third-party banners appear in the application (top or bottom of the screen).To configure a placement:\nCreate a native element with the banner placement type in the application.Once set up, select the placement in the campaign settings by tapping the Placements field. Important ConsiderationsPlacements do not have counters or parameters.To learn how to set up a placement, refer to Native Elements article. 8. After configuring all fields, save the campaign.",{"id":6004,"title":6005,"titles":6006,"content":6007,"level":1104},"/campaign/banner-campaign#example-of-a-configured-banner-campaign","Example of a Configured Banner Campaign",[467],"You can view an example of a configured banner campaign here, using the Demo application as a reference.",{"id":6009,"title":6010,"titles":6011,"content":6012,"level":1104},"/campaign/banner-campaign#key-features-of-banner-campaigns","Key Features of Banner Campaigns",[467],"Although banner campaigns include a Priority field, it does not require configuration. The default value of 1 can remain unchanged.Banner campaigns do not contain creatives or events.The most critical fields for configuring a banner campaign are Placements and Banner Position.",{"id":6014,"title":6015,"titles":6016,"content":6017,"level":1104},"/campaign/banner-campaign#behavior-in-default-configurations","Behavior in Default Configurations",[467],"If a banner campaign is linked to a placement and included in the default configuration, disabling the campaign in the current configuration will not stop the banner from appearing.The SDK will still fetch it from the default configuration unless explicitly removed.",{"id":6019,"title":6020,"titles":6021,"content":6022,"level":1120},"/campaign/banner-campaign#how-to-fully-disable-a-banner-campaign","How to Fully Disable a Banner Campaign",[467,6015],"To prevent the banner from displaying when the campaign is disabled: Remove the campaign from the default configuration by disabling the \"Is Default\" flag in the Extension section within the campaign settings.",{"id":6024,"title":6025,"titles":6026,"content":6027,"level":1120},"/campaign/banner-campaign#ab-testing-and-feature-flag-implementation","A/B Testing and Feature Flag Implementation",[467,6015],"For controlled banner testing and rollout: Use a feature to dynamically enable or disable the banner campaign without modifying configurations.For A/B testing different banner configurations, ensure the game client supports both placement options and that test groups are properly defined. For more details, refer to the Features article.",{"id":487,"title":486,"titles":6029,"content":6030,"level":1110},[],"Documentation for Magify Unity SDK Here you can find documentation for Magify Unity SDK: IntroductionInstallationConfigurationAnalyticsPurchasesAdvertisementAppFeaturesCampaignsCustomizationMagify ManagerInternal SDK LifecycleAPI Collection",{"id":493,"title":492,"titles":6032,"content":6033,"level":1110},[],"Introduction info into Magify Unity SDK The Magify Unity SDK enables you to track analytics, validate purchases, restore user progress, provode remote features and content, configure offers, and more in your Unity app.",{"id":6035,"title":6036,"titles":6037,"content":6038,"level":1104},"/unity-sdk/introduction#before-you-begin","Before you begin",[492],"Here's what you need to know before you get started:",{"id":6040,"title":6041,"titles":6042,"content":6043,"level":1120},"/unity-sdk/introduction#magify-manager-and-magify-service","Magify Manager and Magify Service",[492,6036],"Magify SDK actually consists of 2 layers: Magify Manager and Magify Service: Magify Manager is a low-level API that provides direct access to various data and methods that are a minimal unit of SDK logic;Magify Service is a kit of different entities and services that are wrappers over Magify Manager. They are basic implementations of the game elements as we see them. For example:\nAn advertising service responsible for integration with advertising mediators, as well as implementing methods for displaying ads and tracking analytics related to advertising;A purchasing service responsible for uploading products and initiating purchases, as well as tracking analytics related to purchases;A campaign processing service responsible for launching campaigns, displaying creatives and charging campaign products. It is also responsible for tracking analytics related to campaigns. Depending on what stage your application is at and how low-level you want to interact with our API you can choose one of these two levels to work with the SDK.",{"id":6045,"title":6046,"titles":6047,"content":6048,"level":1120},"/unity-sdk/introduction#recommendations-for-choosing-between-magify-manager-and-magify-service","Recommendations for choosing between Magify Manager and Magify Service",[492,6036],"We highly recommend opting for Magify Service, and most likely this option will suit your project better. The criteria you can use to see which option is best for you are described below. Choose Magify Manager if: Your app already has a big infrastructure in place to handle different ad mediators, purchasing libraries, and you don't want to use our services to interact with it, you just want to do tracking analytics related to that;You realize that in this case all the responsibility for collecting analytics, for proper processing of campaigns is on your side. Choose Magify Service if: You want to get as many ready-made implementations of different game features as possible using our SDK;You want to have access to all of our default implementations of integration with ad mediation, purchasing services, which includes initiating ad impressions, fetching products for purchase, initiating purchases, errors handling, and correct collecting of analytics;You want to have a set of standard campaign handlers and also be able to implement custom handlers;You want to have access to various auxiliary services: checking network status, getting real server time, updating subscription status, ads preloading, popups system, and others;You don't want to be responsible for collecting analytics correctly, you just want to receive app content in a usable form. That these two layers of integration do not contradict each other, for example, when using Magify Service, if you need to extend the logic provided out of the box, make custom handling of some situations, or address some low-level API, you can always turn to Magify Manager. An analogy can be made that working with Magify Manager is similar to working with unsafe code: most situations can be handled without, but if you need to implement very specific logic, there is nothing stopping you from combining both approaches. Since our preferred use case for our SDK is to work through the Magify Service, the most of the documentation describes interaction with this layer.\nHowever, if you decided that you don't need this logic and you want to work directly with the Magify anager's low-level APIs, you should skip to the appropriate section.",{"id":497,"title":496,"titles":6050,"content":6051,"level":1110},[],"Description of the Unity SDK installation process",{"id":6053,"title":6054,"titles":6055,"content":6056,"level":1104},"/unity-sdk/installation#requirements","Requirements",[496],"Minimal Unity version: 2021 starting from patch 2021.3.45f2 2022 is supported starting with patch 2022.3.62f2 2023 is supported starting with patch 2023.2.22f1 6000 is supported starting with patch 6000.0.58f2 (however, we strongly recommend using the current LTS version) We had to significantly reduce the number of supported versions due to a vulnerability discovered in older Unity versions read more.",{"id":6058,"title":6059,"titles":6060,"content":6061,"level":1104},"/unity-sdk/installation#downloading","Downloading",[496],"Download the Latest Release: To get started with the Magify SDK, you'll need to download the latest release from our releases page. The SDK packages will be available now as a .zip archive. We are working to improve your experience with the SDK installation and will keep you informed of future changes.",{"id":6063,"title":6064,"titles":6065,"content":6066,"level":1104},"/unity-sdk/installation#import","Import",[496],"Place the SDK Files in the Packages Folder: Once you've downloaded, unzip archive and take com.magify.unity-sdk-4.3.1.tgz and com.magify.unity-sdk-service-4.3.1.tgz files, move them to the Packages directory within your Unity project. The packages should be at the same level as your manifest.json file. You can read about adding packages as local tarball files here: Unity - Manual: Install a UPM package from a local tarball file.:bannerYou can also change the name of the files and remove the version in the names so that you don't have to modify manifest.json file later.Adding to the Manifest: After placing the sdk files in the Packages folder, you'll need to add them to the manifest.json file. Open the manifest.json in your project and locate the \"dependencies\" section. Add entries for the Magify SDK. Here's an example of how it should look: \"dependencies\": {\n    ...\n    \"com.magify.unity-sdk\": \"file:com.magify.unity-sdk-4.3.1.tgz\",\n    \"com.magify.unity-sdk-service\": \"file:com.magify.unity-sdk-service-4.3.1.tgz\",\n    ...\n    // or without version (if you'd renamed files):\n    ...\n    \"com.magify.unity-sdk\": \"file:com.magify.unity-sdk.tgz\",\n    \"com.magify.unity-sdk-service\": \"file:com.magify.unity-sdk-service.tgz\",\n    ...\n} Save and Refresh: Save the manifest.json file, and Unity will automatically detect and import the Magify SDK from the specified file. You may need to refresh your project for the changes to take effect. We try to make our SDK flexible and easy to use. The full version of the SDK provides very extensive tools for customizing client logic, but sometimes games need to do something specific that our SDK can't do out of the box. That's why we decided to split the SDK into 2 components: com.magify.unity-sdk contains the core API that allows for “low level” manipulation of the runtime logic.com.magify.unity-sdk-service, at the same time, implements a user-friendly and scalable Service, where all SDK features are presented in the most user-friendly way. We built it from experience and needs over the history of working with the SDK.",{"id":6068,"title":6069,"titles":6070,"content":6071,"level":1104},"/unity-sdk/installation#assembly-definitions-linking","Assembly definitions linking",[496],"You can skip this step if you don’t use AssemblyDefinition for your application scripts. If you use AssemblyDefinition files for your project, you have to add references to Magify SDK: MagifyMagify.CoreMagify.Service At the same time about Assembly definitions: Magify provides access to the MagifyManager key class for “low-level” work with the SDK.Magify.Service provides access to a convenient and scalable Service that.Magify.Core provides the type system that is necessary for interfacing the previous two parts of the SDK, and can also be used by you to implement custom logic.",{"id":6073,"title":6074,"titles":6075,"content":6076,"level":1104},"/unity-sdk/installation#dependencies","Dependencies",[496],"By now, you are most likely seeing a lot of errors in the Unity console. The most likely cause is a lack of necessary dependencies. So you need to install some packages that our SDK relies on.",{"id":6078,"title":6079,"titles":6080,"content":6081,"level":1120},"/unity-sdk/installation#automatically","Automatically",[496,6074],"You can use our tool to automatically install dependencies. You can find it at Menu Item: Magify/Dependencies Installer. Usually, after installing the Magify SDK package, this window will automatically appear if the required dependencies are not found. In this window: You can select installation method, or deselect package;You can read more about package and find manual installation instructions;Installed packages will be marked as 'Instlled';When you have selected the packages to install, click the \"Install Selected\" button;",{"id":6083,"title":6084,"titles":6085,"content":6086,"level":1120},"/unity-sdk/installation#manually","Manually",[496,6074],"You can install these dependencies using any available methods provided by the respective packages. Here is a full list with links to their documentations: DependencyLinkExternal Dependency ManagerGoogle for DevelopersUniRxGitHubUniTaskGibHub",{"id":6088,"title":6089,"titles":6090,"content":6091,"level":1104},"/unity-sdk/installation#resolve-external-dependencies","Resolve external dependencies",[496],"Resolve dependencies by using The External Dependency Manager for Unity. Execute: Assets ➞ External Dependency Manager ➞ Android Resolver ➞ Force Resolve",{"id":6093,"title":6094,"titles":6095,"content":6096,"level":1104},"/unity-sdk/installation#next-step","Next step",[496],"Now you are ready to move on to configuring and initializing the SDK. To do this, you can go to the next page. html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":503,"title":502,"titles":6098,"content":6099,"level":1110},[],"List of releases and changes",{"id":6101,"title":6102,"titles":6103,"content":467,"level":1104},"/unity-sdk/installation/releases#releases-46","Releases 4.6:",[502],{"id":6105,"title":6106,"titles":6107,"content":6108,"level":1120},"/unity-sdk/installation/releases#_468","4.6.8",[502,6102],"Download release package What changed Commission fields added for TrustedPurchaseRecord;Removed unnecessary unsupported stores from PurchaseStore;Fixed context requests after TweakEnvironment().",{"id":6110,"title":6111,"titles":6112,"content":6113,"level":1120},"/unity-sdk/installation/releases#_467","4.6.7",[502,6102],"Download release package What changed Fixed cancellation of authorization token requests.",{"id":6115,"title":6116,"titles":6117,"content":6118,"level":1120},"/unity-sdk/installation/releases#_466","4.6.6",[502,6102],"Download release package What changed Sandbox environment support.",{"id":6120,"title":6121,"titles":6122,"content":6123,"level":1120},"/unity-sdk/installation/releases#_465","4.6.5",[502,6102],"Download release package What changed Added OperationCanceledException during user authorization when requested.",{"id":6125,"title":6126,"titles":6127,"content":6128,"level":1120},"/unity-sdk/installation/releases#_464","4.6.4",[502,6102],"Download release package What changed Exceptions when fetching GAID are converted to LogWarning.",{"id":6130,"title":6131,"titles":6132,"content":6133,"level":1120},"/unity-sdk/installation/releases#_463","4.6.3",[502,6102],"Download release package What changed Added public property MagifyManager.CommonClientId.",{"id":6135,"title":6136,"titles":6137,"content":6138,"level":1120},"/unity-sdk/installation/releases#_462","4.6.2",[502,6102],"Download release package What changed Cleared some parameters for in-app tracking and added xml documentation;Added public method MagifyManager.IsApplicationInstalled().",{"id":6140,"title":6141,"titles":6142,"content":6143,"level":1120},"/unity-sdk/installation/releases#_461","4.6.1",[502,6102],"Download release package What changed Support of Aghanim web store;Added UPM as a source of External dependency manager dependency;Made improvement to be more likely to be able to send a request to save progress when app is going to the background;Renamed sync-state and social-auth related API.",{"id":6145,"title":6146,"titles":6147,"content":6148,"level":1120},"/unity-sdk/installation/releases#_460","4.6.0",[502,6102],"Download release package What changed Added full Unity 6 support.",{"id":6150,"title":6151,"titles":6152,"content":6153,"level":1120},"/unity-sdk/installation/releases#_461-alpha-deprecated","4.6.1 Alpha Deprecated",[502,6102],"What changed Added more protection of native android library code from stripping. Be careful when using this release: it's not fully tested and may contain critical bugs.",{"id":6155,"title":6156,"titles":6157,"content":6158,"level":1120},"/unity-sdk/installation/releases#_460-alpha-deprecated","4.6.0 Alpha Deprecated",[502,6102],"What changed Added experimental Unity 6 support for Android platform only. Be careful when using this release: it's not fully tested and may contain critical bugs.",{"id":6160,"title":6161,"titles":6162,"content":467,"level":1104},"/unity-sdk/installation/releases#releases-45","Releases 4.5:",[502],{"id":6164,"title":6165,"titles":6166,"content":6167,"level":1120},"/unity-sdk/installation/releases#_457","4.5.7",[502,6161],"Download release package What changed Added opportunity for to set custom Client ID based on any not empty string;Made TrustedPurchaseRecord.StoreFront an optional parameter.",{"id":6169,"title":6170,"titles":6171,"content":6172,"level":1120},"/unity-sdk/installation/releases#_456","4.5.6",[502,6161],"Download release package What changed Allowed to use CustomAndroidId, CustomBuildNumber and CustomAppVersion in UnityEditor (with UNITY_EDITOR define active).",{"id":6174,"title":6175,"titles":6176,"content":6177,"level":1120},"/unity-sdk/installation/releases#_455","4.5.5",[502,6161],"Download release package What changed Added MAGIFY_DEBUG define symbols, that allows to use CustomAndroidId, CustomBuildNumber and CustomAppVersion (or MagifyDebugConfig for MagifyManager integration).",{"id":6179,"title":6180,"titles":6181,"content":6182,"level":1120},"/unity-sdk/installation/releases#_454","4.5.4",[502,6161],"Download release package What changed Added opportunity to set custom application version on SDK initialization (read more);Added API to make SDK ignore some features from different source (default\\current config);Added UsedApplicationDefaultFeatures event for tracking of features, that user got from the default config;Added Client-Timezone header for web-requests to determine the client's time zone and provide better segmentation;Added handling of exceptions thrown during native SetLastAccessTime() methods invocation;Added NullReferenceException handling during purchases verification process;Added check for the number of local variables before preparing the localized strings for further use (bundles building);Added tests for application config hanlders;Fixed other minor bugs.",{"id":6184,"title":6185,"titles":6186,"content":6187,"level":1120},"/unity-sdk/installation/releases#_453","4.5.3",[502,6161],"Download release package What changed Added support of verified (trusted) purchases that the Magify SDK can trust and not request verification on the Magify services side (see here);Opportunity to track purchases with no validation (see here);Added context loading and handling to the Magify basic integration;Added features and stored features scopes parsing to the Magify basic integration;Added content scope parsing to the Magify basic integration;Added cloning of incoming mutable collections in public MagifyManager and MagifyService API.",{"id":6189,"title":6190,"titles":6191,"content":6192,"level":1120},"/unity-sdk/installation/releases#_452","4.5.2",[502,6161],"Download release package What changed Based on the initial feedback from various users, the compatibility of the reactive API has been improved.",{"id":6194,"title":6195,"titles":6196,"content":6197,"level":1120},"/unity-sdk/installation/releases#_451","4.5.1",[502,6161],"Download release package What changed Removed dependency on UniRx;Added IsBasicIntegration flag for analytic models to determine which version of SDK is being used;Change production endpoint url to api.magify.com;Change staging endpoint url to api.jx-staging.magify.com;Configured assembly definition files to avoid errors on first import.",{"id":6199,"title":6200,"titles":6201,"content":6202,"level":1120},"/unity-sdk/installation/releases#_450","4.5.0",[502,6161],"Download release package What changed Server-interactions module has been refactored and optimized;Added check whether DateTime was parsed successfully from IServerTimeProvider implementation;Added opportunity to set custom prefix for Magify's logs via MagifyManager.Logging.SetCustomPrefixSource();Added MagifyManager.FirstLaunchDate property and MagifyManager.TweakFirstLaunchDate() method for testing purposes. This method allows to permanently tweak the date of the first app launch;Added piece of NotNull and CanBeNull attributes to clarify API contracts;Added lots of tests for web requests and response handlers;Fixed minor bugs.",{"id":6204,"title":6205,"titles":6206,"content":467,"level":1104},"/unity-sdk/installation/releases#releases-44","Releases 4.4:",[502],{"id":6208,"title":6209,"titles":6210,"content":6211,"level":1120},"/unity-sdk/installation/releases#_4414","4.4.14",[502,6205],"Download release package What changed General prefs' storage has been protected from conflicts during migrations.",{"id":6213,"title":6214,"titles":6215,"content":6216,"level":1120},"/unity-sdk/installation/releases#_4413","4.4.13",[502,6205],"Download release package What changed Fixed first launch after migration from old native SDK to the version with sync progress and then to a latest version.",{"id":6218,"title":6219,"titles":6220,"content":6221,"level":1120},"/unity-sdk/installation/releases#_4412","4.4.12",[502,6205],"Download release package What changed Fixed infinitive awaiting in the AwaitInitialConfigParsing() method.",{"id":6223,"title":6224,"titles":6225,"content":6226,"level":1120},"/unity-sdk/installation/releases#_4411","4.4.11",[502,6205],"Download release package What changed Added new callbacks for config and for features to provide more control over their parsing.",{"id":6228,"title":6229,"titles":6230,"content":6231,"level":1120},"/unity-sdk/installation/releases#_4410","4.4.10",[502,6205],"Download release package What changed Optimized the generation process of ClientId in base SDK;Handled binary storages loading errors during SDK initialization.",{"id":6233,"title":6234,"titles":6235,"content":6236,"level":1120},"/unity-sdk/installation/releases#_449","4.4.9",[502,6205],"Download release package What changed Changed Purchaser service visibililty level to public.",{"id":6238,"title":6239,"titles":6240,"content":6241,"level":1120},"/unity-sdk/installation/releases#_448","4.4.8",[502,6205],"Download release package What changed Added  SkipClientIdFromCloudLoading and ClientIdFromCloudLoadingTimeout configuration options to provide control of loading of ClientId from native cloud storage;Fixed 'missing reference error' when only Max mediator define symbols were added for Magify Service.",{"id":6243,"title":6244,"titles":6245,"content":6246,"level":1120},"/unity-sdk/installation/releases#_447","4.4.7",[502,6205],"Download release package What changed Fixed errors with access to native Android API;Fixed editor error with fake cloud storage.",{"id":6248,"title":6249,"titles":6250,"content":6251,"level":1120},"/unity-sdk/installation/releases#_446","4.4.6",[502,6205],"Download release package What changed Fixed NullReferenceException when returned value of MagifyEditorMoq.RegisteredLtoOffers() is null;Added MagifyServerTimeProvider for getting server time from Magify Server. WorldTimeApiServerTimeProvider was deleted;Fixed an infinitive loop when ATT status passed right on initialization;Fixed a situation when the Android build number (version code) requested from the thread pull returned '0';Clarified error logs during sync state process.",{"id":6253,"title":6254,"titles":6255,"content":6256,"level":1120},"/unity-sdk/installation/releases#_445","4.4.5",[502,6205],"Download release package What changed Improved handling of errors of writing to storage on disk;Fixed infinitive loop on SDK termination if there was token loading;Added handling of the \"Additional text encountered after finished reading JSON content\" exception during migration from old android SDK;Optimized SDK's initialization;Fixed a vulnerability that may prevent migration from old native SDK from happening;Improved OnConfigLoaded callback to allow requesting a campaign from its subscribers;Added thread safety and check for storing and deleting caches for CacheContent;Adapted some code for old code analyzer for Unity 2021;Added HasSocialAuthorize flag to check is social provider and token have been passed;Handled argument null exception (_unity_self) during web request's aborting.",{"id":6258,"title":6259,"titles":6260,"content":6261,"level":1120},"/unity-sdk/installation/releases#_444","4.4.4",[502,6205],"Download release package What changed Added AutoRestoreStateInfo property. It provides access to the info about automatic state restoring;Added IsAutoRestoreStateEnabled property. It allows you to control automatic state restoring;Added opportunity to fake AndroidId on initialization (MAGIFY_VERBOSE_LOGGING required --- since 4.5.5 replaced by MAGIFY_DEBUG).",{"id":6263,"title":6264,"titles":6265,"content":6266,"level":1120},"/unity-sdk/installation/releases#_443","4.4.3",[502,6205],"Download release package What changed Added ResetUserAuthorization method. It allows to reset previously set social authorization provider and token.",{"id":6268,"title":6269,"titles":6270,"content":6271,"level":1120},"/unity-sdk/installation/releases#_442","4.4.2",[502,6205],"Download release package What changed Fixed infinitive loop if web-request was cancelled on first start.",{"id":6273,"title":6274,"titles":6275,"content":6276,"level":1120},"/unity-sdk/installation/releases#_441","4.4.1",[502,6205],"Download release package What changed Fixed context and auth token requests cancellation handling.",{"id":6278,"title":6279,"titles":6280,"content":6281,"level":1120},"/unity-sdk/installation/releases#_440","4.4.0",[502,6205],"Download release package What changed Added the ability to create a single bundle with all included languages instead of a bundle for each language;Added storefront field, that represents store country for InApp and Subscriptions analytics;Added original_app_version field for some analytics models to show the version on which the event was generated. The goal was to have two filters and dimenschne by app version in the reports. The first with information about the app version on which the event was sent to the server, the second with information about the app version that the user had at the time of the event track. Works out of the box, you don't have to do anything, list of models:\nAdsClick;AdsImpression;AppLaunch;ApplovinAdsImpression;Bonuses;Click;EventFail;Impression;ImpressionFail;InApps;InvalidNativeElement;LevelPlayAdsImpression;MailingListStatusesMapping;PaidSubscriptionActivation;SessionEvent;StartEndSession;Transaction;TrialActivation;Added TrackCorrectionTransaction API for the appropriate transaction type. In the \"Transaction\" analytics model, the transaction_type field can now also contain spend_correction.",{"id":6283,"title":6284,"titles":6285,"content":467,"level":1104},"/unity-sdk/installation/releases#releases-43","Releases 4.3:",[502],{"id":6287,"title":6288,"titles":6289,"content":6290,"level":1120},"/unity-sdk/installation/releases#_431","4.3.1",[502,6284],"Download release package What changed Added stored app features;Update analytics events with product_id and product_id_creative;Added segmentation by build number.",{"id":6292,"title":6293,"titles":6294,"content":467,"level":1104},"/unity-sdk/installation/releases#releases-42","Releases 4.2:",[502],{"id":6296,"title":6297,"titles":6298,"content":6299,"level":1120},"/unity-sdk/installation/releases#_422","4.2.2",[502,6293],"Download release package What changed Added switching of analytics sync timer on main thread;Update analytics events with product_id and product_id_creative;Making a copy of params argument for campaign impression event;Added flag to replace campaign type representation from int to string;Improved security of sending events process;Reset AuthToken on environment tweak.",{"id":6301,"title":6302,"titles":6303,"content":6304,"level":1120},"/unity-sdk/installation/releases#_421","4.2.1",[502,6293],"Download release package What changed Added basic xml-documentation for Save & Restore progress functionality.",{"id":6306,"title":6307,"titles":6308,"content":6309,"level":1120},"/unity-sdk/installation/releases#_420","4.2.0",[502,6293],"Download release package What changed Added functionality of saving and restoring the user (ClientId) and his game progress. It is possible to restore automatically at the first startup after installing the application, as well as manually, controlled by you. There is a functionality of automatic user recovery (on Android works within one device, on iOS within one device or one apple-account);Added the ability to query the current Magify config by scopes (i.e. query individual parts as needed). Works in additive mode, i.e. requested scopes will overwrite previously downloaded data only by the corresponding fields;Added processing of new sections of the config: AB-tests and Segmentations. These sections provide information about which ab-tests and segments a player has gotten into. They are loaded only if the corresponding config scopes are explicitly specified;TrackInstalls-event has been removed;MagifyEditorMoq for ActiveLtoOffers() and RegisteredLtoOffers() methods returns null by default.",{"id":6311,"title":6312,"titles":6313,"content":467,"level":1104},"/unity-sdk/installation/releases#releases-41","Releases 4.1:",[502],{"id":6315,"title":6316,"titles":6317,"content":6318,"level":1120},"/unity-sdk/installation/releases#_412","4.1.2",[502,6312],"Download release package What changed Now there are 2 working modes of Magify: Default & Advanced:\nDefault mode supports only collecting and sending analytics;Advanced mode supports all the functionality of Magify (add MAGIFY_ADVANCED define symols to your project);Added UseAdvancedVersion flag to MagifyConfig for enabling Advanced version of Magify;Added active purchases verification;Added IsAttAuthorized flag to MagifyConfig;Added originalTransactionId for purchasing-related analytics models;Supported multithreading in EventHandler. Handled UnityWebRequests exceptions;Added retry for savng BinaryStorage on disk;Added retry for loading BinaryStorage from disk;Handled failed to access GPS ad id exception;Reduced amount of LogError in Unity editor;Internal optimizations and bug-fixes.",{"id":6320,"title":6321,"titles":6322,"content":467,"level":1104},"/unity-sdk/installation/releases#releases-40","Releases 4.0:",[502],{"id":6324,"title":6325,"titles":6326,"content":6327,"level":1120},"/unity-sdk/installation/releases#_4024","4.0.24",[502,6321],"Download release package What changed Added setting of SubscriptionStatus and AuthorizationStatus before first AppLaunch (cause iOS doesn't migrate them).",{"id":6329,"title":6330,"titles":6331,"content":6299,"level":1120},"/unity-sdk/installation/releases#_4023","4.0.23",[502,6321],{"id":6333,"title":6334,"titles":6335,"content":6336,"level":1120},"/unity-sdk/installation/releases#_4021","4.0.21",[502,6321],"Download release package What changed Fixed some bugs with EditorDevice woring;Added ability to moq the list of registered and active offerers via EditorMoq. Also, if developer mode is enabled, any calls to Magify client will be scipped;Fixed working with time in daily counters;Imroved catching of exceptions during migration from old (before 4.0.0) sdk versions;Improved working with internal storages;Supported multithreading for analytics events, that improves quality of analytics at critical moment;Handled exceptions with native android libraries.",{"id":6338,"title":6339,"titles":6340,"content":6341,"level":1120},"/unity-sdk/installation/releases#_4015","4.0.15",[502,6321],"Download release package What changed Added support of all platforms for magify C# assembly. It's required by bundle creator for editor-builds.",{"id":6343,"title":6344,"titles":6345,"content":6346,"level":1120},"/unity-sdk/installation/releases#_4014","4.0.14",[502,6321],"Download release package What changed Improved support of High code stripping for some Sdk models;Improved server interactions (operation cancellations, logs, threading);Fixed timestamp format in analytics events;Some fixes of working in Unity editor;Added public Api to FirstInstalledVersion property;Added TrackRestoredSubscription method;Improved migration from old versions logic;Added ClearNativeStorage() method. Clears Magify keychains on iOS (nothing on android for now);Replaced timeout for textures/bundles loading with DownloadPromise and multiple handles to it for different Load() calls;Fix choice parameter of event parsing (handled JArray value);Fixed tweak user locale method, restored ResetAndForceUpdate().",{"id":6348,"title":6349,"titles":6350,"content":6351,"level":1120},"/unity-sdk/installation/releases#_400","4.0.0",[502,6321],"Download release package What changed Internal SDK has been completely rewritten in c# without changed in functional logic;Added \"Magify Service\" as separate package without any changes to core manager;Added full support of Magify Runtime in the Unity Editor;Added Environment.Offline to block all server interactions (recommended for use only in Editor);Added MagifyLogger with LoggingScope to manage logs;Added AdPreloader as part of MagifyService to preload (cache) ads;Improved subscription status refreshing;Added more detailed PurchaseReceiptModel to PurchaseInfo;Added CrossPromoProduct and CrossPromoProductObtainer;Almost all of exceptions converted to inheritors of MagifyException;Added 'test suite' support for LevelPlayMediator;Improved ads revenue tracking.",{"id":507,"title":506,"titles":6353,"content":6354,"level":1110},[],"Description of the Magify configuration Here you can find information about the Magify SDK initialization and configuration: SDK Initialization describes how to initialize Magify SDK;Magify settings describes how to configure Magify SDK;Magify Service agruments descibes additional settings that you can pass in runtime;Integration with other Sdk contains desctiption of integration with different SDK.",{"id":513,"title":512,"titles":6356,"content":6357,"level":1110},[],"How to prepare and initialize Magify SDK",{"id":6359,"title":6360,"titles":6361,"content":6362,"level":1104},"/unity-sdk/configuration/sdkinitialization#good-to-know-magify-advanced","Good to know: Magify Advanced",[512],"Magify provides a large list of functions, but not all of them are always necessary to get started. That's why a significant part of the functionality is hidden under define MAGIFY_ADVANCED. You can add it at any stage of the project. This will open up the advanced functionality of the SDK for you.\nHidden functionality is also labeled in the documentation. Therefore, if you see that you need a feature and it is marked as Advanced, you will need to enable the define symbol beforehand.",{"id":6364,"title":6365,"titles":6366,"content":6367,"level":1104},"/unity-sdk/configuration/sdkinitialization#magify-settings-magify-service-arguments","Magify settings & Magify Service arguments",[512],"Before initializing and working with the SDK, you'll need to prepare two things: Magify settings This is a Scriptable Object that must be created and stored somewhere in your project.Magify Service arguments This is a runtime object with parameters that may vary under different conditions (one set for development builds, another for release builds). Please review them in the appropriate sections before moving on.",{"id":6369,"title":6370,"titles":6371,"content":6372,"level":1104},"/unity-sdk/configuration/sdkinitialization#initialize-magify-in-runtime","Initialize Magify in runtime",[512],"All interactions with the SDK are performed through the MagifyService class. To get started, you need to initialize it using static method MagifyService.Initialize. It takes two parameters Magify settings and Magify Service arguments, which we discussed in the previous section. using UnityEngine;\nusing Magify;\n\npublic class MagifyInitializer : MonoBehaviour\n{\n    [SerializeField]\n    private MagifySettings _settings;\n\n    private void Start()\n    {\n        var args = Debug.isDebugBuild ? CreateDevArgs() : CreateProdArgs();\n        MagifyService.Initialize(_settings, args);\n        Application.quitting += ApplicationQuittingHandler;\n    }\n\n    private MagifyServiceArgs CreateDevArgs() => new MagifyServiceArgs\n    {\n        // Example:\n        IsLoggingEnabled = true,\n        IsSandbox = true,\n    };\n\n    private MagifyServiceArgs CreateProdArgs() => new MagifyServiceArgs\n    {\n        // Example:\n        IsSandbox = false,\n    };\n\n    private void ApplicationQuittingHandler()\n    {\n        MagifyService.Terminate();\n    }\n} Please note that upon completing your interaction with Magify, typically when exiting your application, it's advisable to call the MagifyService.Terminate() method. This ensures the proper termination of internal processes within the SDK for a clean and graceful conclusion of its operations. Note that you shouldn't call Initialize() and Terminate() too many times. It is better to call them only once during the whole game cycle. Otherwise it may affect performance.",{"id":6374,"title":6375,"titles":6376,"content":6377,"level":1104},"/unity-sdk/configuration/sdkinitialization#use-clientid-for-all-integrations","Use ClientId for all integrations",[512],"Connect with 3rd party services. If your app has Appsflyer, Adjust, RevenueCat or another sdks, you should initialize them with ClientId provided by Magify: var clientId = MagifyService.Instance.ClientId;\n\n// AppsFlyer\nAppsFlyer.setCustomerUserID(clientId);\n\n// RevenueCat\nvar purchases = GetComponent\u003CPurchases>();\npurchases.appUserID = clientId;\n\n// Adjust\nvar clientId = MagifyService.Instance.ClientId;\nvar adjustConfig = new AdjustConfig(\"{YourAppToken}\", yourEnvironment)\n{\n    ExternalDeviceId = clientId,\n};\nadjustConfig.SessionSuccessDelegate += success => MagifyManager.AdjustId = success.Adid;\nadjustConfig.SessionFailureDelegate += failure => MagifyManager.AdjustId = failure.Adid;\nAdjust.AddGlobalCallbackParameter(\"client_id\", clientId);\nAdjust.AddGlobalPartnerParameter(\"client_id\", clientId);\nAdjust.InitSdk(adjustConfig);\n// for old adjust sdk see here: https://magify.atlassian.net/wiki/spaces/GW/pages/1283362/Adjust+sdk\n\n// Crashlytics\nCrashlytics.SetUserId(clientId);\n\n// GameAnalytics\nGameAnalytics.SetCustomId(clientId);\n\n// Applovin MAX (you don't need to do it if you use Magify.MaxMediator)\nMaxSdk.SetUserId(clientId);\n\n// LevelPlay / IronSource (you don't need to do it if you use Magify.LevelPlayMediator)\nIronSource.Agent.setUserId(clientId);\n\n// etc.",{"id":6379,"title":6380,"titles":6381,"content":6382,"level":1104},"/unity-sdk/configuration/sdkinitialization#next-steps","Next steps",[512],"Now you have a fully operational SDK and you can move on to the sections of interest to customize the corresponding functionality: Analytics;Purchases;Advertisement. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"id":517,"title":516,"titles":6384,"content":6385,"level":1110},[],"List of Magify SDK settings",{"id":6387,"title":4180,"titles":6388,"content":6389,"level":1104},"/unity-sdk/configuration/magifysettings#overview",[516],"Almost all configuration settings for the SDK are stored in a MagifySettings.asset scriptable object. You can create it by following menu item: Assets → Create → Magify → Settings\nPlace it in any folder within your project - you will need this file later during SDK initialization. Detailed descriptions for all properties within the settings file are provided in the table below. Some fileds will be showed only if advanced Magify SDK integration is enabled.",{"id":6391,"title":6392,"titles":6393,"content":6394,"level":1120},"/unity-sdk/configuration/magifysettings#general-settings-required","General Settings (Required)",[516,4180],"✅ To ensure the SDK functions properly, it's essential to configure these properties. SettingDescriptionName GPThe short name of your android application. Take it from the application dashboard or ask your manager.Name IOSThe short name of your iOS application. Take it from the application dashboard or ask your manager.Config GPRelative to the StreamingAssets path to the default android application config. Take it from the application dashboard or ask your manager.Config IOSRelative to the StreamingAssets path to the default iOS application config. Take it from the application dashboard or ask your manager.",{"id":6396,"title":6397,"titles":6398,"content":6399,"level":1120},"/unity-sdk/configuration/magifysettings#applovin-settings-required","Applovin Settings (Required)",[516,4180],"✅ If you are using our solution for Applovin MAX SDK, it’s crucial to configure these settings. SettingDescriptionSdk KeyThe key is required to initialize the MAX sdk.Banner Ad Unit Id GP/iOSThe AdUnit key that MAX uses to manage ads for banner ads.Banner Ad Unit Id GP/iOSThe AdUnit key that MAX uses to manage ads for interstitial ads.Banner Ad Unit Id GP/iOSThe AdUnit key that MAX uses to manage ads for rewarded ads.",{"id":6401,"title":6402,"titles":6403,"content":6404,"level":1120},"/unity-sdk/configuration/magifysettings#levelplay-settings-required","LevelPlay Settings (Required)",[516,4180],"✅ If you are using our solution for LevelPlay SDK, it’s crucial to configure these settings. SettingDescriptionSdk KeyThe key is required to initialize the MAX sdk.Apk Key GPThe App key is required to initialize the LevelPlay sdk on android, this field will be passed to LevelPlay during initialization.Apk Key iOSThe App key is required to initialize the LevelPlay sdk on iOS, this field will be passed to LevelPlay during initialization.",{"id":6406,"title":6407,"titles":6408,"content":6409,"level":1120},"/unity-sdk/configuration/magifysettings#rate-and-review-campaign-required","Rate And Review Campaign (Required)",[516,4180],"✅ These settings are mandatory if you are using the RateReviewCampaign. SettingDescriptionRate Us Link AndroidThe links that will be used by RateReviewCampaign.Rate Us Link iOSThe links that will be used by RateReviewCampaign.",{"id":6411,"title":6412,"titles":6413,"content":6414,"level":1120},"/unity-sdk/configuration/magifysettings#embedded-canvas-optional","Embedded Canvas (Optional)",[516,4180],"✅ These settings are used by the default canvas where default popups will be displayed. Feel free to customize them. SettingDescriptionRender ModeRender Mode for embedded canvas. If you want to use RenderMode.ScreenSpaceCamera, don't forget to set up camera in MagifyService.Presenter.Canvas.worldCamera after initializationSorting OrderSorting Order for canvas used by package.Reference ResolutionDefault resolution for embedded canvas.UI Scale ModeCanvasScaler: Default scale mode for embedded canvas.Match Width Or HeightCanvasScaler: Default MatchWidthOrHeight for embedded canvas.Reference Pixels Per UnitCanvasScaler: Default ReferencePixelsPerUnit for embedded canvas.",{"id":6416,"title":6417,"titles":6418,"content":6419,"level":1120},"/unity-sdk/configuration/magifysettings#default-features-optional","Default Features (Optional)",[516,4180],"In most cases, it's better not to modify these settings (except for default values). Only do so if you are confident in your understanding of their impact. SettingDescriptionDefault keyDefault valueForce Sync On Focus AfterIf the time between the application going into the background and returning to the foreground exceeds the value of ForceSyncOnFocusAfter, context synchronization occurs automatically.force_sync_on_focus_after60 secScreen Load TimeoutIf the application is unable to provide a custom screen (used for campaign with ImageCreative) within the duration of the ScreenLoadTimeout, the campaign will end with an error.screen_load_timeout10 secReward Load TimeoutThis is the duration during which reward ads will be loaded. If they are not loaded within the RewardLoadTimeout, campaign processing will end with an error.rv_timeout5 secProduct Fetch TimeoutThis is the time limit for fetching products. If they are not loaded within the ProductFetchTimeout, campaign processing will end with an error.in_app_fetch_timeout10 secRate Review Close Button DelayThis is the time after which the close button will appear on the popup requesting the user to leave a review for the app.rr_close_button_delay0 secStored App Features Loading Timeout SecondsThis is the duration during which each stored app feature value will be loaded or loading cancelled.stored_app_features_timeout30 sec",{"id":6421,"title":6422,"titles":6423,"content":6424,"level":1120},"/unity-sdk/configuration/magifysettings#embedded-events-optional","Embedded Events (Optional)",[516,4180],"In most cases, it's better not to modify these settings. Only do so if you are confident in your understanding of their impact. ConsentGivenEvent and SessionStartedEvent are mutually exclusive events triggered during a cold start. ConsentGivenEvent is invoked only once during the first app launch, while SessionStartedEvent triggers on all subsequent launches. SettingDescriptionDefault keyConsent Given EventTriggered during first cold start.consent_givenSession Started EventTriggered during second and subsequent cold starts.session_startHot Session Started EventTriggered when a player returns to the app. If the game loses focus during a campaign, the event will be ignored.hot_session_startBanner Default EventUsed to check if displaying a banner advertisement is available.banner_defaultInterstitial Failed EventFailed to display interstitial video ad for any reason (e.g., No Fill, No Internet, etc.).interstitial_failedInterstitial Showed EventSuccessfully displayed an interstitial video ad.interstitial_showedRewarded Video Failed EventFailed to display rewarded video ad for any reason (e.g., No Fill, No Internet, etc.).rewarded_video_failedRewarded Video Showed EventSuccessfully displayed rewarded video ad.rewarded_video_showedCampaign Closed EventTriggered when the user declined a campaign by closing its creative. Applicable for: Rate Review Campaign, Cross Promo Campaigns, and Campaigns with Products.campaign_closedOffer Finished EventLimited Time Offer ended for any reason.offer_finished",{"id":6426,"title":6427,"titles":6428,"content":6429,"level":1120},"/unity-sdk/configuration/magifysettings#embedded-params-optional","Embedded Params (Optional)",[516,4180],"In most cases, it's better not to modify these settings. Only do so if you are confident in your understanding of their impact. SettingDescriptionDefault keySource ParamThe name of the event that triggered the campaign.sourceAway Time ParamTime between the application going into the background and returning to the foreground.away_timeCampaign ParamCampaign name.campaignCampaign Type ParamCampaign type.campaign_type",{"id":521,"title":520,"titles":6431,"content":6432,"level":1110},[],"List of Magify Service agruments This describes additional settings that you can pass at runtime. You don't have to use all of these fields. Some fields are exclusive to the advanced version of Magify SDK and are marked accordingly.",{"id":6434,"title":6435,"titles":6436,"content":6437,"level":1104},"/unity-sdk/configuration/magifyservicearguments#main","Main",[520],"SettingDescriptionCustomClientIdAllows you to set a custom value for the user ID if you need to integrate the SDK with your own solution. More info here: CustomClientIdIsSandboxAllows testing in an isolated environment without interfering with production data. Ensure the property is set to false before publishing application. Be careful when configuring entities and viewing analytics on the Magify web dashboard, and don't forget to switch to Sandbox when working with test data.Is Logging EnabledDefault logging status. Change it using MagifyService.IsLoggingEnabled.  Add MAGIFY_VERBOSE_LOGGING to enable verbose logging (remove for production).Is Gdpr AppliedState of user consent to GDPR. Default is false if null or no saved value exists.Is Att AuthorizedState of user consent to ATT. Default is false if null or no saved value exists.CustomAndroidIdAllows to pass custom android id. For debugging reasons. MAGIFY_DEBUG define symbols are required.CustomBuildNumberAllows to pass custom application build number. For debugging reasons. MAGIFY_DEBUG define symbols are required.CustomAppVersionAllows to pass custom application version. For debugging reasons. MAGIFY_DEBUG define symbols are required.",{"id":6439,"title":558,"titles":6440,"content":6441,"level":1104},"/unity-sdk/configuration/magifyservicearguments#advanced",[520],"SettingDescriptionEditor MoqUse it for emulating some specific campaigns in editor. More info here: Campaigns handlingPopups ProviderYou can use this property to configure your custom class, which will be used to find and create popup-objects. Default class: ResourcesPopupsProvider.Purchase Verification HandlerAllows you to control purchase verification. Can be changed using MagifyService.ExternalPurchaseVerificationHandler.Remote Config ScopesAllows control over scopes of config loaded with requests. Change using MagifyService.RemoteConfigScopes.Enable Stored App Features PreloadingEnables background loading of stored app features. Change using MagifyService.EnableStoredAppFeaturesPreloading.Sync State EnabledEnables or disables sync state (app progress sync).Client State ConfigConfiguration for saving and restoring client state.Editor Config ModeDefines the platform simulated in the Unity editor. Affects some config/context logic.Is Developer ModeIf you want to use only mock settings, enable this flag.",{"id":525,"title":524,"titles":6443,"content":6444,"level":1110},[],"Description of the integration with other SDK Here you can find information about the integration with other SDK: ApplovinMax describes integration with Applovin Max SDK;LevelPlay/IronSource describes integration with LevelPlay/IronSource SDK;UnityPurchasing describes integration with UnityPurchasing SDK;Adjust describes integration with Adjust SDK;RevenueCat describes integration with RevenueCat SDK.Your own integration describes integration with your own solutions using CustomClientId",{"id":531,"title":530,"titles":6446,"content":6447,"level":1110},[],"Description of integration with ApplovinMax",{"id":6449,"title":6450,"titles":6451,"content":6452,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/applovinmax#initialization","Initialization",[530],"Go to the official MAX Mediation Documentation page and integrate it into your project;In ProjectSettings, add define MAX_ADS_MEDIATOR for your target platforms;Initialize SDK and configure ApplovinMax-related fields in MagifySettings;After calling MagifyService.Initialize() use the MagifyService.UseEmbeddedMaxMediator() and MagifyService.InitializeEmbeddedMaxMediator() methods, which will instruct SDK to use MaxMediator as the advertisement source: MagifyService.Initialize(_magifySettings, _magifyServiceArgs)\n             .UseEmbeddedMaxMediator()\n             .InitializeEmbeddedMaxMediator(); OR MagifyService.Initialize(_magifySettings, _magifyServiceArgs)\n             .UseEmbeddedMaxMediator();\n// wait for other services loading\nMagifyService.InitializeEmbeddedMaxMediator(); You can call InitializeEmbeddedMaxMediator() later when you want to start collecting ad information, or show ads using the Magify SDK. You can use MagifyService.Advertiser.Mediator property and get current IAdsMediator instance. Then you can cast it to MaxMediator and have full access to its API.",{"id":6454,"title":6455,"titles":6456,"content":6457,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/applovinmax#usage","Usage",[530],"You can use the MaxMediator class to load and display the necessary advertisements as you need.\nHowever, you don't have to show all of your ads through it. If you already have ads in your application via ApplovinMax SDK, Magify SDK in conjunction with MaxMediator class will handle all the events that occur and collect the necessary data. This class fully implements the IAdsMediator interface and provides basic control over advertising.\nHowever, we also provide some handy tools to simplify and improve your ad experience.\nFor this purpose you can check Advertisement and Preloading. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"id":535,"title":534,"titles":6459,"content":6460,"level":1110},[],"Description of integration with LevelPlay/IronSource",{"id":6462,"title":6450,"titles":6463,"content":6464,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/levelplay#initialization",[534],"Go to the official Documentation page and integrate it into your project;In ProjectSettings, add define LEVELPLAY_MEDIATOR for your target platforms;Initialize SDK and configure ApplovinMax-related fields in MagifySettings;After calling MagifyService.Initialize() use the MagifyService.UseEmbeddedLevelPlayMediator() and MagifyService.InitializeEmbeddedLevelPlayMediator() methods, which will instruct SDK to use LevelPlayMediator as the advertisement source: MagifyService.Initialize(_magifySettings, _magifyServiceArgs)\n             .UseEmbeddedLevelPlayMediator()\n             .InitializeEmbeddedLevelPlayMediator(); OR MagifyService.Initialize(_magifySettings, _magifyServiceArgs)\n             .UseEmbeddedLevelPlayMediator();\n// wait for other services loading\nMagifyService.InitializeEmbeddedLevelPlayMediator(testSuite: true); // pass true if you want to debug LevelPlay with test suite You can call InitializeEmbeddedLevelPlayMediator() later when you want to start collecting ad information, or show ads using the Magify SDK. You can use MagifyService.Advertiser.Mediator property and get current IAdsMediator instance. Then you can cast it to LevelPlayMediator and have full access to its API.",{"id":6466,"title":6455,"titles":6467,"content":6468,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/levelplay#usage",[534],"You can use the LevelPlayMediator class to load and display the necessary advertisements as you need.\nHowever, you don't have to show all of your ads through it. If you already have ads in your application via ApplovinMax SDK, Magify SDK in conjunction with LevelPlayMediator class will handle all the events that occur and collect the necessary data. This class fully implements the IAdsMediator interface and provides basic control over advertising.\nHowever, we also provide some handy tools to simplify and improve your ad experience.\nFor this purpose you can check Advertisement and Preloading. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":539,"title":538,"titles":6470,"content":6471,"level":1110},[],"Description of integration with UnityPurchasing",{"id":6473,"title":6450,"titles":6474,"content":6475,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/unitypurchasing#initialization",[538],"Go to the official page and integrate it into your project. You can use latest version of the package;In ProjectSettings, add define UNITY_PURCHASES for your target platforms (only Android and iOS are supported) now;Initialize Magify SDK; The next steps will be different for default and for advanced integration.",{"id":6477,"title":6478,"titles":6479,"content":6480,"level":1120},"/unity-sdk/configuration/integration-with-other-sdk/unitypurchasing#default-integration","Default integration",[538,6450],"In this case you have to implement IMinimalInAppStore interface. You can read more about work with purchases on the purchases overview page. After calling MagifyService.Initialize() use the MagifyService.SetPurchasingProvider with your implementation to finish integration with Magify. var service = MagifyService.Initialize(_magifySettings, _magifyServiceArgs)\n                           .SetPurchasingProvider(yourImplementationInstance);",{"id":6482,"title":6483,"titles":6484,"content":6485,"level":1120},"/unity-sdk/configuration/integration-with-other-sdk/unitypurchasing#advanced-integration","Advanced integration",[538,6450],"After calling MagifyService.Initialize() use the MagifyService.UseEmbeddedUnityPurchasing() method, which will instruct SDK to use UnityPurchases as the default IInAppStore implementation. var service = MagifyService.Initialize(_magifySettings, _magifyServiceArgs)\n                           .UseEmbeddedUnityPurchasing();",{"id":6487,"title":6455,"titles":6488,"content":6489,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/unitypurchasing#usage",[538],"Call MagifyService.Purchaser.InAppStore to get the interface implementation instance. Then you can cast it to your implementation or to UnityPurchases if MagifyService.UseEmbeddedUnityPurchasing() was called. You can use this instance to have quick access to its API. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":542,"title":50,"titles":6491,"content":6492,"level":1110},[],"Description of integration with Adjust",{"id":6494,"title":6495,"titles":6496,"content":6497,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/adjust#integration","Integration",[50],"Go to the official page and integrate it into your project;Initialize Magify SDK;Then you can provide Magify ClientId to Adjust. It is possible to do during Adjust initialization: var clientId = MagifyService.Instance.ClientId;\nvar adjustConfig = new AdjustConfig(\"{YourAppToken}\", yourEnvironment)\n{\n    ExternalDeviceId = clientId,\n};\n// Magify doesn't yet have an Adjust-related API at the Service level, so you will have to use MagifyManager.\nadjustConfig.SessionSuccessDelegate += success => MagifyManager.AdjustId = success.Adid;\nadjustConfig.SessionFailureDelegate += failure => MagifyManager.AdjustId = failure.Adid;\nAdjust.AddGlobalCallbackParameter(\"client_id\", clientId);\nAdjust.AddGlobalPartnerParameter(\"client_id\", clientId);\nAdjust.InitSdk(adjustConfig); For old Adjust SDK versions: var adjustConfig = new AdjustConfig(appToken, env);\nadjustConfig.setExternalDeviceId(MagifyService.Instance.ClientId);\nadjustConfig.setSessionSuccessDelegate(success => MagifyManager.AdjustId = success.Adid);\nadjustConfig.setSessionFailureDelegate(failure => MagifyManager.AdjustId = failure.Adid);\nAdjust.addSessionCallbackParameter(\"client_id\", MagifyService.Instance.ClientId);\nAdjust.addSessionPartnerParameter(\"client_id\", MagifyService.Instance.ClientId);\nAdjust.start(adjustConfig); html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":545,"title":337,"titles":6499,"content":6500,"level":1110},[],"Description of integration with RevenueCat",{"id":6502,"title":6495,"titles":6503,"content":6504,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/revenuecat#integration",[337],"Go to the official page and integrate it into your project;Initialize Magify SDK;Then you can provide Magify ClientId to RevenueCat. It is possible to do\nduring RevenueCat initialization:var clientId = MagifyService.Instance.ClientId;\nPurchases.PurchasesConfiguration.Builder builder = Purchases.PurchasesConfiguration.Builder.Init(\"your_api_key\");\nPurchases.PurchasesConfiguration purchasesConfiguration = builder.SetAppUserId(clientId).Build();\npurchases.Configure(purchasesConfiguration);\nafter RevenueCat initialization:var clientId = MagifyService.Instance.ClientId;\nvar purchases = GetComponent\u003CPurchases>();\npurchases.LogIn(clientId, (customerInfo, created, error) =>\n{\n    if (error != null)\n    {\n        // show error\n    }\n    else\n    {\n        // show customerInfo\n    }\n}); html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"id":549,"title":548,"titles":6506,"content":6507,"level":1110},[],"Description of integration with CustomClientId If you are integrating the SDK with your own solution and have a reliable way to identify the user, you can use CustomClientId to pass a trusted identifier to the SDK.",{"id":6509,"title":6455,"titles":6510,"content":6511,"level":1104},"/unity-sdk/configuration/integration-with-other-sdk/yourownintegration#usage",[548],"First, you must create a CustomClientId class by passing a string with the user’s ID into the constructor CustomClientId customClientId = new CustomClientId(\"clientId\"); You pass it to the SDK as a string, and on the SDK side this string will be encoded and deterministically converted into a UUID v5, which makes it possible to consistently identify the same client across launches. After that, you need to pass a reference to CustomClientId when creating the MagifyServiceArgs class, which will later be provided during MagifyService initialization. MagifyServiceArgs magifyServiceArgs = new MagifyServiceArgs\n{\n    CustomClientId = customClientId,\n    ...\n}; Note: You don’t need to use CustomClientId as the client_id for the services you integrate with. For your services, use your original client_id.CustomClientId is only needed by Magify for backend indexing. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":553,"title":552,"titles":6513,"content":6514,"level":1110},[],"Description of work with analytics",{"id":6516,"title":6517,"titles":6518,"content":6519,"level":1104},"/unity-sdk/analytics#preparation","Preparation",[552],"Remember, you need to configure and initialize the Magify Service to collect analytics. You may also want to pass some configuration parameters to better collect analytics: Set iOS ATT status on initialization or later in runtime;Set GDPR agreement status on initialization;Set media source in runtime.",{"id":6521,"title":6522,"titles":6523,"content":6524,"level":1104},"/unity-sdk/analytics#what-analytics-does-the-sdk-collect","What analytics does the SDK collect?",[552],"There are several analytical models built into the SDK that are built automatically. You will not interact with them directly, but some SDK settings may affect the content of the collected data.",{"id":6526,"title":6527,"titles":6528,"content":6529,"level":1120},"/unity-sdk/analytics#start-of-sessions","Start of sessions",[552,6522],"This kind of analytics is collected every time a new session starts. This also collects information about the InApp status and Subscription status of the user.",{"id":6531,"title":6532,"titles":6533,"content":6534,"level":1120},"/unity-sdk/analytics#going-to-the-background","Going to the background",[552,6522],"Events are collected to understand when the user minimized the application or closed it.",{"id":6536,"title":6537,"titles":6538,"content":6539,"level":1120},"/unity-sdk/analytics#applovin-maxlevelplay-ads-impressions","Applovin Max/LevelPlay ads impressions",[552,6522],"When a banner/interstitial/reward ad is shown, we collect analytics. For correct operation you need to select and install the mediator you will use and link it with Magify SDK. To implement it see MagifyService.SetAdsMediator and IMinimalAdsMediator;Also should check default implementations of this mediators: for Applovin Max and for LevelPlay.",{"id":6541,"title":6542,"titles":6543,"content":6544,"level":1120},"/unity-sdk/analytics#inapp-subscription","InApp / Subscription",[552,6522],"These types of analytics are collected when InApp products are purchased or Subscription purchase are made. For correct operation you need to select and install the purchasing provider you will use and link it with Magify SDK. To implement it see MagifyService.SetPurchasingProvider and IMinimalInAppStore.",{"id":6546,"title":6547,"titles":6548,"content":6549,"level":1104},"/unity-sdk/analytics#paying-state-notes","Paying state notes",[552],"You can read about paying statuses here.",{"id":559,"title":558,"titles":6551,"content":6552,"level":1110},[],"Description of the advanced work with analytics",{"id":6554,"title":6517,"titles":6555,"content":6556,"level":1104},"/unity-sdk/analytics/advanced#preparation",[558],"Remember that you can improve the quality of the analytics you collect with a fairly simple configuration.\nThis is partially described on the Overview page.\nWith advanced integration, you can customize additional properties: Set referrer id in runtimeSet user email in runtime",{"id":6558,"title":6559,"titles":6560,"content":6561,"level":1104},"/unity-sdk/analytics/advanced#what-analytics-does-the-advanced-sdk-collect","What analytics does the advanced SDK collect?",[558],"In addition to all the basic set of analytics, some set of analytics is added with advanced integration.",{"id":6563,"title":6564,"titles":6565,"content":6566,"level":1120},"/unity-sdk/analytics/advanced#your-custom-events","Your custom events",[558,6559],"We can submit our custom analytics events. There is nothing complicated about this process, each event must have a name and parameters.\nTo use this logic, you need to use the TrackEvent method.",{"id":6568,"title":6569,"titles":6570,"content":6571,"level":1120},"/unity-sdk/analytics/advanced#transactions","Transactions",[558,6559],"You can collect information about in-game resources received/spent by the user. For example, coins or premium currency received/spent.\nTo do this, you need to use the TrackIncomeTransaction and TrackExpenseTransaction methods.",{"id":6573,"title":6574,"titles":6575,"content":6576,"level":1120},"/unity-sdk/analytics/advanced#campaigns-related-analytics","Campaigns-related analytics",[558,6559],"When user use and view any campaigns through our SDK, a lot of different analytics are collected. Usually you don't have to worry about it.\nHowever, it is useful to know that these analytics also collect parameters that you pass to theRequestCampaignAsync(@params).",{"id":563,"title":562,"titles":6578,"content":6579,"level":1110},[],"Description of advanced work with purchases",{"id":6581,"title":6517,"titles":6582,"content":6583,"level":1104},"/unity-sdk/purchases#preparation",[562],"Remember, you need to configure and initialize the Magify Service to work with purchases and subscriptions.",{"id":6585,"title":6586,"titles":6587,"content":6588,"level":1104},"/unity-sdk/purchases#how-does-the-magify-sdk-interact-with-purchases-and-subscriptions","How does the Magify SDK interact with purchases and subscriptions?",[562],"The Magify SDK itself does not do any manipulation of purchases and subscriptions without minimal configuration.\nWe provide extensive functionality to manipulate purchases.\nTo get started, you need to understand how to interact with stores: Our SDK is waiting to receive a specific implementation of the IMinimalInAppStore interface;You can implement this interface as you need;During the purchasing process, the implementation notifies the SDK of the purchase made and SDK starts processing it, including sending analytics, validation, and others.",{"id":6590,"title":6591,"titles":6592,"content":6593,"level":1120},"/unity-sdk/purchases#inapp-subscription-paying-statuses","InApp, Subscription, Paying statuses",[562,6586],"InApp purchases affect the user's in-app status and paying status.\nSubscriptions at the same time affect the subscription status and paying status of the user.\nYou need this to properly segment and filter users.\nYou can find information about the configuration here",{"id":6595,"title":6596,"titles":6597,"content":6598,"level":1120},"/unity-sdk/purchases#purchases-validaton","Purchases validaton",[562,6586],"Our SDK provides simple way to validate and verify purchases and subscriptions. You can read more about it on the Validation page.",{"id":6600,"title":6601,"titles":6602,"content":6603,"level":1104},"/unity-sdk/purchases#paying-statuses-notes","Paying statuses notes",[562],"Magify SDK works with 3 kind of statuses: InApp status - determines whether the user has purchased any in-app product;Subscription status - determines the status of the user's in-game subscription;Paying status - combination of the 2 statuses above determines whether the user has spent money on the game;",{"id":6605,"title":6606,"titles":6607,"content":6608,"level":1120},"/unity-sdk/purchases#inapp-status","InApp status",[562,6601],"This status has only two states: free and paid. A player can only switch from free to paid status after purchasing an InApp product. There is no reverse transition.",{"id":6610,"title":6611,"titles":6612,"content":6613,"level":1120},"/unity-sdk/purchases#subscription-status","Subscription status",[562,6601],"Magify SDK automatically provides a special service to maintain the actual subscription status: MagifyService.Subscription. Be careful when working with it to keep the status up to date. The status may be changed according to the following rules:\nInactive → Trial ↔ Trial expiredInactive → Paid ↔ Paid expiredSwitching back to Inactive is usually not allowed;A user goes into expired status when the subscription has expired and no payment has been made to renew the subscription.",{"id":568,"title":558,"titles":6615,"content":6579,"level":1110},[],{"id":6617,"title":6517,"titles":6618,"content":6583,"level":1104},"/unity-sdk/purchases/advanced#preparation",[558],{"id":6620,"title":4180,"titles":6621,"content":6622,"level":1104},"/unity-sdk/purchases/advanced#overview",[558],"Advanced Magify SDK integration gives you complete control over your InApp and Subscription purchases. In this case, the entire shopping experience: uploading, purchasing and processing is the responsibility of the Magifi SDK. By default we have integration with Unity Purchases. In case you want to customize integration with other libraries for in-game purchases you can implement the interface IInAppStore and pass it to Magify via MagifyService.SetPurchasingProvider.",{"id":6624,"title":6455,"titles":6625,"content":6626,"level":1104},"/unity-sdk/purchases/advanced#usage",[558],"The easiest (but not the best) option for working with purchases through the Magify SDK is to use MagifyService.Purchaser. First, you can get a list of products configured for Magify using InAppProducts and SubscriptionProducts. Then you can prepare one or more products before purchasing via PrepareProductAsync to prepare the current InAppStore instance for purchasing of the product(s). Once the products have been successfully prepared you can initiate the purchase of a product using PurchaseProductAsync. After finishing this operation you can process the error in case of failure or process the purchased product and charge bonuses to the user. However, in this way of working, you need to perform many additional operations for the SDK to handle purchases and subscriptions correctly and collect analytics.\nTherefore, it is usually better to realize the purchase of products through a campaigns system.\nIn this case, we have already implemented a lot of logic to simplify your shopping experience.",{"id":572,"title":571,"titles":6628,"content":6629,"level":1110},[],"Description of work with purchases validation",{"id":6631,"title":4180,"titles":6632,"content":6633,"level":1104},"/unity-sdk/purchases/validation#overview",[571],"The purchase validation/verification process ensures that in-app purchases and subscriptions are validated on the server. This process involves sending purchase records to the server and processing the server's response to determine the validity of the purchase. The Magify server on its side contacts GooglePlay / AppStore to validate the purchase.",{"id":6635,"title":6636,"titles":6637,"content":6638,"level":1104},"/unity-sdk/purchases/validation#types-of-validation","Types of validation",[571],"Depending on the needs of your project, your application can work in two modes of purchase validation: \"passive\" and \"active\". The key difference is that in \"active\" validation, the application is directly involved in and can influence the purchase validation process.",{"id":6640,"title":6641,"titles":6642,"content":6643,"level":1120},"/unity-sdk/purchases/validation#passive-validation","\"Passive\" validation",[571,6636],"In this case, you are not required to do anything additional. The normal mode of operation looks like this: Store notifies the app when a purchase has been made;The purchase data is collected and passed to the SDK for processing;The SDK generates request and send it to the server;The SDK will handle all errors itself and retry requests if necessary;SDK will not notify about the validity of the purchase in any way. This mode is active by default and you can stop here if you don't care that the user is rewarded only for real purchases, but only that the analytics are correct.",{"id":6645,"title":6646,"titles":6647,"content":6648,"level":1120},"/unity-sdk/purchases/validation#active-validation","\"Active\" validation",[571,6636],"In this case, you can handle Magify SDK's responses about the validity of the purchase yourself and thus only provide the player with rewards for real purchases. To control the verification process it is necessary to implement the interface: interface IPurchaseVerificationHandler\n{\n    RepeatState? HandlePurchaseVerification(PurchaseVerificationResult result);\n} There are some peculiarities when implementing the interface: As input, you get an instance of PurchaseVerificationResult, which stores information about the verified purchase, as well as a Code field representing the result of the last verification attempt:Fail - verification attempt failed for an undetermined reason;Success - verification successful, purchase VALID;DoesntSupport - Purchase verification is not supported in this application (validator is not configured);Invalid - verification successful, purchase INVALID;InvalidGoogleCredentials - incorrect credentials for Google Play are given in the validator;You're returning an instance RepeatState:Finish - if you want to stop attempting to verify your purchase;Retry - if you want to immediately retry the verification attempt;Wait - if you want to wait before retrying verification (currently the waiting time is constant at 60 seconds of real time, this part may change, then the documentation will be updated);null - you leave it up to the SDK to decide how to handle the current verification attempt result;You should return null or Finish in case PurchaseVerificationResult.Code is Invalid or Success, because in such a situation SDK will work as if you had returned Finish for these values anyway;During processing, you can notify your game systems of the success/failure of the validation of the purchase.",{"id":6650,"title":6651,"titles":6652,"content":6653,"level":1120},"/unity-sdk/purchases/validation#example-of-using-active-validation","Example of using \"active\" validation",[571,6636],"First of all, you should implement the interface IPurchaseVerificationHandler: public class ExamplePurchaseVerificationHandler : IPurchaseVerificationHandler\n{\n    public RepeatState? HandlePurchaseVerification(PurchaseVerificationResult result)\n    {\n        return result.Code switch\n        {\n            PurchaseVerificationResultCode.Fail => RepeatState.Retry,\n            PurchaseVerificationResultCode.DoesntSupport => RepeatState.Finish,\n            PurchaseVerificationResultCode.InvalidGoogleCredentials => RepeatState.Wait,\n            _ => null,\n        };\n    }\n} In this implementation, let's assume that you decide to take this approach: If the result was Fail, we will immediately retry, because it is critical that the processing goes as fast as possible and we don't want to wait for some time until the next attempt in case of a connection failure.If the result was DoesntSupport, then there is no point in further attempts because the application does not support validation of purchases.If the result was InvalidGoogleCredentials, you can assume that this is some temporary problem in the configuration, you will soon fix the credentials and validation will work. Next, you can add a callback that will be triggered when Invalid or Success is received, which other systems in the game can subscribe to: public delegate void ProductVerificationFinishedDelegate(string productId, bool isValid);\n\npublic class ExamplePurchaseVerificationHandler : IPurchaseVerificationHandler\n{\n    public event ProductVerificationFinishedDelegate OnProductVerificationFinished;\n\n    public RepeatState? HandlePurchaseVerification(PurchaseVerificationResult result)\n    {\n        switch (result.Code)\n        {\n            case PurchaseVerificationResultCode.Success:\n                OnProductVerificationFinished?.Invoke(result.ProductId, isValid: true);\n                return null; // == return RepeatState.Finish\n            case PurchaseVerificationResultCode.Invalid:\n                OnProductVerificationFinished?.Invoke(result.ProductId, isValid: false);\n                return null; // == return RepeatState.Finish\n        }\n\n        return result.Code switch\n        {\n            PurchaseVerificationResultCode.Fail => RepeatState.Retry,\n            PurchaseVerificationResultCode.DoesntSupport => RepeatState.Finish,\n            PurchaseVerificationResultCode.InvalidGoogleCredentials => RepeatState.Wait,\n            _ => null,\n        };\n    }\n} Here you can see that we are returning Null for Invalid or Success, this is equivalent to returning RepeatState.Finish. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"id":576,"title":575,"titles":6655,"content":6656,"level":1110},[],"Description of work with purchases without validation through Magify",{"id":6658,"title":4180,"titles":6659,"content":6660,"level":1104},"/unity-sdk/purchases/externalvalidation#overview",[575],"If you have custom/external purchases validation service, you can bypass Magify's validation and send validated purchase data directly from your client or server-to-server. In this case, the responsibility for ensuring the integrity of the transactions lies on your side.",{"id":6662,"title":6663,"titles":6664,"content":6665,"level":1104},"/unity-sdk/purchases/externalvalidation#_1-sending-from-client","1. Sending from client",[575],"If you have the data about a valid purchase on the client side (in the application), you can pass this data to Magify, in this case this purchase will be considered valid and can be processed to create analytics repors. We call this type of purchase tracking \"trusted purchases\", which implies that you have already validated your purchases and we can trust the revenue data. To track it you need to create a TrustedPurchaseRecord data model, that contains all the necessary information about valudated transaction. We highly recommend not to use constructors of this class, but instead use static constructor methods that cover all possible and necessary for Magify events related to trusted purchases. In order to pass the trusted purchase data to Magify for further analytics processing and reporting, you need to pass the created record to PurchaseInfo which is usually created after a purchase is made, see IMinimalInAppStore or IInAppStore. Once the record value is set, you can continue processing PurchaseInfo and pass it on to Magify. PurchaseProcessingResult IStoreListener.ProcessPurchase(PurchaseEventArgs e)\n{\n    var product = e.purchasedProduct;\n    var purchaseInfo = new PurchaseInfo(product, LoadSubscriptionInfo(product.definition.id));\n    // start your verification process\n    return PurchaseProcessingResult.Pending;\n}\n\npublic void HandleYOURVerificationFinished(PurchaseInfo purchaseInfo)\n{\n    // here you fill TrustedPurchaseRecord of exact kind with verified fields:\n    purchaseInfo.TrustedPurchaseRecord = TrustedPurchaseRecord.CreateForConsumableInApp(productId, transactionId, timestamp, price, currency, storeFront, store);\n    // in case it's subscription add following lines:\n    // if (purchaseInfo.SubscriptionInfo != null)\n    //    OnSubscriptionPurchaseFinished?.Invoke(productId, purchaseInfo);\n    OnPurchaseFinished?.Invoke(productId, purchaseInfo);\n} TrustedPurchaseRecord.CreateForConsumableInApp(productId, transactionId, timestamp, price, currency, storeFront, store)",{"id":6667,"title":6668,"titles":6669,"content":6670,"level":1104},"/unity-sdk/purchases/externalvalidation#_2-server-to-server","2. Server-to-Server",[575],"If you have some external or own web service responsible for purchases validation, you can send data about failed purchases directly to the Magify server. Since the current page covers only SDK (client) side work, it will not describe how to configure Server-to-server communication (you can learn more about this by contacting Magify manager). However, you should also keep in mind that on the client side you will need to make small tweaks to make the approach work correctly. Although the purchase validity data will be sent directly to the server, the client side has to send some necessary analytics data itself, so even in this case you need to track purchases on the client side, but with a small peculiarity: after making a purchase, when creating an instance of PurchaseInfo (see IMinimalInAppStore or IInAppStore) you must set the SkipVerification flag to True. PurchaseProcessingResult IStoreListener.ProcessPurchase(PurchaseEventArgs e)\n{\n    var product = e.purchasedProduct;\n    var purchaseInfo = new PurchaseInfo(product, LoadSubscriptionInfo(product.definition.id), skipVerification: true);\n    if (purchaseInfo.SubscriptionInfo != null)\n        OnSubscriptionPurchaseFinished?.Invoke(product.definition.id, purchaseInfo);\n    OnPurchaseFinished?.Invoke(product.definition.id, purchaseInfo);\n    return PurchaseProcessingResult.Complete;\n} In this case Magify SDK will not request validation using Magify services. This completes the configuration of Server-to-server validation on the client side. Once the property value is set, you can continue processing PurchaseInfo and pass it on to Magify. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":580,"title":579,"titles":6672,"content":6673,"level":1110},[],"Description of work with Aghanim web-payments service",{"id":6675,"title":4180,"titles":6676,"content":6677,"level":1104},"/unity-sdk/purchases/aghanim#overview",[579],"Our platform and SDK provides an easy way to integrate with Aghanim. Integration with Aghanim in the SDK provides the ability to initiate product purchases directly from the application and process payment through the Aghanim web interface and automatically reward the user for the purchase. What the cycle of interaction looks like in general: The project configurator creates the in-app campaign in which adds a product that can be purchased via Aghanim.When a user gets a given campaign with a given product, he can initiate a purchase.The SDK perform a request to create an Aghanim order with the product.Once the order is generated, the SDK retrieves the URL and then initiates a click on that link.The user will have a browser open where they will have to enter their payment details and then pay for the purchase.After a successfully confirmed payment, the SDK receives information about it and notifies the application to reward the user and sends the necessary analytical information to the backend.",{"id":6679,"title":6495,"titles":6680,"content":6681,"level":1104},"/unity-sdk/purchases/aghanim#integration",[579],"Since aghanim is actually a web store for making purchases, at the SDK level it must implement the IInAppStore interface.",{"id":6683,"title":6684,"titles":6685,"content":6686,"level":1120},"/unity-sdk/purchases/aghanim#out-of-the-box-support","Out of the box support",[579,6495],"We provide a basic implementation of this interface with ready-made purchases in Aghanim available for expansion in any direction. For more information about this implementation, you may want to consider AghanimStore.",{"id":584,"title":583,"titles":6688,"content":6689,"level":1110},[],"Description of work with advertisement",{"id":6691,"title":6517,"titles":6692,"content":6583,"level":1104},"/unity-sdk/advertisement#preparation",[583],{"id":6694,"title":4180,"titles":6695,"content":6696,"level":1104},"/unity-sdk/advertisement#overview",[583],"Magify SDK allows you to control the display of ads to the user and collect information about the views of the ads. We assume that you can use any ad mediator that suits you. By default out of the box we provide integration with Applovin Max and Level Play ad mediators.\nIf you want to implement custom mediator see this. Also the Magify SDK allows you to use preloading of ads, which is described below.",{"id":6698,"title":6699,"titles":6700,"content":6701,"level":1104},"/unity-sdk/advertisement#how-to-use-advertising","How to use advertising",[583],"The easiest (but not the best) way to work with ads through our SDK is to use MagifyService.Advertiser. All the API describes below. Example: _logger.Log(\"Show RewardVideo and wait for result\");\nvar mediatorResult = await _advertiser.ShowRewardedVideoAsync(\n    placement: \"placement\",\n    clickedCallback: impression =>\n    {\n        _logger.Log($\"Rewarded video clicked: {nameof(impression)}={JsonConvert.SerializeObject(impression)}\");\n    }\n);\n\nswitch (mediatorResult.State)\n{\n    case AdShowState.Showed:\n        _logger.Log(\"RewardVideo successfully showed\");\n    case AdShowState.Closed:\n        _logger.Log(\"RewardVideo was closed\");\n    default:\n        _logger.Log($\"Failed to show RewardVideo. FailType={mediatorResult.State}. Error: {mediatorResult.Error}\");\n} However, in this way of working, you need to perform many additional operations for the SDK to correctly handle shown ads and collect analytics.\nTherefore, it is usually better to realize the showing of ad through a campaigns system.\nIn this case, we have already implemented a lot of logic to simplify your experience.",{"id":6703,"title":6704,"titles":6705,"content":6706,"level":1104},"/unity-sdk/advertisement#ads-preloading","Ads preloading",[583],"Our sdk introduces the ability to preload ads so that at the moment of requesting there will not be any delays associated with the need to download. To activate this functionality you need to use AdPreloadEnable. Then the sdk will use the mediator to check for the presence of cached ads to initiate the download in its absence. Keep in mind that different ad mediators have their own ad caching policy, and you may encounter a situation where the ad mediator will invalidate preloaded ads after some time. We try to handle such situations, but we cannot guarantee that the ads will always be present. This logic applies only to interstitial and reward ads. For this logic to work correctly you need full implementation of the IMinimalAdsMediator interface.",{"id":6708,"title":6709,"titles":6710,"content":6711,"level":1104},"/unity-sdk/advertisement#custom-ad-mediator","Custom ad mediator",[583],"If you need to use ad mediator that's not provided out of the box you can implement IMinimalAdsMediator (IAdsMediator in advanced integration) interface.\nThis interface returns IAdsImpression in many places, using this interface we track ad analytics by passing data about the ads shown/viewed, so your mediator in case of displaying ads should also return data packed in IAdsImpression.\nYou can safely rely on MaxMediator or LevelPlayMediator when implementing each method. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":588,"title":587,"titles":6713,"content":6714,"level":1110},[],"Description of work with app features",{"id":6716,"title":6517,"titles":6717,"content":6718,"level":1104},"/unity-sdk/appfeatures#preparation",[587],"Remember, you need to configure and initialize the Magify Service to work with app features.",{"id":6720,"title":4180,"titles":6721,"content":6722,"level":1104},"/unity-sdk/appfeatures#overview",[587],"Often we want to customize the application state remotely, or for example, customize depending on ab-tests, or some user state. For this purpose, our SDK provides a convenient way to centrally manage application settings, parameters and behavior that can be changed dynamically via remote features. Our SDK takes responsibility for: Downloading and Caching: Responsible for downloading features data from the server, saving it to local storage, and reusing it without the need for repeated requests;Reactivity: Provides the ability to track feature changes in real time, making it easy to synchronize data state between business logic and the user interface;Flexibility: Allows working with different data types (boolean, numeric, string, files);Relevance: We follow changes in a user's state that may affect which features we want to give to them.",{"id":6724,"title":6725,"titles":6726,"content":6727,"level":1104},"/unity-sdk/appfeatures#basic-usage","Basic usage",[587],"Currently app features in our SDK can be conditionally divided into 2 types: value-features and stored app features. The main difference is that the list of value-features is loaded together with the values of features, while stored app features values are separate files and are loaded separately from the list of current features. Usually you only need value-features, but when you want to pass some large amount of customization data, it is better to package it in a separate file and put it in stored app features. Below are examples of how to use all types of features.",{"id":6729,"title":6730,"titles":6731,"content":6732,"level":1120},"/unity-sdk/appfeatures#value-features","Value-features",[587,6725],"The simplest use case might look like this: public class WinScreen : PopupBase\u003CPopupArgs>\n{\n    [SerializeField]\n    private Button _getRewardButton;\n    [SerializeField]\n    private TextMeshProUGUI _rewardAmountText;\n    [SerializeField]\n    private TextMeshProUGUI _rewardKindText;\n    [SerializeField]\n    private GameObject _specialOfferIcon;\n\n    // Simple embedded wrapper over 'MagifyManager.Features.TryGetString' with default value\n    private readonly StringRemoteProperty _rewardKind = new(\"win_screen_reward_kind\", defaultValue: \"Coins\");\n\n    protected override void PrepareForShow(PopupArgs arguments, CompositeDisposable disposables)\n    {\n        // getting boolean feature by name\n        var showSpecialOfferIcon = MagifyService.Instance.Features.GetBool(\"win_screen_is_special_offer\");\n        _specialOfferIcon.SetActive(showSpecialOfferIcon);\n\n        // default value\n        var rewardAmount = 5.0;\n        // trying to get number feature by name\n        if (MagifyService.Instance.Features.TryGetNumber(\"win_screen_reward_amount\", out var amount))\n            rewardAmount = amount;\n        _rewardAmountText.text = rewardAmount.ToString(CultureInfo.InvariantCulture);\n\n        // trying to get remote feature or use default value\n        _rewardKindText.text = _rewardKind.Value;\n\n        _getRewardButton.OnClickAsObservable()\n            .Subscribe(_ => { /* do something */ })\n            .AddTo(disposables);\n    }\n} As you can see, using features is quite easy. You can also use reactive versions: public class GameActivityOverlay : MonoBehaviour\n{\n    [SerializeField]\n    private GameObject _hintBooster;\n\n    private void Start()\n    {\n        MagifyService.Instance.Features.GetReactiveBool(\"is_hint_booster_available\")\n            .TakeUntilDestroy(this)\n            .Subscribe(isAvailable => _hitBooster.SetActive(isAvailable));\n    }\n}",{"id":6734,"title":6735,"titles":6736,"content":6737,"level":1120},"/unity-sdk/appfeatures#stored-app-features","Stored app features",[587,6725],"One of the uses might be features that are important to start the app when you want the player to start the game with the actual settings. public class Bootstrapper : MonoBehaviour\n{\n    private async void Start()\n    {\n        // your code ...\n        // magify initialization code ...\n\n        const string key = \"startup_critical_features\";\n        if (MagifyService.Instance.Features.StoredAppFeatures.TryGet(key, out var storedAppFeature))\n        {\n            var storedAppFeatureContentHandle = await MagifyService.Instance.Features\n                .LoadStoredAppFeature(storedAppFeature, destroyCancellationToken, timeoutSeconds: 5);\n            if (storedAppFeatureContentHandle.Code == StorageResultCode.Success)\n            {\n                var criticalFeature = await storedAppFeatureContentHandle.Value.LoadString()!;\n                // load your game with these critical features values\n            }\n        }\n\n        // your code ...\n    }\n} You can also enable background loading (preloading) of stored app features by our SDK via MagifyServiceArgs: public class Bootstrapper : MonoBehaviour\n{\n    [SerializeField]\n    private MagifySettings _magifySettings;\n\n    private async void Start()\n    {\n        // your code ...\n\n        var magifyServiceArgs = new MagifyServiceArgs()\n        {\n            EnableStoredAppFeaturesPreloading = true,\n        };\n        MagifyService.Initialize(_magifySettings, args: magifyServiceArgs);\n\n        // your code ...\n    }\n} In this case stored app features will be loaded at the discretion of the SDK, the most common cases of preloading are: When cold-starting applications;When internet access becomes available (in terms of Unity network reachability);When starting a new session (in terms of our SDK);After the first remote config has been successfully loaded (in this application run). html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":592,"title":591,"titles":6739,"content":6740,"level":1110},[],"Description of work with downloading content",{"id":6742,"title":6517,"titles":6743,"content":6718,"level":1104},"/unity-sdk/content#preparation",[591],{"id":6745,"title":4180,"titles":6746,"content":6747,"level":1104},"/unity-sdk/content#overview",[591],"Often we want to load some content depending on ab-tests, or some user state. For this purpose, our SDK provides a convenient way to centrally manage content loading that can be changed dynamically.",{"id":6749,"title":6725,"titles":6750,"content":6751,"level":1104},"/unity-sdk/content#basic-usage",[591],"We have a simple and transparent API for working with content: MagifyManager.Content.GetContentList tries to find content info by given parameters;MagifyManager.Content.GetEarliestContent tries to find content info by given parameters and tag 'earliest';MagifyManager.Content.GetLatestContent tries to find content info by given parameters and tag 'latest'. Currenly Magify doesn't provide ready service for downloading of content, we only provide segmentation and information about content items. When you got ContentItem.",{"id":596,"title":595,"titles":6753,"content":6754,"level":1110},[],"Description of work with campaigns",{"id":6756,"title":6517,"titles":6757,"content":6758,"level":1104},"/unity-sdk/campaigns#preparation",[595],"Remember, you need to configure and initialize the Magify Service to work with purchases and subscriptions. Campaigns are available only with advanced Magify SDK integration.",{"id":6760,"title":6761,"titles":6762,"content":6763,"level":1104},"/unity-sdk/campaigns#campaign-processing-the-heart-of-the-sdk","Campaign Processing - The Heart of the SDK",[595],"Campaign processing is the core functionality of the SDK.\nTo begin your understanding, you can consider that campaigns = application event handlers. For example, on the level_finished game event we have some campaign, that tells SDK to show Interstitial ad with some configuration and describes the bonus reward for the user. A campaign only makes sense in conjunction with events, when a request for a campaign is made. If a relevant campaign is available, processing begins. The list of events is predetermined and remains unchanged in the live environment - essentially, these events are hardcoded throughout the project. However, campaigns can vary, and different campaigns can be associated with the same events. In its general form, triggering an event in the code involves waiting for the completion of an asynchronous method. A crucial point here is that the duration of this method's execution can vary greatly, depending on the campaign. It could finish instantly if no campaign is associated with the event, or it could take a considerable amount of time (potentially even minutes) based on the specific campaign. It's easier to understand how SDK works with a simple example.",{"id":6765,"title":6766,"titles":6767,"content":6768,"level":1120},"/unity-sdk/campaigns#interstitial-ad-campaign-example","Interstitial ad campaign example",[595,6761],"The developer collaborates with the configuration manager to define the application event, for example, level_finished, and specifies when it should trigger - such as when the user presses the Continue button on the result screen. The developer hardcodes the event's invocation, and the configuration manager configures an Interstitial campaign for this event in the admin panel. For this example, the code might look something like this: public class ResultScreen : MonoBehaviour\n{\n    [SerializeField]\n    private Button _continueButton;\n    [SerializeField]\n    private Walled _wallet;\n\n    private void Start()\n    {\n        _continueButton.OnClickAsObservable()\n            .TakeUntilDestroy(this)\n            .Subscribe(_ => Continue());\n        \n        // This is where we determine how to handle the bonuses obtained\n        MagifyService.Instance.Obtainer.OnProductObtained\n            .TakeUntilDestroy(this)\n            .Subscribe(result =>\n            {\n                // For example 'Type' and 'Quantity' for 'result.Product.Payout' elements might be:\n                // 'Coins' and '150'\n                // 'Diamonds' and '1'\n                foreach (var payout in result.Product.Payout)\n                {\n                    _wallet[payout.Type] += payout.Quantity;\n                }\n            });\n    }\n\n    private async void Continue()\n    {\n        _continueButton.interactable = false;\n        // this line of code runs the async processing of the campaign \n        // \"level_finished\" is the application event that the campaign was configured for\n        await MagifyService.Instance.RequestCampaignAsync(\"level_finished\");\n        _continueButton.interactable = true;\n\n        // Load the next level\n    }\n} This is just a piece of code for an example, it won't work without full configuration.",{"id":6770,"title":6771,"titles":6772,"content":6773,"level":1120},"/unity-sdk/campaigns#start-session-before-any-campaigns","Start session before any campaigns",[595,6761],"Before triggering any event, it's required to await the MagifyService.RequestSessionStartAsync method once after SDK initialization at the start of your application. This method serves as a point of initiating the campaign-related work. Under the hood, this method also triggers and awaits the MagifyService.RequestCampaignAsync method, with Consent Given Event or Session Started Event as the event, as detailed in Magify Settings. Not calling this method will make triggering any other event as if there were no campaigns configured for that event, and campaign processing won't work properly. The most appropriate time to call this method is when the game has finished loading (after all loading screens) and the first in-game scene is displayed. public class Bootstrapper : MonoBehaviour\n{\n    private async void Awake()\n    {\n        // Show loading screen\n        InitializeApp();\n        await SceneManager.LoadSceneAsync(\"MainMenu\");\n        // Hide loading screen\n        await MagifyService.Instance.RequestSessionStartAsync();\n    }\n\n    private void InitializeApp()\n    {\n        // Initialize your application (sdks, user consent, permission, etc) \n    }\n}",{"id":6775,"title":6776,"titles":6777,"content":6778,"level":1104},"/unity-sdk/campaigns#components-of-the-campaign","Components of the campaign",[595],"The following is a description of the basic components of any campaign that can be used in your application. The campaign itself may contain some data, but it may also contain creative and products. as different goals require different sets of data, which results in different types of campaigns.",{"id":6780,"title":6781,"titles":6782,"content":6783,"level":1120},"/unity-sdk/campaigns#the-campaign-itself","The campaign itself",[595,6776],"All campaigns implement the ICampaign interface, which provides two primary attributes for campaigns: its name and type. In addition to ICampaign, there are two auxiliary interfaces that allow logical grouping of certain campaigns for more convenient handling: ICampaignWithCreative and ICampaignWithProducts",{"id":6785,"title":6786,"titles":6787,"content":6788,"level":1120},"/unity-sdk/campaigns#campaign-types","Campaign types",[595,6776],"Each specific campaign has its own type that determines what kind of content the campaign can provide and what data set it is described by. The type of campaign also affects how it will be processed. Depending on the type of campaign, you can determine whether the campaign is now available for use or not at the launch stage. For example, a campaign that requires ad views will only be available if there is a functioning ad mediator, and an in-app campaign will only be available if there is a functioning store. CampaignType enum defines all possible campaign types in Magify SDK. Almost every campaign type has its variants for LTO (Limited Time Offer), you can read more on the relevant page. The following campaign types are currently supported in the Magify SDK: InApp: To offer a purchase within a game product;Subscription: To offer to purchase a subscription;Interstitial: To offer to view intermediate ads;RewardedVideo: To offer to view rewarded ads;Banner: To customize the banner ads;Bonus: To offer to receive a free bonus;RateReview: To offer to rate an app;External: To offer to follow an external link;CrossPromo: To offer to view another of your apps;Notification: To customize notifications;Mixed: A mixed campaign that can include the functionality of all other campaigns. As well as LTO options: LtoInApp;LtoSubscription;LtoRewardedVideo;LtoBonus;LtoExternal;LtoCrossPromo;LtoMixed; It is also important to keep in mind that for almost every type of campaign there is a corresponding type of product, you can read about it in the corresponding section.",{"id":6790,"title":6791,"titles":6792,"content":6793,"level":1120},"/unity-sdk/campaigns#campaign-creatives","Campaign creatives",[595,6776],"Campaign creative refers to a description of the visual representation of any campaign. The campaign may not contain any creative at all or, for example, the creative may be an image or some application prefab. ICreative interface represents the type of creative content that will be shown to the user during campaign processing. Currently, following types of creatives are supported: NoUiCreative: This is an empty creative, meaning nothing will be displayed to the user, and the campaign's actions will commence during processing. For example, a button in the store by clicking on which will immediately open a native window from PlayMarket or AppleStore with a product that the user can buy.ImageCreative: This creative contains an image that is configured in the admin panel and will be shown to the user within a frame. For example, after the transition to a new level InApp campaign will be requested, which will first show the user an image of what he will get by purchasing this product, the user can close this creative or click on the purchase button after which the native window from the store for purchasing the product will appear.CustomCreative: This is a screen (popup/prefab) embedded in the application, with a configurable screenId from the front-end configuratuion panel. It will be requested from the application during campaign processing. Example can be the same as for ImageCreative but, instead of image, some popup (created directly in Unity by you) will be shown to user.BundleCreative: Bundles are entities that are not in the application at the build-time, but are uploaded to the server as asset bundles and downloaded in the runtime game for later display to the user. In our SDK they are represented by default as bundle creatives that you can add for different campaigns. You can read more about building and usage of bundles on the related page. You can read more about creatives on the related page.",{"id":6795,"title":6796,"titles":6797,"content":6798,"level":1120},"/unity-sdk/campaigns#campaign-products","Campaign products",[595,6776],"Most campaigns involve some sort of reward for the user, for example InApp campaign should provide the user with a purchased product, Rewarded Ad campaign should provide the user with some sort of reward for ads viewed. Such rewards want to be configured remotely using the configuration panel, for processing these rewards in our SDK we use campaign products. ProductDef is the base type for all products that can be offered to the user. In most cases, campaigns can have only one specific type of product (e.g., InAppCampaign offers only InAppProducts, RewardCampaign offers RewardProducts, etc.). However, there is one exception, the MixedCampaign which can contains any type of product. Currently, the following products are supported: InAppProduct: The user is offered to purchase an in-app item.SubscriptionProduct: The user is offered to purchase a subscriptions.RewardProduct: The user is offered to watch an ad in exchange for a reward.BonusProduct: This is simply a reward that the user receives for free.InfoProduct: This is also a free reward, often used as news that the user must view and frequently doesn't contain an in-game reward.ExternalLinkProduct: The user is redirected to an external link, and upon return, he will receive a reward.InternalLinkProduct: The user is redirected to an internal link, and receives a reward (see IAppNavigator for more details).CrossPromoProduct: The user is rewarded for seeing ads for another of your apps. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":602,"title":601,"titles":6800,"content":6801,"level":1110},[],"Description of work with LTO",{"id":6803,"title":6517,"titles":6804,"content":6805,"level":1104},"/unity-sdk/campaigns/lto#preparation",[601],"Remember, you need to configure and initialize the Magify Service to work with purchases and subscriptions. Campaigns are available only with advanced Magify SDK integration. You should also read up on campaigns in general, because LTO is a subset of campaigns.",{"id":6807,"title":6808,"titles":6809,"content":6810,"level":1104},"/unity-sdk/campaigns/lto#main-idea","Main idea",[601],"Often apps need to implement some sort of limited time offer. This can be temporary promotions, sales, limited time to purchase content and other similar examples. If you are already familiar with the concept of campaigns, it should be clear to you that if you add a time limit to campaigns, you will get just such offers. Technical LTO's are just an extension of the campaigns functionality. However, they also bring a lot of functionality with them, which will be described in more detail below.",{"id":6812,"title":6813,"titles":6814,"content":6815,"level":1104},"/unity-sdk/campaigns/lto#implementation","Implementation",[601],"The main difference between LTO and common campaigns is the way they are visually represented and processed. Launching an LTO is pretty much the same as launching a regular company. At the required location you have to call MagifyService.RequestCampaignAsync method and if all conditions are matched and the LTO can be launched, it will be launched.\nIn this case, you will be returned the result of the campaign request, but on top of that, the LTO will start its lifecycle inside the SDK. By default, the SDK provides a base class LimitedTimeOfferBase for working with offers. It is an inheritor of MonoBehaviour. And it is a default way for displaying LTO. Since it is an abstract class you must create a class that inherits from it and implement abstract members. And also non-abastract LimitedTimeOffer class for the simplest variant of LTO processing.",{"id":6817,"title":6818,"titles":6819,"content":6820,"level":1120},"/unity-sdk/campaigns/lto#using-default-solution","Using default solution",[601,6813],"The easiest way to implement LTO would be to attach LimitedTimeOffer to some game object on your scene. In this example, it's just a static object that is predefined in your application. Then, while the application is running, you call the MagifyService.RequestCampaignAsync method, and if the LTO campaign was launched with the same spot as the one configured in the 'Offer Spot' field, then this object will be notified by SDK and the display of the launched offer will start.",{"id":6822,"title":6823,"titles":6824,"content":6825,"level":1120},"/unity-sdk/campaigns/lto#using-lto-via-scripts","Using LTO via scripts",[601,6813],"Another use case for LTOs would be to create and customize them with code. First, let's create inheritor of the LimitedTimeOffer class and add a method to set the OfferSpot from outside: public class ExampleLto : LimitedTimeOffer\n{\n    public void SetSpot(string spot)\n    {\n        OfferSpot = spot;\n    }\n} Now we can create some class (LtoContainer) that will contain all the LTO objects on the current application screen. We will keep track of changes in the list of active offers and create or destroy objects depending on the added and deleted items: public class LtoContainer : MonoBehaviour\n{\n    [SerializeField]\n    private ExampleLto _ltoPrefab;\n    [SerializeField]\n    private Transform _parent;\n\n    protected async void Start()\n    {\n        var magify = await MagifyService.WaitForInitialized();\n        magify.Offers.ActiveOffers.ObserveAdd()\n            .TakeUntilDestroy(this)\n            .Subscribe(ltoInfo =>\n            {\n                _ltoPrefab.gameObject.SetActive(false); // because LimitedTimeOfferBase is trying to initialize on Awake(), but we need to set the spot before\n                var instance = Instantiate(_ltoPrefab, _parent);\n                _ltoObjects.TryAdd(ltoInfo.Value.Spot, instance);\n                instance.SetSpot(ltoInfo.Value.Spot);\n                instance.gameObject.SetActive(true); // here offer will be initialized with given spot\n                _ltoPrefab.gameObject.SetActive(true); // if necessary\n            });\n        magify.Offers.ActiveOffers.ObserveRemove()\n            .TakeUntilDestroy(this)\n            .Subscribe(ltoInfo =>\n            {\n                if (_ltoObjects.Remove(ltoInfo.Value.Spot, out var instance))\n                    Destroy(instance.gameObject);\n            });\n    }\n} In this option, you don't need to predefine the position of all the offers, you just need to properly position them within the container as they are added and removed. This adds flexibility to your interface. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"id":606,"title":605,"titles":6827,"content":6828,"level":1110},[],"Description of the campaigns' visual customization",{"id":6830,"title":4180,"titles":6831,"content":6832,"level":1104},"/unity-sdk/campaigns/visialcustomization#overview",[605],"Usually almost all campaigns have a visual representation. In our SDK, the entity responsible for the visual representation of a campaign is called creative. If you have a campaign instance you can access the creative, to do this you need to cast campaign instance to ICampaignWithCreative.Creative. The following are ways to handle all types of creatives.",{"id":6834,"title":6835,"titles":6836,"content":6837,"level":1104},"/unity-sdk/campaigns/visialcustomization#image-creative-hadnling","Image creative hadnling",[605],"You can see the default handling of campaig with ImageCreative in the ImageCreativeCampaignHandler class. The default processing is to determine what the screen mode is now (portrait or landscape). Then, depending on this, take the necessary portrait or landscape link and try to get an image (from the hard disk if the image has been downloaded before, or download it). Then use popup to display the creative.",{"id":6839,"title":6840,"titles":6841,"content":6842,"level":1104},"/unity-sdk/campaigns/visialcustomization#custom-creative-handling","Custom creative handling",[605],"You can see the default handling of campaig with CustomCreative in the CustomCreativeCampaignHandler class. The default handling of this creative type is to use CustomCreative.ScreenId to display the custom creative via popup.",{"id":6844,"title":6845,"titles":6846,"content":6847,"level":1104},"/unity-sdk/campaigns/visialcustomization#bundle-creative-handling","Bundle creative handling",[605],"Currently, Magify SDK does not have a default handler for this type of creative. We are working on adding one, but for now you have to implement it yourself if you want to use the BundleCreative. The simpliest processing is to try to get an AssetBundle (from the hard disk if the bundle has been downloaded before, or download it). Then use popup to display the bundle. Working with the asset bundles is a big enough topic so we've put it in a separate article.",{"id":6849,"title":6850,"titles":6851,"content":6852,"level":1104},"/unity-sdk/campaigns/visialcustomization#working-with-popups","Working with popups",[605],"Popups are the primary way to visualize creatives in Unity. Campaign visualization, products displays, product interactions - all this is done with the help of popups. First we need to decide on the implementation of popups, Magify provides the following set of interfaces for working with popups IPopupBase, IPopup and IPopupWithProducts. Out of the box, Magify supports loading popups through the Resources folder using the ResourcesPopupsProvider class. Another way - you can implement the IPopupsProvider interface and override methods for those types of popups that you are going to use and be sure to define a method UnloadPopup regardless of the number and type of popups, it must unload any loaded popup from memory. IPopupsProvider works with IPopupBase, IPopup and IPopupWithProducts interfaces, they are needed to allow Magify to show popups and visually interact with the player.",{"id":6854,"title":6855,"titles":6856,"content":6857,"level":1120},"/unity-sdk/campaigns/visialcustomization#embedded-popups","Embedded popups",[605,6850],"You can use our embedded in SDK popups. They already provide the basic logic of opening and closing and also provide the possibility to change animations (by using the ease settings in the script or inheriting from them and adding your own logic). Popup typeDescriptionSpinner: IPopupBasePopup that is shown to block the player's screen in order to load some data or perform operations.RateReviewPopup: IPopupPopup that visualizes a request for game evaluation from a player.InterPopupSplash: IPopupBasePopup is used for InterstitialCampaign. If the campaign requires it to be shown, it will be shown before playing the interstitial video received through the interstitial ad mediators, as soon as the required amount of time (which was specified in the campaign) has passed, the video will start playing.ImagePopup: IPopup\u003CImagePopup.Args>Popup that is designed to display ImageCreative in a separate panel with free space on the edges.FullscreenPopup: IPopup\u003CImagePopup.Args>Popup is designed to display ImageCreative in full screen.CreativeWithProductsPopup: IPopupWithProducts\u003CCreativePopup.Args>Popup is designed to display CustomCreative with products.",{"id":6859,"title":6860,"titles":6861,"content":6862,"level":1120},"/unity-sdk/campaigns/visialcustomization#popups-customization","Popups customization",[605,6850],"If for some reason you can't use one of the ready-made popup scripts, then you can implement one of the interfaces (IPopupBase, IPopup or IPopupWithProducts) depending on which campaign you want to display the popup for, and implement all the necessary logic to display the popup the way you want.",{"id":610,"title":609,"titles":6864,"content":6865,"level":1110},[],"Examplw of  usage of all campaign types",{"id":6867,"title":6868,"titles":6869,"content":6870,"level":1104},"/unity-sdk/campaigns/campaignexamples#interstitial-campaign","Interstitial campaign",[609],"Let's imagine the situation that you need to request a campaign at the moment when the user has completed a level.\nTo do this, you request a company for some event. You as a programmer cannot be sure that the requested campaign will surely be a campaign with interstitial ads. This is due to the fact that on the configuration side, any campaign might be configured for this event, as well as different campaigns might be configured for the same event at the same time, over time the configuration might change. public class ResultScreen : MonoBehaviour\n{\n    [SerializeField]\n    private Button _continueButton;\n\n    private void Start()\n    {\n        _continueButton.OnClickAsObservable()\n            .TakeUntilDestroy(this)\n            .Subscribe(_ => Continue());\n    }\n\n    private async void Continue()\n    {\n        _continueButton.interactable = false;\n        // this line of code runs the async processing of the campaign \n        // \"level_finished\" is the application event that the campaign was configured for\n        await MagifyService.Instance.RequestCampaignAsync(\"level_finished\");\n        _continueButton.interactable = true;\n\n        // Load the next level\n    }\n}",{"id":6872,"title":6873,"titles":6874,"content":6875,"level":1120},"/unity-sdk/campaigns/campaignexamples#products-handling","Products handling",[609,6868],"Then you can have a class like wallet, which stores all the resources that the user has. Then in it you can observe Magify to handle all the products: public class WalletManager\n{\n    private readonly Dictionary\u003Cstring, float> _items = new();\n\n    public async UniTask Initialize()\n    {\n        var magify = await MagifyService.WaitForInitialized();\n        magify.Obtainer.OnProductObtained\n            .Subscribe(result =>\n            {\n                // For example 'Type' and 'Quantity' for 'result.Product.Payout' elements might be:\n                // 'Coins' and '150'\n                // 'Diamonds' and '1'\n                foreach (var payout in result.Product.Payout)\n                {\n                    _items[payout.Type] += payout.Quantity;\n                }\n            });\n    }\n}",{"id":6877,"title":6878,"titles":6879,"content":6880,"level":1120},"/unity-sdk/campaigns/campaignexamples#additional-actions","Additional actions",[609,6868],"Often before showing Interstitial ads, we disable sounds and music so that they do not conflict with advertising.\nYou can add this code in your project to do it: MagifyService.Instance.Advertiser.OnBeforeShowInterstitialVideo\n    .TakeUntilDestroy(this) // If it's in MonoBehaviour\n    .Subscribe(() => \n    {\n        // Disable audio before inter\n    });\n    \nMagifyService.Instance.Advertiser.OnAfterShowInterstitialVideo\n    .TakeUntilDestroy(this) // If it's in MonoBehaviour\n    .Subscribe(() => \n    {\n        // Enable audio after inter\n    });",{"id":6882,"title":6883,"titles":6884,"content":6885,"level":1104},"/unity-sdk/campaigns/campaignexamples#rewarded-video-campaign","Rewarded video campaign",[609],"Let's imagine a situation where you have a player who is having trouble playing the game and needs a hint. Then you can offer him to watch an advertisement for a reward in exchange for a hint. For this purpose you can implement the code as here. You as a programmer cannot be sure that the requested campaign will surely be a campaign with rewarded ads. This is due to the fact that on the configuration side, any campaign might be configured for this event, as well as different campaigns might be configured for the same event at the same time, over time the configuration might change. public class GameScreen : MonoBehaviour\n{\n    [SerializeField]\n    private Button _getHintButton;\n\n    [Inject]\n    private WalletManager _wallet;\n\n    private void Start()\n    {\n        _getHintButton.OnClickAsObservable()\n            .TakeUntilDestroy(this)\n            .Subscribe(_ => GetHint());\n    }\n\n    private async UniTaskVoid GetHint()\n    {\n        _getHintButton.interactable = false;\n        // this line of code runs the async processing of the campaign\n        // \"hint_tapped\" is the application event that the campaign was configured for\n        await MagifyService.Instance.RequestCampaignAsync(\"hint_tapped\");\n\n        if (_wallet.TrySpend(\"hint\"))\n        {\n            // use hint\n        }\n        _getHintButton.interactable = true;\n    }\n}",{"id":6887,"title":6873,"titles":6888,"content":6889,"level":1120},"/unity-sdk/campaigns/campaignexamples#products-handling-1",[609,6883],"Then you can have a class like wallet, which stores all the resources that the user has and allow to spend them. Then in it you can observe Magify to handle all the products: public class WalletManager\n{\n    private readonly Dictionary\u003Cstring, float> _items = new();\n\n    public async UniTask Initialize()\n    {\n        var magify = await MagifyService.WaitForInitialized();\n        magify.Obtainer.OnProductObtained\n            .Subscribe(result =>\n            {\n                // For example 'Type' and 'Quantity' for 'result.Product.Payout' elements might be:\n                // 'hint' and '1'\n                foreach (var payout in result.Product.Payout)\n                {\n                    _items[payout.Type] += payout.Quantity;\n                }\n            });\n    }\n\n    public bool TrySpend(string resource)\n    {\n        if (_items.ContainsKey(resource) && _items[resource] >= 0)\n        {\n            _items[resource] -= 1;\n            return true;\n        }\n        return false;\n    }\n}",{"id":6891,"title":6878,"titles":6892,"content":6893,"level":1120},"/unity-sdk/campaigns/campaignexamples#additional-actions-1",[609,6883],"Often before showing Rewarded ads, we disable sounds and music so that they do not conflict with advertising.\nYou can add this code in your project to do it: MagifyService.Instance.Advertiser.OnBeforeShowRewardVideo\n    .TakeUntilDestroy(this) // If it's in MonoBehaviour\n    .Subscribe(() => \n    {\n        // Disable audio before rewarded ads\n    });\n    \nMagifyService.Instance.Advertiser.OnAfterShowRewardVideo\n    .TakeUntilDestroy(this) // If it's in MonoBehaviour\n    .Subscribe(() => \n    {\n        // Enable audio after rewarded ads\n    });",{"id":6895,"title":6896,"titles":6897,"content":6898,"level":1104},"/unity-sdk/campaigns/campaignexamples#in-app-campaign","In-app campaign",[609],"Let's imagine that you have a skin system in your game. You want the player to be able to buy some skins. Then you can create a campaign that will be a skin store. This campaign will contain skins that the player can buy as a product. You as a programmer cannot be sure that the requested campaign will surely be a campaign with in-apps, it might be mixed campaign, for example. This is due to the fact that on the configuration side, any campaign might be configured for this event, as well as different campaigns might be configured for the same event at the same time, over time the configuration might change. public class HomeScreen : MonoBehaviour\n{\n    [SerializeField]\n    private Button _openSkinShopButton;\n\n    private void Start()\n    {\n        _openSkinShopButton.OnClickAsObservable()\n            .TakeUntilDestroy(this)\n            .Subscribe(_ => OpenSkinShop());\n    }\n\n    private async UniTaskVoid OpenSkinShop()\n    {\n        _openSkinShopButton.interactable = false;\n        // this line of code runs the async processing of the campaign\n        // \"skin_shop\" is the application event that the campaign was configured for\n        // dictionary contains parameters for this campaign\n        await MagifyService.Instance.RequestCampaignAsync(\"skin_shop\", new Dictionary\u003Cstring, object>\n        {\n            { \"opened_from\", \"home_screen\" },\n        });\n\n        _openSkinShopButton.interactable = true;\n    }\n}",{"id":6900,"title":6901,"titles":6902,"content":6903,"level":1120},"/unity-sdk/campaigns/campaignexamples#custom-skin-shop-popup","Custom skin-shop popup",[609,6896],"For the following code to work, the campaign must be configured with a custom creative. And ScreenId should be set for example with this value: \"SkinShopScreenPrefab\". At the same time, if you use ResourcesPopupsProvider, then your Resources folder must have a prefab with the same name \"SkinShopScreenPrefab\", as well as the SkinShopScreen component: public class SkinShopScreen : PopupBase\u003CCreativePopup.Args>, IPopupWithProducts\u003CCreativePopup.Args>\n{\n    [SerializeField]\n    private Button _buySelectedSkinButton;\n    private ProductDef _selectedSkin;\n\n    public event Action\u003CProductDef> OnClicked;\n\n    protected override void PrepareForShow(CreativePopup.Args arguments, CompositeDisposable disposables)\n    {\n        base.PrepareForShow(arguments, disposables);\n        foreach (var product in arguments.Products)\n        {\n            // fill this skin shop with products (skins)\n        }\n\n        _buySelectedSkinButton.OnClickAsObservable()\n            .Subscribe(_ => BuySelectedSkin().Forget())\n            .AddTo(disposables);\n    }\n\n    public void UpdateProducts(IReadOnlyList\u003CProductDef> products)\n    {\n        foreach (var product in products)\n        {\n            // refill this skin shop with products (skins)\n        }\n    }\n\n    private async UniTaskVoid BuySelectedSkin()\n    {\n        _buySelectedSkinButton.interactable = false;\n        OnClicked?.Invoke(_selectedSkin); // it will make Magify SDK initiate purchasing of in-app product\n        _buySelectedSkinButton.interactable = true;\n    }\n}",{"id":6905,"title":6906,"titles":6907,"content":6908,"level":1120},"/unity-sdk/campaigns/campaignexamples#skin-purchasing-handling","Skin purchasing handling",[609,6896],"As a result if the purchase completed successfully, then you can get the skin and give the player access to it. public class SkinsManager\n{\n    private readonly List\u003Cstring> _unlockedSkins = new();\n\n    public async UniTask Initialize()\n    {\n        var magify = await MagifyService.WaitForInitialized();\n        magify.Obtainer.OnProductObtained\n            .Subscribe(result =>\n            {\n                _unlockedSkins.Add(result.Product.Id);\n            });\n    }\n}",{"id":6910,"title":6911,"titles":6912,"content":6913,"level":1104},"/unity-sdk/campaigns/campaignexamples#subscription-campaign","Subscription campaign",[609],"Let's imagine the classic scenario that you have an offer to purchase a subscription on the main screen. Clicking on this offer will show the player a campaign to purchase a subscription. After successful completion of this campaign you can check the subscription status and inform the player about it. You as a programmer cannot be sure that the requested campaign will surely be a campaign with subscription, it might be mixed campaign with different offers, for example. This is due to the fact that on the configuration side, any campaign might be configured for this event, as well as different campaigns might be configured for the same event at the same time, over time the configuration might change. public class HomeScreen : MonoBehaviour\n{\n    [SerializeField]\n    private Button _buySubscription;\n\n    private void Start()\n    {\n        _buySubscription.OnClickAsObservable()\n            .TakeUntilDestroy(this)\n            .Subscribe(_ => BuySubscription().Forget());\n    }\n\n    private async UniTaskVoid BuySubscription()\n    {\n        _buySubscription.interactable = false;\n        // this line of code runs the async processing of the campaign\n        // \"premium_subscription\" is the application event that the campaign was configured for\n        var result = await MagifyService.Instance.RequestCampaignAsync(\"premium_subscription\");\n\n        if (result == CampaignResult.Applied)\n        {\n            switch (MagifyService.Instance.Prefs.SubscriptionStatus.Value)\n            {\n                case SubscriptionStatus.Trial:\n                    // let the user know that they have a trial subscription\n                    break;\n                case SubscriptionStatus.Paid:\n                    // let the user know that they have purchased a subscription\n                    break;\n            }\n        }\n\n        _buySubscription.interactable = true;\n    }\n}",{"id":6915,"title":6916,"titles":6917,"content":6918,"level":1104},"/unity-sdk/campaigns/campaignexamples#bonus-campaign","Bonus campaign",[609],"Let's imagine that you want to give a user a bonus for simply opening the app. For this purpose, a campaign can be configured for ConsentGivenEvent or SessionStartedEvent (see here) and with limit only once a day (see here). In this case you will achieve the effect that the campaign triggers on the opening of the application but it triggers only once per day and the player can get the bonus only once per day. You as a programmer cannot be sure that the requested campaign will surely be a campaign with interstitial ads. This is due to the fact that on the configuration side, any campaign might be configured for this event, as well as different campaigns might be configured for the same event at the same time, over time the configuration might change. public class FirstScreen : MonoBehaviour\n{\n    private async void Start()\n    {\n        // it triggers `ConsentGivenEvent` or `SessionStartedEvent` event\n        await MagifyService.Instance.RequestSessionStartAsync();\n    }\n}",{"id":6920,"title":6873,"titles":6921,"content":6922,"level":1120},"/unity-sdk/campaigns/campaignexamples#products-handling-2",[609,6916],"Then you can have a class like wallet, which stores all the resources that the user has. Then in it you can observe Magify to handle all the products: public class WalletManager\n{\n    private readonly Dictionary\u003Cstring, float> _items = new();\n\n    public async UniTask Initialize()\n    {\n        var magify = await MagifyService.WaitForInitialized();\n        magify.Obtainer.OnProductObtained\n            .Subscribe(result =>\n            {\n                // For example 'Type' and 'Quantity' for 'result.Product.Payout' elements might be:\n                // 'Coins' and '10'\n                foreach (var payout in result.Product.Payout)\n                {\n                    _items[payout.Type] += payout.Quantity;\n                }\n            });\n    }\n} html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":614,"title":613,"titles":6924,"content":6925,"level":1110},[],"Description of the Magify customization Here you can find information about the various ways to customize SDK: Request config by scopes allows you to configure which config's scopes will be downloaded;Bundle creatives guides you how to build bundle creatives via our SDK.",{"id":620,"title":619,"titles":6927,"content":6928,"level":1110},[],"Description how to request config by scopes",{"id":6930,"title":6931,"titles":6932,"content":6933,"level":1104},"/unity-sdk/customization/requestconfigbyscopes#main-concept","Main concept",[619],"Our SDK delivers the main content using an application config that is downloaded from our servers (and can be embedded in the build). This config consists of different scopes, which have different meanings. In some cases you may need to download these scopes separately. For example, if you want to download all the app's initial launch features first, and then get the rest of the content.",{"id":6935,"title":6455,"titles":6936,"content":6937,"level":1104},"/unity-sdk/customization/requestconfigbyscopes#usage",[619],"You can install the scopes you need in the following ways: MagifyService.Instance.RemoteConfigScopes.Value = ConfigScope.AppFeatures; After the value is set, the current request for the config (if any) will be canceled because the conditions with which the config should be loaded have changed. Therefore, if you want the config to still be loaded after the scopes have been changed, you should call MagifyService.Sync",{"id":6939,"title":6940,"titles":6941,"content":6942,"level":1120},"/unity-sdk/customization/requestconfigbyscopes#flag-enum-operations","Flag-enum operations",[619,6455],"ConfigScope is a flag-enum, accordingly, it supports all operations for flag-enums: // Create scopes, that includes Campaigns + Limits + AppFeatures\nvar scopes = ConfigScope.Campaigns | ConfigScope.Limits | ConfigScope.AppFeatures;\n// Set created scopes\nMagifyService.Instance.RemoteConfigScopes.Value = scopes;\n\n// ...\n// Then, might be you want to remove AppFeatures scope\nMagifyService.Instance.RemoteConfigScopes.Value &= ~ConfigScope.AppFeatures;\n// And add Segmentations scope\nMagifyService.Instance.RemoteConfigScopes.Value |= ConfigScope.Segmentations;\n\n// And you want to sync config immediately\nMagifyService.Instance.Sync();",{"id":6944,"title":6945,"titles":6946,"content":6947,"level":1120},"/unity-sdk/customization/requestconfigbyscopes#pass-on-initialization","Pass on initialization",[619,6455],"You can also pass a list of scopes during the SDK initialization: var = magifyServiceArgs = new MagifyServiceArgs\n{\n    IsSandbox = true,\n    RemoteConfigScopes = ConfigScope.AppFeatures | ConfigScope.ProductIds,\n};\nvar service = MagifyService.Initialize(settings, magifyServiceArgs);",{"id":6949,"title":6950,"titles":6951,"content":6952,"level":1120},"/unity-sdk/customization/requestconfigbyscopes#none-value","None value",[619,6455],"The default value of MagifyService.RemoteConfigScopes is ConfigScope.None. If this value is set, the entire configuration will be requested.",{"id":6954,"title":6955,"titles":6956,"content":467,"level":1104},"/unity-sdk/customization/requestconfigbyscopes#notes","Notes",[619],{"id":6958,"title":6959,"titles":6960,"content":6961,"level":1120},"/unity-sdk/customization/requestconfigbyscopes#explict-requests","Explict requests",[619,6955],"Keep in mind that there are config scopes that are generated by the server only when explicitly requested, their list may be extended, currently they are the following scopes: SegmentationsAbTests",{"id":6963,"title":6964,"titles":6965,"content":6966,"level":1120},"/unity-sdk/customization/requestconfigbyscopes#configscopeproductids","ConfigScope.ProductIds",[619,6955],"You should realize, that ConfigScope.ProductIds content is using by Magify SDK internally (for external purchases tracking, subscription status calculation and others), so you should be careful and request this scope at least once. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":624,"title":623,"titles":6968,"content":6969,"level":1110},[],"Description of the building and using of bundle creatives",{"id":6971,"title":4180,"titles":6972,"content":6973,"level":1104},"/unity-sdk/customization/bundlecreatives#overview",[623],"Games often have entities that are not in the application at the build-time, but are uploaded to the server as asset bundles and downloaded in the runtime game for later display to the player. In our SDK they are represented by default as bundle creatives that you can add for different campaigns. For example, it could be LTO badges, promotional popups like NoAds, etc:",{"id":6975,"title":5090,"titles":6976,"content":6977,"level":1104},"/unity-sdk/customization/bundlecreatives#how-it-works",[623],"The principle of working with bandles is quite simple: You build the prefab in the Unity project;Then use the 'Creative Builder' tool provided by our SDK to build the prefabs into .bundle-files;Which you can then upload to our server;Then, in-game, when you use some campaign with bundle creativity, the previously uploaded bundle will be downloaded to the player's device and made available for interaction.",{"id":6979,"title":6980,"titles":6981,"content":6982,"level":1120},"/unity-sdk/customization/bundlecreatives#prefab-setup","Prefab setup",[623,5090],"A prefab that needs to be packaged in a bundle must necessarily have the following components in its root object: BundledPrefab (preferred) or BundledCreative:\nBundledPrefab – indicates that the bundle uses RectTransform and should be displayed on a Canvas;BundledCreative – an older version of bundles using RenderTexture as a way to display bundles on Canvas.CreativeControls– script, that contains standard fields for creatives that are needed to close them and interact with the campaign:\nClose Button – the field should indicate the button that will close the creative (is a required field);Colored Parts – the color specified in the campaign creative will be applied to all graphic elements placed in this field;Opacity Parts – the color and transparency specified in the campaign creative will be applied to all graphic elements placed in this field;Items Buttons – a list of buttons to click on which will be considered as the player's consent to perform the action proposed by the creative.",{"id":6984,"title":6985,"titles":6986,"content":6987,"level":1120},"/unity-sdk/customization/bundlecreatives#bundles-building","Bundles building",[623,5090],"Open the Creative Builder window in the bar menu, select Magify > Open Bundle Builder, and the Creative Builder window will open. In the window do the following:\nChoose the prefabs you want to build;If you are not sure if your creative prefab is configured correctly, click the Check button, it will display a panel that will tell you if your creative is configured correctly, if not, it will show you what errors it has;Toggle 'Include all languages in one bundle' if you want to have only one bundle with different localizations;Select one or more target platforms from the drop-down list for which you want to collect bundles (Mobile - includes two ticks at once for Android and for iOS);Click the Build button and wait for the build to complete;Check the \"project_directory/Bundles/platform/creative_name/\" folder.",{"id":6989,"title":6990,"titles":6991,"content":6992,"level":1120},"/unity-sdk/customization/bundlecreatives#uploading-to-server","Uploading to server",[623,5090],"To add bundle creative to a specific campaign you must open that campaign to the configuration page, then go to the campaign creative or create new one. It is important that the type of creative must be Bundle Creative. You must then create a child element of this creative. Then you can select the bundle file and set its language. Now for this creative of campaign, depending on the player's language setting, the required bundle will be choosen. In case you have built a bundle creative with all languages included you can select only English language in which case this bundle will be considered as default for all languages.",{"id":6994,"title":613,"titles":6995,"content":467,"level":1104},"/unity-sdk/customization/bundlecreatives#customization",[623],{"id":6997,"title":6998,"titles":6999,"content":7000,"level":1120},"/unity-sdk/customization/bundlecreatives#localization-support","Localization support",[623,613],"If the creative contains texts translated into different languages, we add the Bundle Localization component to the prefab root. And then you will need to select the necessary locales by checkboxes:",{"id":628,"title":627,"titles":7002,"content":7003,"level":1110},[],"Description of work with low-level API through Magify Manager",{"id":7005,"title":4180,"titles":7006,"content":7007,"level":1104},"/unity-sdk/magify-manager#overview",[627],"MagifyManager is the main entry point to the SDK and provides the entire API to Magify's core functions.\nMuch of the API provides access to raw data without initiating any lengthy processes within the application. Generally, you may have a need to interact with MagifyManager in case you need to very flexibly customize your application's interaction with Magify.",{"id":7009,"title":7010,"titles":7011,"content":7012,"level":1104},"/unity-sdk/magify-manager#initialize-magify","Initialize Magify",[627],"using UnityEngine;\nusing Magify;\n\npublic class MagifyInitializer : MonoBehaviour\n{\n    private void Start()\n    {\n        var config = Debug.isDebugBuild\n            ? CreateDevConfig()\n            : CreateProdConfig();\n        MagifyManager.Initialize(config);\n    }\n\n    private MagifyConfig CreateDevConfig() => new MagifyConfig\n    {\n        AppNameIOS = \"application_ios\",\n        ConfigPathIOS = \"SandboxConfigIOS.json\",\n        AppNameGP = \"application_gp\",\n        ConfigPathGP = \"SandboxConfigGP.json\",\n        UseAdvancedVersion = true,\n        SyncStateEnabled = true,\n        IsSandbox = true,\n        IsLoggingEnabled = true,\n        SubscriptionStatus = SubscriptionStatus.Paid,\n    };\n\n    private MagifyConfig CreateProdConfig() => new MagifyConfig\n    {\n        AppNameIOS = \"application_ios\",\n        ConfigPathIOS = \"ConfigIOS.json\",\n        AppNameGP = \"application_gp\",\n        ConfigPathGP = \"ConfigGP.json\",\n        UseAdvancedVersion = true,\n        SyncStateEnabled = true,\n        IsSandbox = false,\n        SubscriptionStatus = SubscriptionStatus.Inactive,\n    };\n\n    private void ApplicationQuittingHandler()\n    {\n        MagifyManager.ShutDown();\n    }\n} Please note that upon completing your interaction with Magify, typically when exiting your application, it's advisable to call the MagifyManager.ShutDown() method. This ensures the proper termination of internal processes within the SDK for a clean and graceful conclusion of its operations. Note that you shouldn't call Initialize() and ShutDown() too many times. It is better to call them only once during the whole game cycle. Otherwise it may affect performance.",{"id":7014,"title":6375,"titles":7015,"content":7016,"level":1104},"/unity-sdk/magify-manager#use-clientid-for-all-integrations",[627],"Connect with 3rd party services. If your app has Appsflyer, Adjust, RevenueCat or another sdks, you should initialize them with ClientId provided by Magify: var clientId = MagifyManager.ClientId;\n\n// AppsFlyer\nAppsFlyer.setCustomerUserID(clientId);\n\n// RevenueCat\nvar purchases = GetComponent\u003CPurchases>();\npurchases.appUserID = clientId;\n\n// Adjust\nvar adjustConfig = new AdjustConfig(\"{YourAppToken}\", yourEnvironment)\n{\n    ExternalDeviceId = clientId,\n};\nadjustConfig.SessionSuccessDelegate += success => MagifyManager.AdjustId = success.Adid;\nadjustConfig.SessionFailureDelegate += failure => MagifyManager.AdjustId = failure.Adid;\nAdjust.AddGlobalCallbackParameter(\"client_id\", clientId);\nAdjust.AddGlobalPartnerParameter(\"client_id\", clientId);\nAdjust.InitSdk(adjustConfig);\n// for old adjust sdk see here: https://magify.atlassian.net/wiki/spaces/GW/pages/1283362/Adjust+sdk\n\n// Crashlytics\nCrashlytics.SetUserId(clientId);\n\n// GameAnalytics\nGameAnalytics.SetCustomId(clientId);\n\n// Applovin MAX (you don't need to do it if you use Magify.MaxMediator)\nMaxSdk.SetUserId(clientId);\n\n// LevelPlay / IronSource (you don't need to do it if you use Magify.LevelPlayMediator)\nIronSource.Agent.setUserId(clientId);\n\n// etc. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"id":633,"title":552,"titles":7018,"content":7019,"level":1110},[],"Description of work with analytics via Magify Manager",{"id":7021,"title":6517,"titles":7022,"content":7023,"level":1104},"/unity-sdk/magify-manager/analytics#preparation",[552],"Remember, you need to configure and initialize the Magify Manager to collect analytics. You may also want to pass some configuration parameters to better collect analytics: Set iOS ATT status on initialization or later in runtime;Set GDPR agreement status on initialization or later in runtime;Set media source in runtime.",{"id":7025,"title":7026,"titles":7027,"content":7028,"level":1104},"/unity-sdk/magify-manager/analytics#api","API",[552],"Magify provides a wide API for collecting analytics of different types. You can explore the available methods here.",{"id":636,"title":562,"titles":7030,"content":7031,"level":1110},[],"Description of work with purchases via Magify Manager",{"id":7033,"title":6517,"titles":7034,"content":7035,"level":1104},"/unity-sdk/magify-manager/purchases#preparation",[562],"Remember, you need to configure and initialize the Magify Manager to handle purchases.",{"id":7037,"title":4180,"titles":7038,"content":7039,"level":1104},"/unity-sdk/magify-manager/purchases#overview",[562],"InApp purchases affect the user's in-app status and paying status.\nSubscriptions at the same time affect the subscription status and paying status of the user.\nWe need this to properly segment and filter users. Magify SDK works with 3 kind of statuses: InApp status - determines whether the user has purchased any in-app product;Subscription status - determines the status of the user's in-game subscription;Paying status - combination of the 2 statuses above determines whether the user has spent money on the game;",{"id":7041,"title":6606,"titles":7042,"content":6608,"level":1120},"/unity-sdk/magify-manager/purchases#inapp-status",[562,4180],{"id":7044,"title":6611,"titles":7045,"content":6613,"level":1120},"/unity-sdk/magify-manager/purchases#subscription-status",[562,4180],{"id":7047,"title":7026,"titles":7048,"content":7049,"level":1104},"/unity-sdk/magify-manager/purchases#api",[562],"Magify provides a wide API for handling of purchases and subscriptions. You can explore the available methods here.",{"id":7051,"title":6596,"titles":7052,"content":6598,"level":1104},"/unity-sdk/magify-manager/purchases#purchases-validaton",[562],{"id":7054,"title":7055,"titles":7056,"content":467,"level":1104},"/unity-sdk/magify-manager/purchases#without-validation","Without validation",[562],{"id":7058,"title":4180,"titles":7059,"content":6660,"level":1104},"/unity-sdk/magify-manager/purchases#overview-1",[562],{"id":7061,"title":6663,"titles":7062,"content":7063,"level":1104},"/unity-sdk/magify-manager/purchases#_1-sending-from-client",[562],"If you have the data about a valid purchase on the client side (in the application), you can pass this data to Magify, in this case this purchase will be considered valid and can be processed to create analytics repors. We call this type of purchase tracking \"trusted purchases\", which implies that you have already validated your purchases and we can trust the revenue data. To track it you need to create a TrustedPurchaseRecord data model, that contains all the necessary information about valudated transaction. We highly recommend not to use constructors of this class, but instead use static constructor methods that cover all possible and necessary for Magify events related to trusted purchases.",{"id":7065,"title":7066,"titles":7067,"content":7068,"level":1120},"/unity-sdk/magify-manager/purchases#trusted-purchase-tracking-methods","Trusted purchase tracking methods",[562,6663],"To track the purchase depending on the type of it you can use following methods: TrackTrustedInAppFor for the initial verified in-app purchaseTrackExternalTrustedInAppFor for the initial external (made not through campaign) verified in-app purchaseTrackTrustedSubscriptionActivation for the initial verified subscription purchaseTrackExternalTrustedSubscriptionActivation for the initial external (made not through campaign) verified subscription purchaseTrackTrustedPurchase for the additional purchasing information. For example, information about renewing or canceling a subscription, or to send refund information for an in-app purchase/subscription purchase (in other words, to send any type of data other than initial purchases).",{"id":7070,"title":6668,"titles":7071,"content":7072,"level":1104},"/unity-sdk/magify-manager/purchases#_2-server-to-server",[562],"If you have some external or own web service responsible for purchases validation, you can send data about failed purchases directly to the Magify server. Since the current page covers only SDK (client) side work, it will not describe how to configure Server-to-server communication (you can learn more about this by contacting Magify manager). However, you should also keep in mind that on the client side you will need to make small tweaks to make the approach work correctly. Although the purchase validity data will be sent directly to the server, the client side has to send some necessary analytics data itself, so even in this case you need to track purchases on the client side, but with a small peculiarity: after making a purchase, when creating an instance of PurchaseInfo (see IMinimalInAppStore or IInAppStore) you must set the SkipVerification flag to True. In this case Magify SDK will not request validation using Magify services. This completes the configuration of Server-to-server validation on the client side. Once the property value is set, you can continue processing PurchaseInfo and pass it on to Magify.",{"id":640,"title":639,"titles":7074,"content":7075,"level":1110},[],"Description of work with app features via Magify Manager",{"id":7077,"title":6517,"titles":7078,"content":7079,"level":1104},"/unity-sdk/magify-manager/appfeatures#preparation",[639],"Remember, you need to configure and initialize the Magify Manager to work with app features.",{"id":7081,"title":4180,"titles":7082,"content":7083,"level":1104},"/unity-sdk/magify-manager/appfeatures#overview",[639],"Currently app features in our SDK can be conditionally divided into 2 types: value-features and stored app features. The main difference is that the list of value-features is loaded together with the values of features, while stored app features values are separate files and are loaded separately from the list of current features. Usually you only need value-features, but when you want to pass some large amount of customization data, it is better to package it in a separate file and put it in stored app features. Below are examples of how to use these types of features.",{"id":7085,"title":6730,"titles":7086,"content":7087,"level":1120},"/unity-sdk/magify-manager/appfeatures#value-features",[639,4180],"The simplest use case might look like this: public class WinScreen\n{\n    [SerializeField]\n    private TextMeshProUGUI _rewardAmountText;\n    [SerializeField]\n    private GameObject _specialOfferIcon;\n\n    public void Init()\n    {\n        // getting boolean feature by name\n        var showSpecialOfferIcon = MagifyManager.Features.GetBool(\"win_screen_is_special_offer\");\n        _specialOfferIcon.SetActive(showSpecialOfferIcon);\n\n        // default value\n        var rewardAmount = 5.0;\n        // trying to get number feature by name\n        if (MagifyManager.Features.TryGetNumber(\"win_screen_reward_amount\", out var amount))\n            rewardAmount = amount;\n        _rewardAmountText.text = rewardAmount.ToString(CultureInfo.InvariantCulture);\n    }\n}",{"id":7089,"title":6735,"titles":7090,"content":7091,"level":1120},"/unity-sdk/magify-manager/appfeatures#stored-app-features",[639,4180],"One of the uses might be features that are important to start the app when you want the player to start the game with the actual settings. public class Bootstrapper : MonoBehaviour\n{\n    private async void Start()\n    {\n        // your code ...\n        // magify initialization code ...\n\n        const string key = \"startup_critical_features\";\n        if (MagifyManager.Features.StoredAppFeatures.TryGet(\n                key, out var storedAppFeature))\n        {\n            var handle = await MagifyManager.Storage\n                .LoadStoredAppFeature(\n                    storedAppFeature.Url,\n                    timeout: 5,\n                    destroyCancellationToken);\n            if (handle.Code == StorageResultCode.Success)\n            {\n                var criticalFeature = await handle.Value.LoadString()!;\n                // load your game with these critical features values\n            }\n        }\n\n        // your code ...\n    }\n} html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":643,"title":595,"titles":7093,"content":7094,"level":1110},[],"Description of work with campaigns via Magify Manager",{"id":7096,"title":6517,"titles":7097,"content":7079,"level":1104},"/unity-sdk/magify-manager/campaigns#preparation",[595],{"id":7099,"title":6761,"titles":7100,"content":7101,"level":1104},"/unity-sdk/magify-manager/campaigns#campaign-processing-the-heart-of-the-sdk",[595],"Campaign processing is the core functionality of the SDK.\nTo begin your understanding, you can consider that campaigns = application event handlers. For example, on the level_finished game event we have some campaign, that tells us to show Interstitial ad with some configuration and describes the bonus reward for the user. A campaign only makes sense in conjunction with events, when a request for a campaign is made. If a relevant campaign is available, processing begins. The list of events is predetermined and remains unchanged in the live environment - essentially, these events are hardcoded throughout the project. However, campaigns can vary, and different campaigns can be associated with the same events. It's easier to understand how SDK works with a simple example.",{"id":7103,"title":6766,"titles":7104,"content":7105,"level":1120},"/unity-sdk/magify-manager/campaigns#interstitial-ad-campaign-example",[595,6761],"The developer collaborates with the configuration manager to define the application event, for example, level_finished, and specifies when it should trigger - such as when the user presses the Continue button on the result screen. The developer hardcodes the event's invocation, and the configuration manager configures an Interstitial campaign for this event in the admin panel. For this example, the code might look something like this: public class ResultScreen : MonoBehaviour\n{\n    [SerializeField]\n    private Button _continueButton;\n\n    private void Start()\n    {\n        _continueButton.OnClickAsObservable()\n            .TakeUntilDestroy(this)\n            .Subscribe(_ => Continue());\n    }\n\n    private async void Continue()\n    {\n        _continueButton.interactable = false;\n        // \"level_finished\" is the application event \n        // that the campaign was configured for\n        var campaign = MagifyManager.CampaignFor(\"level_finished\");\n        // here you will have different campaign handlers,\n        // but let's focus on only 1 type:\n        if (campaign.Type is CampaignType.Interstitial)\n        {\n            var result = await yourApplovinAds\n                .ShowInterstitialAd(clickHandler =>\n                {\n                    MagifyManager.TrackAdsClickFor(\n                        CampaignType.Interstitial);\n                });\n\n            MaxSdkBase.AdInfo info = result.info;\n            var impression = new ApplovinAdsImpression\n            {\n                Id = info.AdUnitIdentifier,\n                Network = info.NetworkName,\n                Precision = info.RevenuePrecision,\n                Revenue = info.Revenue\n                // Applocin doesn't provide ImpressionId\n                // then leave it empty\n            };\n\n            if (result.IsSucceeded)\n            {\n                MagifyManager.TrackAdsImpression(\n                    CampaignType.Interstitial,\n                    impression);\n            }\n            else\n            {\n                MagifyManager.TrackImpressionFailFor(\n                    CampaignType.Interstitial,\n                    result.FailureReason);\n            }\n        }\n        else { } // handle other types\n\n        _continueButton.interactable = true;\n\n        // Load the next level\n    }\n} This is just a piece of code for an example, it won't work without full configuration.",{"id":7107,"title":6776,"titles":7108,"content":6778,"level":1104},"/unity-sdk/magify-manager/campaigns#components-of-the-campaign",[595],{"id":7110,"title":6781,"titles":7111,"content":6783,"level":1120},"/unity-sdk/magify-manager/campaigns#the-campaign-itself",[595,6776],{"id":7113,"title":6786,"titles":7114,"content":7115,"level":1120},"/unity-sdk/magify-manager/campaigns#campaign-types",[595,6776],"Each specific campaign has its own type that determines what kind of content the campaign can provide and what data set it is described by. The type of campaign also affects how it will be processed. Depending on the type of campaign, you can determine whether the campaign is now available for use or not at the launch stage. For example, a campaign that requires ad views will only be available if there is a functioning ad mediator, and an in-app campaign will only be available if there is a functioning store. CampaignType enum defines all possible campaign types in Magify SDK. Almost every campaign type has its variants for LTO (Limited Time Offer). The following campaign types are currently supported in the Magify SDK: InApp: To offer a purchase within a game product;Subscription: To offer to purchase a subscription;Interstitial: To offer to view intermediate ads;RewardedVideo: To offer to view rewarded ads;Banner: To customize the banner ads;Bonus: To offer to receive a free bonus;RateReview: To offer to rate an app;External: To offer to follow an external link;CrossPromo: To offer to view another of your apps;Notification: To customize notifications;Mixed: A mixed campaign that can include the functionality of all other campaigns. As well as LTO options: LtoInApp;LtoSubscription;LtoRewardedVideo;LtoBonus;LtoExternal;LtoCrossPromo;LtoMixed; It is also important to keep in mind that for almost every type of campaign there is a corresponding type of product, you can read about it in the corresponding section.",{"id":7117,"title":6791,"titles":7118,"content":7119,"level":1120},"/unity-sdk/magify-manager/campaigns#campaign-creatives",[595,6776],"Campaign creative refers to a description of the visual representation of any campaign. The campaign may not contain any creative at all or, for example, the creative may be an image or some application prefab. ICreative interface represents the type of creative content that will be shown to the user during campaign processing. Currently, following types of creatives are supported: NoUiCreative: This is an empty creative, meaning nothing will be displayed to the user, and the campaign's actions will commence during processing. For example, a button in the store by clicking on which will immediately open a native window from PlayMarket or AppleStore with a product that the user can buy.ImageCreative: This creative contains an image that is configured in the admin panel and will be shown to the user within a frame. For example, after the transition to a new level InApp campaign will be requested, which will first show the user an image of what he will get by purchasing this product, the user can close this creative or click on the purchase button after which the native window from the store for purchasing the product will appear.CustomCreative: This is a screen (popup/prefab) embedded in the application, with a configurable `screenId` from the front-end configuratuion panel. It will be requested from the application during campaign processing. Example can be the same as for ImageCreative but, instead of image, some popup (created directly in Unity by you) will be shown to user.BundleCreative: Bundles are entities that are not in the application at the build-time, but are uploaded to the server as asset bundles and downloaded in the runtime game for later display to the user. In our SDK they are represented by default as bundle creatives that you can add for different campaigns. You can read more about building and usage of bundles on the related page. You can read more about creatives on the related page.",{"id":7121,"title":6796,"titles":7122,"content":6798,"level":1120},"/unity-sdk/magify-manager/campaigns#campaign-products",[595,6776],{"id":647,"title":646,"titles":7124,"content":7125,"level":1110},[],"Description of the Magify API Here you can find documentation for Magify API: Magify Service - here you will be able to find MagifyService API;Analytics Service- here you will be able to find various analytics API;Purchases - here you will be able to find various purchases-relater API;Advertisement - here you will be able to find various campaigns API;Features Provider - here you will be able to find various API to with application features;Campaigns - here you will be able to find various campaigns API;Products - here you will be able to find various products API;Creatives - here you will be able to find various creatives-related API;Popups - here you will be able to find various popups-related API;Obtainers - here you will be able to find various product obtiners API;Service Time - here you will be able to find API to get actual time;Network - here you will be able to find various networking API;IAppNavigator - interface is used by our SDK to perform navigate to a given internal links;Utils - here you will be able to find various utilities API;Magify Manager - here you will be able to find MagifyManager API.",{"id":653,"title":652,"titles":7127,"content":7128,"level":1110},[],"Description of the MagifyService API",{"id":7130,"title":7131,"titles":7132,"content":7133,"level":1104},"/unity-sdk/api-collection/magify-service#internal-services","Internal services",[652],"Some auxiliary functionality is encapsulated in separate classes, which can be accessed directly through the MagifyService.ServiceName. Below is a list of these services with brief descriptions: Advertiser: Manages advertising-related functionality;Subscription: Responsible for subscription info and status;Analytics: Responsible for sending analytics data;Time: Provides the current server time;Network: Provides information about network state;Prefs: Stores general values for the Magify Service.",{"id":7135,"title":7136,"titles":7137,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#static","Static",[652],{"id":7139,"title":7140,"titles":7141,"content":7142,"level":1120},"/unity-sdk/api-collection/magify-service#instance","Instance",[652,7136],"static MagifyService Instance { get; } Provides access to current initialized Magify Service. MagifyService.Initialize(settings, args) must be called before.",{"id":7144,"title":7145,"titles":7146,"content":7147,"level":1120},"/unity-sdk/api-collection/magify-service#initialize","Initialize",[652,7136],"static MagifyService Initialize([NotNull] MagifySettings settings, [CanBeNull] MagifyServiceArgs args) Initializes Magify SDK with providen settings and arguments.",{"id":7149,"title":7150,"titles":7151,"content":7152,"level":1120},"/unity-sdk/api-collection/magify-service#terminate","Terminate",[652,7136],"static void Terminate() Terminates current Magify Service instance.",{"id":7154,"title":7155,"titles":7156,"content":7157,"level":1120},"/unity-sdk/api-collection/magify-service#waitforinitialized","WaitForInitialized",[652,7136],"static UniTask\u003CMagifyService> WaitForInitialized(CancellationToken cancellationToken, PlayerLoopTiming timing = PlayerLoopTiming.Update) This method allows you to wait until MagifyService is initialized and get it.",{"id":7159,"title":7160,"titles":7161,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#properties","Properties",[652],{"id":7163,"title":7164,"titles":7165,"content":7166,"level":1120},"/unity-sdk/api-collection/magify-service#clientid","ClientId",[652,7160],"string ClientId { get; } The primary method of user identification in Magify SDK. Randomly generated GUID string. Used for linking analytics, saving progress and many other processes. Also, can be passed to other SDKs for linking.",{"id":7168,"title":7169,"titles":7170,"content":7171,"level":1120},"/unity-sdk/api-collection/magify-service#customclientid","CustomClientId",[652,7160],"CustomClientId CustomClientId { get; } Allow setting a custom client identifier instead of an automatically generated one, if you are integrating the SDK with your own solution",{"id":7173,"title":7174,"titles":7175,"content":7176,"level":1120},"/unity-sdk/api-collection/magify-service#session","Session",[652,7160],"IReadOnlyReactiveProperty\u003Cint> Session { get; } Stores the current session number.",{"id":7178,"title":7179,"titles":7180,"content":7181,"level":1120},"/unity-sdk/api-collection/magify-service#sessionsinterval","SessionsInterval",[652,7160],"IReactiveProperty\u003CTimeSpan> SessionsInterval { get; } Represents the current interval between sessions, that will be used to determine the new session start when player returns to the game after a long pause (when app is in background).",{"id":7183,"title":7184,"titles":7185,"content":7186,"level":1120},"/unity-sdk/api-collection/magify-service#environment","Environment",[652,7160],"[Obsolete]\nIReactiveProperty\u003CEnvironment> Environment { get; } You should no longer use this property. It is obsolete and will be removed in approximately the second half of 2026. Consider using MagifyServiceArgs.IsSandbox instead.",{"id":7188,"title":7189,"titles":7190,"content":7191,"level":1120},"/unity-sdk/api-collection/magify-service#isloggingenabled","IsLoggingEnabled",[652,7160],"IReactiveProperty\u003Cbool> IsLoggingEnabled { get; } This property determines whether logging is turned on or off in the SKD.",{"id":7193,"title":7194,"titles":7195,"content":7196,"level":1120},"/unity-sdk/api-collection/magify-service#externalpurchaseverificationhandler","ExternalPurchaseVerificationHandler",[652,7160],"IReactiveProperty\u003CIPurchaseVerificationHandler> ExternalPurchaseVerificationHandler Allows you to control purchases verification process and get the result of it.",{"id":7198,"title":7199,"titles":7200,"content":7201,"level":1120},"/unity-sdk/api-collection/magify-service#verificationretryinterval","VerificationRetryInterval",[652,7160],"FloatReactiveProperty VerificationRetryInterval The time in seconds between purchase verification attempts. Minimum allowed value is 1 second.",{"id":7203,"title":7204,"titles":7205,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#external-handlers","External handlers",[652],{"id":7207,"title":7208,"titles":7209,"content":7210,"level":1120},"/unity-sdk/api-collection/magify-service#setadsmediator","SetAdsMediator",[652,7204],"MagifyService SetAdsMediator([CanBeNull] IMinimalAdsMediator mediator) The method allows you to tell SDK which IMinimalAdsMediator implementation to use when working with ads. Used in Advertiser.",{"id":7212,"title":7213,"titles":7214,"content":7215,"level":1120},"/unity-sdk/api-collection/magify-service#setpurchasingprovider","SetPurchasingProvider",[652,7204],"MagifyService SetPurchasingProvider([CanBeNull] IMinimalInAppStore inAppStore) The method allows you to tell SDK which implementation of IMinimalInAppStore to use for handling InApp purchases and subscriptions. This method should be called right after the service initialization.It is and is used in Purchaser.",{"id":7217,"title":7218,"titles":7219,"content":7220,"level":1120},"/unity-sdk/api-collection/magify-service#useembeddedmaxmediator","UseEmbeddedMaxMediator",[652,7204],"MagifyService UseEmbeddedMaxMediator() The method tells the SDK to use as IMinimalAdsMediator the MaxMediator implementation that is provided by the SDK out of the box. More about Applovin MAX sdk integration.",{"id":7222,"title":7223,"titles":7224,"content":7225,"level":1120},"/unity-sdk/api-collection/magify-service#initializeembeddedmaxmediator","InitializeEmbeddedMaxMediator",[652,7204],"MagifyService InitializeEmbeddedMaxMediator() It will configure the embedded MaxMediatot implementation before tracking and showing of ads. UseEmbeddedMaxMediator must be called before",{"id":7227,"title":7228,"titles":7229,"content":7230,"level":1120},"/unity-sdk/api-collection/magify-service#useembeddedlevelplaymediator","UseEmbeddedLevelPlayMediator",[652,7204],"MagifyService UseEmbeddedLevelPlayMediator() The method tells the SDK to use as IMinimalAdsMediator the LevelPlayMediator implementation that is provided by the SDK out of the box.",{"id":7232,"title":7233,"titles":7234,"content":7235,"level":1120},"/unity-sdk/api-collection/magify-service#initializeembeddedlevelplaymediator","InitializeEmbeddedLevelPlayMediator",[652,7204],"MagifyService InitializeEmbeddedLevelPlayMediator(bool testSuite = false) It will configure the embedded LevelPlayMediator implementation before tracking and showing of ads. UseEmbeddedLevelPlayMediator must be called before",{"id":7237,"title":7238,"titles":7239,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#additional-api","Additional API",[652],{"id":7241,"title":7242,"titles":7243,"content":7244,"level":1120},"/unity-sdk/api-collection/magify-service#setattstatus","SetAttStatus",[652,7238],"void SetAttStatus(bool authorized) The method tells to SDK that the user has been agreed or disagreed to iOS ATT.",{"id":7246,"title":7247,"titles":7248,"content":7249,"level":1120},"/unity-sdk/api-collection/magify-service#setmediasource","SetMediaSource",[652,7238],"void SetMediaSource(\n    string networkName = null, \n    string campaignName = null, \n    string adGroup = null) You can set the media source in real time. If this method hasn’t been called, the SDK will return mediaSource = null. Optionally you can set attribution info if any. At any time when information is received, pass it to Magify SDK. This data provides information about what source the user came from. network - source network namecampaign - acquisition campaign nameadGroup - acquisition ads group name Retrieving the Media Source (for example, from Adjust) remains on the client side. What it would look like in the case of Adjust (read more): var attribution = Adjust.getAttribution();\nvar network = attribution.network;\nvar campaign = attribution.campaign;\nvar adgroup = attribution.adgroup;\nMagifyService.Instance.SetMediaSource(network, campaign, adgroup);",{"id":7251,"title":7252,"titles":7253,"content":7254,"level":1120},"/unity-sdk/api-collection/magify-service#reset","Reset",[652,7238],"void Reset(bool clearNativeStorage = true, bool clearCloudStorage = true) The method tells SDK to reset the current state and data that it stores on the drive. Use it only for testing. Shouldn’t use in production builds.\nYou also can configure resetting of native SDK-related data in storage and cloud storage: in case of iOS: keychain & iCloud",{"id":7256,"title":7257,"titles":7258,"content":7259,"level":1104},"/unity-sdk/api-collection/magify-service#adnvanced-integration-only","Adnvanced integration only",[652],"Remember that you must enable advanced integration in the SDK to use the following API.",{"id":7261,"title":7262,"titles":7263,"content":7264,"level":1104},"/unity-sdk/api-collection/magify-service#internal-services-1","Internal Services",[652],"Some auxiliary functionality is encapsulated in separate classes, which can be accessed directly through the MagifyService.ServiceName. Below is a list of these services with brief descriptions: Purchaser: Handles in-app purchases;Obtainer: Handles obtaining in-game products by players;Offers: Works with limited-time offers (LTO);Features: Manages remote properties;Campaigns: Retrieves and processes campaigns;Presenter: Default canvas for displaying all popups;AppNavigator: Controls navitaion by internal links for Internal Link campaigns.",{"id":7266,"title":7160,"titles":7267,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#properties-1",[652],{"id":7269,"title":7270,"titles":7271,"content":7272,"level":1120},"/unity-sdk/api-collection/magify-service#sessionstarted","SessionStarted",[652,7160],"IReadOnlyReactiveProperty\u003Cbool> SessionStarted { get; } Indicates whether the RequestSessionStartAsync method has been called.",{"id":7274,"title":7275,"titles":7276,"content":7277,"level":1120},"/unity-sdk/api-collection/magify-service#sessionsinterval-overriden","SessionsInterval (overriden)",[652,7160],"IReadOnlyReactiveProperty\u003CTimeSpan> SessionsInterval { get; } Represents the current interval between sessions, that will be used to determine the new session start when player returns to the game after a long pause (when app is in background). The SDK automatically detects it by the SessionsInterval limit.",{"id":7279,"title":7280,"titles":7281,"content":7282,"level":1120},"/unity-sdk/api-collection/magify-service#firstinstalledversion","FirstInstalledVersion",[652,7160],"string FirstInstalledVersion { get; } Returns first installed version of the app (that had Magify SDK integrated).",{"id":7284,"title":7285,"titles":7286,"content":7287,"level":1120},"/unity-sdk/api-collection/magify-service#onconfigsynced","OnConfigSynced",[652,7160],"IObservable\u003CUnit> OnConfigSynced { get; } Notifies when each config is downloaded from the server.",{"id":7289,"title":7290,"titles":7291,"content":7292,"level":1120},"/unity-sdk/api-collection/magify-service#remoteconfigscopes","RemoteConfigScopes",[652,7160],"IReactiveProperty\u003CConfigScope> RemoteConfigScopes { get; } Allows you to control scopes of config that will be loaded with the next requests to the server. Exceptions: MagifyNotInitializedException — If you try to call this method before magify has been initialized. Remarks: Use None if you want to load all the content of config.Remember, that Segmentations and AbTests won't be included in request if None was set. You have to request them manually.You should realize, that ProductIds content is using by Magify SDK internally (for external purchases, subscription status and others), so you should be careful and request this scope at least once.",{"id":7294,"title":7295,"titles":7296,"content":7297,"level":1120},"/unity-sdk/api-collection/magify-service#authorizationstatus","AuthorizationStatus",[652,7160],"IReactiveProperty\u003CAuthorizationStatus> AuthorizationStatus { get; } Gets or sets the authorization status, which shows whether a user is authorized in your app under any account. Used in segmentation and filtering.",{"id":7299,"title":7300,"titles":7301,"content":7302,"level":1120},"/unity-sdk/api-collection/magify-service#storedappfeaturespreloadingenabled","StoredAppFeaturesPreloadingEnabled",[652,7160],"bool StoredAppFeaturesPreloadingEnabled { get; set; } Switches the preloading of stored app features. SDK might load them in background on different triggers: Start of new session;Changing of network reachability;Some other triggers...",{"id":7304,"title":7305,"titles":7306,"content":7307,"level":1120},"/unity-sdk/api-collection/magify-service#referrerid","ReferrerId",[652,7160],"IReactiveProperty\u003Cstring> ReferrerId { get; } Responsible for storing the referrer identifier, which can be obtained from various sources like Facebook Deferred Deep Links.",{"id":7309,"title":7310,"titles":7311,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#request-campaign","Request Campaign",[652],{"id":7313,"title":7314,"titles":7315,"content":7316,"level":1120},"/unity-sdk/api-collection/magify-service#requestsessionstartasync","RequestSessionStartAsync",[652,7310],"UniTask\u003CCampaignResult> RequestSessionStartAsync(CancellationToken cancellationToken = default) Starts a session and allows calling RequestCampaignAsync.",{"id":7318,"title":7319,"titles":7320,"content":7321,"level":1120},"/unity-sdk/api-collection/magify-service#requestcampaignasync","RequestCampaignAsync",[652,7310],"UniTask\u003CCampaignResult> RequestCampaignAsync(string @event, Dictionary\u003Cstring, object> @params = null, CancellationToken cancellationToken = default) Handles campaigns triggered by specific events. Has a lot of overrides for different cases; @params and CustomEvent.Params have restrictions: in serialized form, the length of a json string cannot exceed 512 characters. This is done to optimize and simplify the configuration of the application in the configuration cabinet. Remember that @params will be combined when you use following API:MagifyService.Campaigns.SetParamMagifyService.Campaigns.SetParamsMagifyService.Campaigns.SetUniversalParamMagifyService.Campaigns.SetUniversalParams",{"id":7323,"title":7324,"titles":7325,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#external-handlers-1","External Handlers",[652],{"id":7327,"title":7328,"titles":7329,"content":7330,"level":1120},"/unity-sdk/api-collection/magify-service#setappnavigator","SetAppNavigator",[652,7324],"MagifyService SetAppNavigator([CanBeNull] IAppNavigator appNavigator) Defines the navigator for linking from campaigns.",{"id":7332,"title":7333,"titles":7334,"content":7335,"level":1120},"/unity-sdk/api-collection/magify-service#useembeddedunitypurchasing","UseEmbeddedUnityPurchasing",[652,7324],"MagifyService UseEmbeddedUnityPurchasing() Uses the UnityPurchasing implementation provided by the SDK. Uses SetPurchasingProvider internally",{"id":7337,"title":7238,"titles":7338,"content":467,"level":1104},"/unity-sdk/api-collection/magify-service#additional-api-1",[652],{"id":7340,"title":7341,"titles":7342,"content":7343,"level":1120},"/unity-sdk/api-collection/magify-service#setuseremail","SetUserEmail",[652,7238],"void SetUserEmail(string email) Sets the current user's email.",{"id":7345,"title":7346,"titles":7347,"content":7348,"level":1120},"/unity-sdk/api-collection/magify-service#sync","Sync",[652,7238],"void Sync() Synchronizes config with the server. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":659,"title":658,"titles":7350,"content":7351,"level":1110},[],"Description of the IServicePrefs API",{"id":7353,"title":4180,"titles":7354,"content":7355,"level":1104},"/unity-sdk/api-collection/magify-service/iserviceprefs#overview",[658],"This interface provides access to some values stored by the Magify service.",{"id":7357,"title":7358,"titles":7359,"content":7360,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#purchasescounter","PurchasesCounter",[658,4180],"IReadOnlyReactiveProperty\u003Cint> PurchasesCounter { get; } Provides current purchases number.",{"id":7362,"title":7363,"titles":7364,"content":7365,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#rewardedvideocounter","RewardedVideoCounter",[658,4180],"IReadOnlyReactiveProperty\u003Cint> RewardedVideoCounter { get; } Provides current watched rewarded video ads number.",{"id":7367,"title":7368,"titles":7369,"content":7370,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#interstitialvideocounter","InterstitialVideoCounter",[658,4180],"IReadOnlyReactiveProperty\u003Cint> InterstitialVideoCounter { get; } Provides current watched interstitial video number.",{"id":7372,"title":7373,"titles":7374,"content":7375,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#nativerateusshown","NativeRateUsShown",[658,4180],"IReadOnlyReactiveProperty\u003Cbool> NativeRateUsShown { get; } Determines whether native rate-us popup has been shown.",{"id":7377,"title":7378,"titles":7379,"content":7380,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#consentgiveneventsent","ConsentGivenEventSent",[658,4180],"IReadOnlyReactiveProperty\u003Cbool> ConsentGivenEventSent { get; } Determines whether ConsentGivenEvent has been sent.",{"id":7382,"title":7383,"titles":7384,"content":7385,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#boughtsubscriptionproduct","BoughtSubscriptionProduct",[658,4180],"IReadOnlyReactiveProperty\u003Cstring> BoughtSubscriptionProduct { get; } Provides the ID of the last subscription product purchased, if there was one.",{"id":7387,"title":7388,"titles":7389,"content":7390,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#subscriptionstatus","SubscriptionStatus",[658,4180],"IReadOnlyReactiveProperty\u003CSubscriptionStatus> SubscriptionStatus { get; } Provides current subscription status.",{"id":7392,"title":7393,"titles":7394,"content":7395,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#subscriptionexpiredate","SubscriptionExpireDate",[658,4180],"IReadOnlyReactiveProperty\u003CDateTime> SubscriptionExpireDate { get; } Provides latest subscription expire date.",{"id":7397,"title":7398,"titles":7399,"content":7400,"level":1120},"/unity-sdk/api-collection/magify-service/iserviceprefs#subscriptionboughtdate","SubscriptionBoughtDate",[658,4180],"IReadOnlyReactiveProperty\u003CDateTime> SubscriptionBoughtDate { get; } Provides latest subscription bought date. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":663,"title":662,"titles":7402,"content":7403,"level":1110},[],"Description of the Analytics Service API",{"id":7405,"title":4180,"titles":7406,"content":467,"level":1104},"/unity-sdk/api-collection/analyticsservice#overview",[662],{"id":7408,"title":7409,"titles":7410,"content":7411,"level":1120},"/unity-sdk/api-collection/analyticsservice#tweakanalyticsconfig","TweakAnalyticsConfig",[662,4180],"void TweakAnalyticsConfig(int eventsGroupSize, int syncTimeInterval) This method allows you to tweak the analytics configuration by setting the size of events groups and the synchronization time interval.\nThis affects the lifecycle of sending analytics. This method is intended only for debugging and testing purposes.",{"id":7413,"title":7414,"titles":7415,"content":7416,"level":1120},"/unity-sdk/api-collection/analyticsservice#resetanalyticsconfig","ResetAnalyticsConfig",[662,4180],"void ResetAnalyticsConfig() This method resets the analytics configuration to its default settings.\nThis affects the lifecycle of sending analytics. This method is intended only for debugging and testing purposes.",{"id":7418,"title":7419,"titles":7420,"content":7421,"level":1120},"/unity-sdk/api-collection/analyticsservice#tweakuserlocale","TweakUserLocale",[662,4180],"void TweakUserLocale(string languageTag) This method updates the user's locale using the specified language tag. This method simulates changing the language in the application's settings (but it doesn't do the actual locale change). This method is intended only for debugging and testing purposes.",{"id":7423,"title":558,"titles":7424,"content":7425,"level":1104},"/unity-sdk/api-collection/analyticsservice#advanced",[662],"The methods that become available with advanced Magify SDK integration are described here. They provide an opportunity to gather more detailed analytics and game data.",{"id":7427,"title":7160,"titles":7428,"content":467,"level":1120},"/unity-sdk/api-collection/analyticsservice#properties",[662,558],{"id":7430,"title":7431,"titles":7432,"content":7433,"level":1120},"/unity-sdk/api-collection/analyticsservice#onbeforesendevent","OnBeforeSendEvent",[662,558],"IObservable\u003CCustomEvent> OnBeforeSendEvent { get; } The observable is only notified in the TrackEvent methods before sending a custom event to Magify.",{"id":7435,"title":7436,"titles":7437,"content":7438,"level":1120},"/unity-sdk/api-collection/analyticsservice#onaftersendevent","OnAfterSendEvent",[662,558],"IObservable\u003CCustomEvent> OnAfterSendEvent { get; } The observable is only notified in the TrackEvent methods after sending a custom event to Magify.",{"id":7440,"title":7441,"titles":7442,"content":467,"level":1120},"/unity-sdk/api-collection/analyticsservice#analytics-events-tracking","Analytics events tracking",[662,558],{"id":7444,"title":7445,"titles":7446,"content":7447,"level":1120},"/unity-sdk/api-collection/analyticsservice#trackevent","TrackEvent",[662,558],"void TrackEvent(string name, Dictionary\u003Cstring, object> @params);\nvoid TrackEvent(CustomEvent @event); This method is used to track custom events. It accepts two parameters: name – name of the event to be tracked;@params – additional parameters to be included in the event;@event - abstraction over parameters above; Restrictions: @params and CustomEvent.Params have restrictions: in serialized form, the length of a json string cannot exceed 512 characters. This is done to optimize and simplify the configuration of the application in the configuration panel.",{"id":7449,"title":7450,"titles":7451,"content":467,"level":1120},"/unity-sdk/api-collection/analyticsservice#game-related-information","Game-related information",[662,558],{"id":7453,"title":7454,"titles":7455,"content":7456,"level":1120},"/unity-sdk/api-collection/analyticsservice#setgamemode","SetGameMode",[662,558],"void SetGameMode(string mode) Call this method each time the game mode changes to ensure correct analytics tracking.",{"id":7458,"title":7459,"titles":7460,"content":7461,"level":1120},"/unity-sdk/api-collection/analyticsservice#setgamelevel","SetGameLevel",[662,558],"void SetGameLevel(int level) Call this method each time the game level changes to ensure correct analytics tracking.",{"id":7463,"title":7464,"titles":7465,"content":7466,"level":1120},"/unity-sdk/api-collection/analyticsservice#setgamemaxlevel","SetGameMaxLevel",[662,558],"void SetGameMaxLevel(int level) Call this method each time the maximum game level changes to ensure correct analytics tracking.",{"id":7468,"title":6569,"titles":7469,"content":467,"level":1120},"/unity-sdk/api-collection/analyticsservice#transactions",[662,558],{"id":7471,"title":7472,"titles":7473,"content":7474,"level":1120},"/unity-sdk/api-collection/analyticsservice#trackincometransaction","TrackIncomeTransaction",[662,558],"void TrackIncomeTransaction(string source, List\u003CBonusInfo> bonuses, ProductInfo product = null);\nvoid TrackIncomeTransaction(string source, List\u003CBonusInfo> bonuses, string productId = null, PurchaseInfo purchaseInfo = null);\nvoid TrackIncomeTransaction(string source, List\u003CBonusInfo> bonuses, ProductObtainResult result); This method sends transaction info to Magify. source – text identifier for income source (e.g., inApp, reward, etc.);bonuses – list of incoming bonuses within the transaction (name, quantity, and final balance);productId (optional) - identifier of the product that was purchased;product (optional) – product info including productId, price, and currency;purchaseInfo (optional) - meta-information about purchased product;result (optional) - type that includes a lot of information about purchased product;",{"id":7476,"title":7477,"titles":7478,"content":7479,"level":1120},"/unity-sdk/api-collection/analyticsservice#trackexpensetransaction","TrackExpenseTransaction",[662,558],"void TrackExpenseTransaction(List\u003CBonusInfo> bonuses) The method is used to track spending, call it every time a player uses bonuses, passing the bonus used as an argument. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":666,"title":562,"titles":7481,"content":7482,"level":1110},[],"Description of the purchases-relater Magify API Here you will be able to find various purchases-relater API: PurchaserService provides all API to work with in-app purchases and subscriptions;SubscriptionService is responsible for automatic actualization of subscription status;IMinimalInAppStore allows you to pass purchase and subscription information to Magify SDK;IInAppStore allows you to pass more purchase and subscription information to the advanced Magify SDK;PurchaseInfo contains the purchase transaction information needed to gather analytics and validation.TrustedPurchaseRecord is data model is needed to track purchase analytics without validation from Magify;PurchaseType allows you to select the required purchase type for the purchase data model without validation;PeriodType allows you to select the required purchase period type for the purchase data model without validation;ProductIdType allows you to select the required product id type for the purchase data model without validation;TrustedPurchaseRecord.Store defines the store where the purchase was made without validation.",{"id":672,"title":671,"titles":7484,"content":7485,"level":1110},[],"Description of the PurchaserService API",{"id":7487,"title":6517,"titles":7488,"content":7489,"level":1104},"/unity-sdk/api-collection/purchases/purchaserservice#preparation",[671],"This API becomes available with advanced Magify SDK integration are described here.",{"id":7491,"title":4180,"titles":7492,"content":7493,"level":1104},"/unity-sdk/api-collection/purchases/purchaserservice#overview",[671],"This service provides all API to work with in-app purchases and subscriptions.",{"id":7495,"title":7496,"titles":7497,"content":7498,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#inappstore","InAppStore",[671,4180],"IInAppStore InAppStore { get; } Current instance if IInAppStore implementation, that was set via SetPurchasingProvider.",{"id":7500,"title":7501,"titles":7502,"content":7503,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#inappproducts","InAppProducts",[671,4180],"IReadOnlyList\u003CInAppProduct> InAppProducts { get; } List of InApp products that were configured and loaded for Magify.",{"id":7505,"title":7506,"titles":7507,"content":7508,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#subscriptionproducts","SubscriptionProducts",[671,4180],"IReadOnlyList\u003CSubscriptionProduct> SubscriptionProducts { get; } List of subscription products that were configured and loaded for Magify.",{"id":7510,"title":7511,"titles":7512,"content":7513,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#purchasinginprogress","PurchasingInProgress",[671,4180],"bool PurchasingInProgress { get; } Indicates whether purchase of some product in progress (if PurchaseProductAsync in progress).",{"id":7515,"title":7194,"titles":7516,"content":7517,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#externalpurchaseverificationhandler",[671,4180],"IReactiveProperty\u003CIPurchaseVerificationHandler> ExternalPurchaseVerificationHandler { get; } Allows you to control purchases verification process and get the result of it. Better to use MagifyService.ExternalPurchaseVerificationHandler.",{"id":7519,"title":7199,"titles":7520,"content":7521,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#verificationretryinterval",[671,4180],"FloatReactiveProperty VerificationRetryInterval { get; } The time in seconds between purchase verification attempts. Minimum allowed value is 1 second. Better to use MagifyService.VerificationRetryInterval.",{"id":7523,"title":7213,"titles":7524,"content":7525,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#setpurchasingprovider",[671,4180],"void SetPurchasingProvider([CanBeNull] IInAppStore inAppStore); The method allows you to tell SDK which implementation of IInAppStore to use to work with InApp purchases and subscriptions. Better to use MagifyService.SetPurchasingProvider.",{"id":7527,"title":7528,"titles":7529,"content":7530,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#prepareproductasync","PrepareProductAsync",[671,4180],"UniTask\u003CProductPrepareResult> PrepareProductAsync(ProductDef product, CancellationToken cancellationToken); Initiate loading of products for the current InAppStore so that they can be purchased at a later time. Inside uses a timeout and can also be canceled by cancellationToken.\nRelies on IInAppStore.OnProductFetched and IInAppStore.OnProductFetchFailed events.",{"id":7532,"title":7533,"titles":7534,"content":7535,"level":1120},"/unity-sdk/api-collection/purchases/purchaserservice#purchaseproductasync","PurchaseProductAsync",[671,4180],"UniTask\u003C(ProductObtainFailReason? FailReason, PurchaseInfo Info)> PurchaseProductAsync(InAppProduct product);\n\nUniTask\u003C(ProductObtainFailReason? FailReason, PurchaseInfo Info)> PurchaseProductAsync(SubscriptionProduct product); Initiates the purchase of a product with current InAppStore.\nRelies on IInAppStore.OnPurchaseFinished and IInAppStore.OnPurchaseFailed events. If the purchase is in progress then PurchasingInProgress is true.Returns purchase Info if successful or FailReason if unsuccessful. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":676,"title":675,"titles":7537,"content":7538,"level":1110},[],"Description of the SubscriptionService API",{"id":7540,"title":4180,"titles":7541,"content":7542,"level":1104},"/unity-sdk/api-collection/purchases/subscriptionservice#overview",[675],"This service is responsible for automatic actualization of subscription status.",{"id":7544,"title":7545,"titles":7546,"content":7547,"level":1120},"/unity-sdk/api-collection/purchases/subscriptionservice#onsubscriptionrefreshed","OnSubscriptionRefreshed",[675,4180],"[NotNull]\npublic IObservable\u003CUnit> OnSubscriptionRefreshed { get; } Observable that natifies subscribers that subscription status was refreshed. You can get it through MagifyServie.Prefs.SubscriptionStatus.",{"id":7549,"title":7550,"titles":7551,"content":7552,"level":1120},"/unity-sdk/api-collection/purchases/subscriptionservice#onsubscriptiontrialstatusread","OnSubscriptionTrialStatusRead",[675,4180],"[NotNull]\npublic IObservable\u003Cbool> OnSubscriptionTrialStatusRead { get; } Returns true if the subscription was read as a trial in this application run.",{"id":7554,"title":7555,"titles":7556,"content":7557,"level":1120},"/unity-sdk/api-collection/purchases/subscriptionservice#productfetchedhandler","ProductFetchedHandler",[675,4180],"void ProductFetchedHandler([NotNull] string productId) You have to call this method when your subscription product was fetched via in-app store. You don't have to call this method in advanced Magify SDK. It's called automatically. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":680,"title":679,"titles":7559,"content":7560,"level":1110},[],"Description of IMinimalInAppStore interface",{"id":7562,"title":4180,"titles":7563,"content":7564,"level":1104},"/unity-sdk/api-collection/purchases/iminimalinappstore#overview",[679],"This interface allows you to pass purchase and subscription information to the Magify SDK.\nThis interface is usually specific for each library that provides in-app purchasing feature.\nFor example, you might have one implementation for Unity Purchasing and another for your custom library, and using IMinimalInAppStore implementation depends on which liobrary is used in the application. For advanced integration you should check IInAppStore.",{"id":7566,"title":7567,"titles":7568,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/iminimalinappstore#iminimalinappstore-api","IMinimalInAppStore API",[679],{"id":7570,"title":7571,"titles":7572,"content":467,"level":1120},"/unity-sdk/api-collection/purchases/iminimalinappstore#used-delegates","Used delegates",[679,7567],{"id":7574,"title":7575,"titles":7576,"content":7577,"level":4579},"/unity-sdk/api-collection/purchases/iminimalinappstore#purchasefinisheddelegate","PurchaseFinishedDelegate",[679,7567,7571],"public delegate void PurchaseFinishedDelegate(\n    string productId,\n    PurchaseInfo purchaseInfo\n)",{"id":7579,"title":7580,"titles":7581,"content":467,"level":1120},"/unity-sdk/api-collection/purchases/iminimalinappstore#events","Events",[679,7567],{"id":7583,"title":7584,"titles":7585,"content":7586,"level":4579},"/unity-sdk/api-collection/purchases/iminimalinappstore#onpurchasefinished","OnPurchaseFinished",[679,7567,7580],"[NotNull]\nevent PurchaseFinishedDelegate OnPurchaseFinished; Your implementation should invoke this event when purchase is finished.",{"id":7588,"title":7589,"titles":7590,"content":467,"level":1120},"/unity-sdk/api-collection/purchases/iminimalinappstore#methods","Methods",[679,7567],{"id":7592,"title":7593,"titles":7594,"content":7595,"level":4579},"/unity-sdk/api-collection/purchases/iminimalinappstore#loadsubscriptioninfo","LoadSubscriptionInfo",[679,7567,7589],"[CanBeNull]\nSubscriptionInfo LoadSubscriptionInfo(string productId); This method's implementation must return information about current active subscription if exist. You should return information about current active subscription.You should return null if subscription is expired or not bought. You can use Magify.UnityPurchasesUtils.LoadSubscriptionInfo method to load subscription info if you use Unity Purchasing. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":684,"title":683,"titles":7597,"content":7598,"level":1110},[],"Description of IInAppStore interface",{"id":7600,"title":4180,"titles":7601,"content":7602,"level":1104},"/unity-sdk/api-collection/purchases/iinappstore#overview",[683],"This interface allows you to pass purchase and subscription information to the Magify SDK.\nThis interface is usually specific for each library that provides in-app purchasing feature.\nFor example, you might have one implementation for Unity Purchasing and another for your custom library, and using IMinimalInAppStore implementation depends on which liobrary is used in the application. This is interface for advanced integration and it inherits all the API from IMinimalInAppStore.",{"id":7604,"title":7605,"titles":7606,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/iinappstore#iinappstore-api","IInAppStore API",[683],{"id":7608,"title":7571,"titles":7609,"content":467,"level":1120},"/unity-sdk/api-collection/purchases/iinappstore#used-delegates",[683,7605],{"id":7611,"title":7612,"titles":7613,"content":7614,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#productfetcheddelegate","ProductFetchedDelegate",[683,7605,7571],"delegate void ProductFetchedDelegate(\n    string productId\n) This delegate describes a product fetch contract that uses the Magify SDK. The caller must pass the ID of the product that was fetched.",{"id":7616,"title":7617,"titles":7618,"content":7619,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#productfetchfaileddelegate","ProductFetchFailedDelegate",[683,7605,7571],"delegate void ProductFetchFailedDelegate(\n    string productId,\n    ProductObtainFailReason reason\n) This delegate describes a product fetch fail contract that uses the Magify SDK. The caller must pass the ID of the product that was failed to fetch and reson of the fail.",{"id":7621,"title":7622,"titles":7623,"content":7624,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#purchasefaileddelegate","PurchaseFailedDelegate",[683,7605,7571],"delegate void PurchaseFailedDelegate(\n    string productId,\n    ProductObtainFailReason reason\n) This delegate describes a product purchase fail contract that uses the Magify SDK. The caller must pass the ID of the product that was failed to purchase and reson of the fail.",{"id":7626,"title":7580,"titles":7627,"content":467,"level":1120},"/unity-sdk/api-collection/purchases/iinappstore#events",[683,7605],{"id":7629,"title":7630,"titles":7631,"content":7632,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#onproductfetched","OnProductFetched",[683,7605,7580],"event ProductFetchedDelegate OnProductFetched; Your implementation should invoke this event when store fetched some.",{"id":7634,"title":7635,"titles":7636,"content":7637,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#onproductfetchfailed","OnProductFetchFailed",[683,7605,7580],"event ProductFetchFailedDelegate OnProductFetchFailed; Your implementation should invoke this event when store fetched some.",{"id":7639,"title":7640,"titles":7641,"content":7642,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#onpurchasefailed","OnPurchaseFailed",[683,7605,7580],"event PurchaseFailedDelegate OnPurchaseFailed; Your implementation should invoke this event when purshase of some product was failed.",{"id":7644,"title":7589,"titles":7645,"content":467,"level":1120},"/unity-sdk/api-collection/purchases/iinappstore#methods",[683,7605],{"id":7647,"title":7648,"titles":7649,"content":7650,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#isproductready","IsProductReady",[683,7605,7589],"bool IsProductReady(ProductDef product); This method must return true if product is ready-to-purchase. For example, when it was fetched and in-app store is available.",{"id":7652,"title":7653,"titles":7654,"content":7655,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#loadproducts","LoadProducts",[683,7605,7589],"void LoadProducts(IEnumerable\u003CProductDef> products); This method must load (fetch) all products to make them ready-to-purchase.",{"id":7657,"title":7658,"titles":7659,"content":7660,"level":4579},"/unity-sdk/api-collection/purchases/iinappstore#purchase","Purchase",[683,7605,7589],"void Purchase(ProductDef product); This method must initiate purchasing logic. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":688,"title":687,"titles":7662,"content":7663,"level":1110},[],"Description of the PurchaseInfo class",{"id":7665,"title":4180,"titles":7666,"content":7667,"level":1104},"/unity-sdk/api-collection/purchases/purchaseinfo#overview",[687],"This structure contains the purchase transaction information needed to gather analytics and validation.\nIn some cases some of the properties may not be filled in - this is normal, look at each field to see if any information needs to be set.",{"id":7669,"title":7670,"titles":7671,"content":7672,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#price","Price",[687,4180],"string Price; Price of the purchased product.",{"id":7674,"title":7675,"titles":7676,"content":7677,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#currency","Currency",[687,4180],"string Currency; The transaction currency of the purchased product.",{"id":7679,"title":7680,"titles":7681,"content":7682,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#transactionid","TransactionId",[687,4180],"string TransactionId; Unique identifier of the current transaction.",{"id":7684,"title":7685,"titles":7686,"content":7687,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#originaltransactionid","OriginalTransactionId",[687,4180],"string OriginalTransactionId; Unique identifier of the original transaction (in case the current purchase is original, might be equal to TransactionId). For example, in the case of renewal of subscription it will be equal to the TransactionId of the original purchase transaction. Optional: might not exist for original purchase",{"id":7689,"title":7690,"titles":7691,"content":7692,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#purchasetoken","PurchaseToken",[687,4180],"string PurchaseToken; Represents Android's purchase token. Optional: Null for all other platforms.",{"id":7694,"title":7695,"titles":7696,"content":7697,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#receipt","Receipt",[687,4180],"PurchaseReceiptModel Receipt; Provides information about the purchase transaction receipt.",{"id":7699,"title":7700,"titles":7701,"content":7702,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#subscriptioninfo","SubscriptionInfo",[687,4180],"SubscriptionInfo SubscriptionInfo; Provides additional information about the current purchase if it is a subscription. Optional: Will be present for subscriptions only.",{"id":7704,"title":691,"titles":7705,"content":7706,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#trustedpurchaserecord",[687,4180],"TrustedPurchaseRecord TrustedPurchaseRecord { get; set } Optional: Allows you to attach information validated by some source about the purchase. In this case Magify server will not perform validation on its side for the current purchase, and will rely on data from this record.",{"id":7708,"title":7709,"titles":7710,"content":7711,"level":1120},"/unity-sdk/api-collection/purchases/purchaseinfo#skipverification","SkipVerification",[687,4180],"bool SkipVerification { get; set; } Optional: Marks this purchase as does not require verification through Magify services. In that case Magify isn't going to send verification requests to the server. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":692,"title":691,"titles":7713,"content":7714,"level":1110},[],"Description of the data model for purchases without validation",{"id":7716,"title":4180,"titles":7717,"content":7718,"level":1104},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#overview",[691],"This data model is needed to track purchase analytics without validation from Magify.",{"id":7720,"title":7160,"titles":7721,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#properties",[691],{"id":7723,"title":7724,"titles":7725,"content":7726,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#productid","ProductId",[691,7160],"string ProductId { get; internal set; } The id of the purchased product.",{"id":7728,"title":7680,"titles":7729,"content":7730,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#transactionid",[691,7160],"string TransactionId { get; internal set; } Unique identifier of the current transaction.",{"id":7732,"title":7685,"titles":7733,"content":7734,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#originaltransactionid",[691,7160],"string OriginalTransactionId { get; init; } Unique identifier of the original transaction (in case the current purchase is original, might be equal to TransactionId). For example, in the case of renewal of subscription it will be equal to the TransactionId of the original purchase transaction.",{"id":7736,"title":7737,"titles":7738,"content":7739,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#purchasedat","PurchasedAt",[691,7160],"double PurchasedAt { get; init; } The time at which the purchase was made. Format: number seconds by UTC from the start of the Unix epoch.",{"id":7741,"title":7670,"titles":7742,"content":7743,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#price",[691,7160],"string Price { get; init; } The price of the purchased product. Invariant float-point number without any letters or special characters.",{"id":7745,"title":7675,"titles":7746,"content":7747,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#currency",[691,7160],"string Currency { get; init; } The currency of the purchased product.",{"id":7749,"title":7750,"titles":7751,"content":7752,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#commissionamount","CommissionAmount",[691,7160],"string CommissionAmount { get; init; } Transaction fee.",{"id":7754,"title":7755,"titles":7756,"content":7757,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#commissioncurrency","CommissionCurrency",[691,7160],"string CommissionCurrency { get; init; } Transaction fee currency.",{"id":7759,"title":7760,"titles":7761,"content":7762,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#trustedpurchaseenvironment","TrustedPurchaseEnvironment",[691,7160],"TrustedPurchaseEnvironment? Environment { get; set; } Determines trusted purchase environment. This field can be null, then the default value will be Production",{"id":7764,"title":7765,"titles":7766,"content":7767,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#storefront","StoreFront",[691,7160],"string StoreFront { get; init; } Store Region. For example, a user has country “A” set in their AppStore settings, but physically they may be in country “B”, in this case this field should contain “A”.",{"id":7769,"title":7770,"titles":7771,"content":7772,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#storename","StoreName",[691,7160],"string StoreName { get; set; } The name of the store where the purchase was made. It can take any value, but it is highly recommended to use one of our suggested values from.",{"id":7774,"title":695,"titles":7775,"content":7776,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#purchasetype",[691,7160],"PurchaseType Type { get; init; } Optional: Defines the type of purchase. More details can be found here - PurchaseType",{"id":7778,"title":699,"titles":7779,"content":7780,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#periodtype",[691,7160],"PeriodType PeriodType { get; init; } Optional: Defines the type of purchase. More details can be found here - PeriodType",{"id":7782,"title":7783,"titles":7784,"content":7785,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#istrialconversion","IsTrialConversion",[691,7160],"bool? IsTrialConversion { get; init; } Optional: This field is needed to indicate that the current purchase event describes the transition of a trial subscription to a paid subscription. You only need to use it once, at the moment when the previous subscription was in the trial period, and all subsequent ones will already be paid. For paid subscriptions renewing, this field must Not contain true.",{"id":7787,"title":703,"titles":7788,"content":7789,"level":1120},"/unity-sdk/api-collection/purchases/trustedpurchaserecord#productidtype",[691,7160],"ProductIdType ProductIdType { get; init; } Optional: Clarifies exactly what type of purchase was made. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":696,"title":695,"titles":7791,"content":7792,"level":1110},[],"Description of the purchases type",{"id":7794,"title":4180,"titles":7795,"content":7796,"level":1104},"/unity-sdk/api-collection/purchases/purchasetype#overview",[695],"This enum allows you to select the required purchase type for the purchase data model without validation.",{"id":7798,"title":7799,"titles":7800,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/purchasetype#enum-values","Enum values",[695],{"id":7802,"title":7803,"titles":7804,"content":7805,"level":1120},"/unity-sdk/api-collection/purchases/purchasetype#nonerenewingpurchase","NoneRenewingPurchase",[695,7799],"NoneRenewingPurchase Subscription-like purchase of the product that does not auto-renew.",{"id":7807,"title":7808,"titles":7809,"content":7810,"level":1120},"/unity-sdk/api-collection/purchases/purchasetype#initialpurchase","InitialPurchase",[695,7799],"InitialPurchase Initial purchase of the product. For example, if user repeatedly buys consumable products - then all individual purchases will count for the initial purchase. But if one subscription was renewed, it doesn't count for the initial purchase.",{"id":7812,"title":7813,"titles":7814,"content":7815,"level":1120},"/unity-sdk/api-collection/purchases/purchasetype#renewal","Renewal",[695,7799],"Renewal A renewal purchase of the product. Refers to the automatic payment and extension of a subscription at the end of its billing period.",{"id":7817,"title":7818,"titles":7819,"content":7820,"level":1120},"/unity-sdk/api-collection/purchases/purchasetype#cancellation","Cancellation",[695,7799],"Cancellation Cancellation means that the subscription has been stopped and will not renew after the current billing period ends. The user retains access until the period expires. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":700,"title":699,"titles":7822,"content":7823,"level":1110},[],"Description of the purchases period type",{"id":7825,"title":4180,"titles":7826,"content":7827,"level":1104},"/unity-sdk/api-collection/purchases/periodtype#overview",[699],"This enum allows you to select the required purchase period type for the purchase data model without validation.",{"id":7829,"title":7799,"titles":7830,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/periodtype#enum-values",[699],{"id":7832,"title":7833,"titles":7834,"content":7835,"level":1120},"/unity-sdk/api-collection/purchases/periodtype#normal","Normal",[699,7799],"Normal This value must be selected if a non-trial purchase is being made.",{"id":7837,"title":5361,"titles":7838,"content":7839,"level":1120},"/unity-sdk/api-collection/purchases/periodtype#trial",[699,7799],"Trial This value must be selected if a trial purchase is being made. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":704,"title":703,"titles":7841,"content":7842,"level":1110},[],"Description of the purchases product id type",{"id":7844,"title":4180,"titles":7845,"content":7846,"level":1104},"/unity-sdk/api-collection/purchases/productidtype#overview",[703],"This enum allows you to select the required product id type for the purchase data model without validation.",{"id":7848,"title":7799,"titles":7849,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/productidtype#enum-values",[703],{"id":7851,"title":7852,"titles":7853,"content":7854,"level":1120},"/unity-sdk/api-collection/purchases/productidtype#consumableproductid","ConsumableProductId",[703,7799],"ConsumableProductId This value must be selected when product is consumable purchase.",{"id":7856,"title":7857,"titles":7858,"content":7859,"level":1120},"/unity-sdk/api-collection/purchases/productidtype#nonconsumableproductid","NonConsumableProductId",[703,7799],"NonConsumableProductId This value must be selected when product is non-consumable purchase.",{"id":7861,"title":7862,"titles":7863,"content":7864,"level":1120},"/unity-sdk/api-collection/purchases/productidtype#subscriptionproductid","SubscriptionProductId",[703,7799],"SubscriptionProductId This value must be selected when product is subscription purchase. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":708,"title":707,"titles":7866,"content":7867,"level":1110},[],"Description of the purchase store structure",{"id":7869,"title":4180,"titles":7870,"content":7871,"level":1104},"/unity-sdk/api-collection/purchases/purchasestore#overview",[707],"This structure defines the store where the purchase was made. If your store is not in the list - please give us your feedback and we will add it as soon as possible.",{"id":7873,"title":7160,"titles":7874,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/purchasestore#properties",[707],{"id":7876,"title":1304,"titles":7877,"content":7878,"level":1120},"/unity-sdk/api-collection/purchases/purchasestore#name",[707,7160],"string Name { get; }",{"id":7880,"title":7881,"titles":7882,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/purchasestore#static-properties","Static properties",[707],{"id":7884,"title":7885,"titles":7886,"content":7887,"level":1120},"/unity-sdk/api-collection/purchases/purchasestore#native","Native",[707,7881],"PurchaseStore Native { get; } = new(\"NATIVE\"); It makes sense: the purchase was made in the same store where the app was installed.",{"id":7889,"title":7890,"titles":7891,"content":7892,"level":1120},"/unity-sdk/api-collection/purchases/purchasestore#aghanim","Aghanim",[707,7881],"PurchaseStore Aghanim { get; } = new(\"AGHANIM\"); html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"id":712,"title":711,"titles":7894,"content":7895,"level":1110},[],"Description of the basic IInAppStore implementation for Aghanim",{"id":7897,"title":4180,"titles":7898,"content":7899,"level":1104},"/unity-sdk/api-collection/purchases/aghanimstore#overview",[711],"AghanimStore is an implementation of the IInAppStore interface that integrates with the Aghanim.\nIt provides purchasing functionality by creating payment orders on the Aghanim side and directing users to a web form for payment.\nAfter completion, the SDK processes the order result and triggers corresponding events.",{"id":7901,"title":7580,"titles":7902,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/aghanimstore#events",[711],{"id":7904,"title":7630,"titles":7905,"content":7906,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#onproductfetched",[711,7580],"event ProductFetchedDelegate OnProductFetched; Triggered when a product has been successfully fetched and is ready for purchase.",{"id":7908,"title":7635,"titles":7909,"content":7910,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#onproductfetchfailed",[711,7580],"event ProductFetchFailedDelegate OnProductFetchFailed; Triggered when a product could not be fetched or is unavailable in the store.",{"id":7912,"title":7640,"titles":7913,"content":7914,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#onpurchasefailed",[711,7580],"event PurchaseFailedDelegate OnPurchaseFailed; Triggered when a purchase fails due to user cancellation, network error, or any other issue.",{"id":7916,"title":7584,"titles":7917,"content":7918,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#onpurchasefinished",[711,7580],"event PurchaseFinishedDelegate OnPurchaseFinished; Triggered when a purchase is successfully completed and confirmed by Aghanim.",{"id":7920,"title":7160,"titles":7921,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/aghanimstore#properties",[711],{"id":7923,"title":7924,"titles":7925,"content":7926,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#issandboxmode","IsSandboxMode",[711,7160],"bool IsSandboxMode { get; set; } Determines whether the store operates in sandbox (test) mode for debugging and QA environments.",{"id":7928,"title":7929,"titles":7930,"content":7931,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#isdisposed","IsDisposed",[711,7160],"bool IsDisposed { get; } Indicates whether the store instance has been disposed and is no longer active.",{"id":7933,"title":7934,"titles":7935,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/aghanimstore#protected-properties","Protected properties",[711],{"id":7937,"title":7938,"titles":7939,"content":7940,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#purchaselinkhandler","PurchaseLinkHandler",[711,7934],"IExternalLinkHandler PurchaseLinkHandler { get; } Handles opening external purchase links provided by Aghanim.",{"id":7942,"title":7589,"titles":7943,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/aghanimstore#methods",[711],{"id":7945,"title":7648,"titles":7946,"content":7947,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#isproductready",[711,7589],"bool IsProductReady(ProductDef product) Returns true if the specified product is associated with the Aghanim store and is ready to be purchased.",{"id":7949,"title":7653,"titles":7950,"content":7951,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#loadproducts",[711,7589],"void LoadProducts(IEnumerable\u003CProductDef> products) Fetches and validates the provided product list.",{"id":7953,"title":7658,"titles":7954,"content":7955,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#purchase",[711,7589],"void Purchase(ProductDef product);\nvoid Purchase(ProductDef product, CancellationToken cancellationToken); This method must initiate purchasing logic.",{"id":7957,"title":7958,"titles":7959,"content":7960,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#restorepurchases","RestorePurchases",[711,7589],"UniTask RestorePurchases(CancellationToken cancellationToken) Restores all previously purchased non-consumable products from the Aghanim server.\nTriggers OnPurchaseFinished for any unprocessed purchases.",{"id":7962,"title":7963,"titles":7964,"content":7965,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#obsolete-loadsubscriptioninfo","Obsolete LoadSubscriptionInfo",[711,7589],"[Obsolete]\nSubscriptionInfo LoadSubscriptionInfo(string productId) Subscriptions are not supported by Aghanim yet. Always returns null.",{"id":7967,"title":7968,"titles":7969,"content":7970,"level":1104},"/unity-sdk/api-collection/purchases/aghanimstore#protected-methods","Protected methods",[711],"Following methods might be overriden, but you should follow original logic.",{"id":7972,"title":7973,"titles":7974,"content":7975,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#purchaseasync","PurchaseAsync",[711,7968],"UniTaskVoid PurchaseAsync([NotNull] ProductDef product, CancellationToken cancellation) Main method to process purchase: Issues an Aghanim order.Opens the returned order URL.Waits for the final order status.Calls TryHandleOrder based on the result.",{"id":7977,"title":7978,"titles":7979,"content":7980,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#tryhandleorder","TryHandleOrder",[711,7968],"bool TryHandleOrder([NotNull] string productId, [NotNull] string orderId, AghanimOrderInfo orderInfo) Handles the order result depending on its status: Paid → invokes PurchaseFinished;Cancelled → invokes PurchaseFailed;otherwise → returns false. Handled order IDs are stored to avoid duplication.",{"id":7982,"title":7983,"titles":7984,"content":7985,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#purchasefailed","PurchaseFailed",[711,7968],"bool PurchaseFailed(string productId, ProductObtainFailReason reason) Invokes OnPurchaseFailed and logs any exceptions.",{"id":7987,"title":7988,"titles":7989,"content":7990,"level":1120},"/unity-sdk/api-collection/purchases/aghanimstore#purchasefinished","PurchaseFinished",[711,7968],"bool PurchaseFinished(string productId, PurchaseInfo purchaseInfo) Invokes OnPurchaseFinished and logs any exceptions. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"id":716,"title":715,"titles":7992,"content":7993,"level":1110},[],"Description of the AghanimProductCounting type",{"id":7995,"title":4180,"titles":7996,"content":7997,"level":1104},"/unity-sdk/api-collection/purchases/aghanimproductcounting#overview",[715],"This type stores information about how many times a certain product has been purchased at Aghanim.",{"id":7999,"title":7160,"titles":8000,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/aghanimproductcounting#properties",[715],{"id":8002,"title":7724,"titles":8003,"content":8004,"level":1120},"/unity-sdk/api-collection/purchases/aghanimproductcounting#productid",[715,7160],"string ProductId { get; init; } The product identifier.",{"id":8006,"title":8007,"titles":8008,"content":8009,"level":1120},"/unity-sdk/api-collection/purchases/aghanimproductcounting#count","Count",[715,7160],"int Count { get; init; } The number of times the given product has been purchased. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":720,"title":719,"titles":8011,"content":8012,"level":1110},[],"Description of the AghanimOrderStatus type",{"id":8014,"title":4180,"titles":8015,"content":8016,"level":1104},"/unity-sdk/api-collection/purchases/aghanimorderstatus#overview",[719],"This type stores information about status of purchase in Aghanim.",{"id":8018,"title":8019,"titles":8020,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/aghanimorderstatus#values","Values",[719],{"id":8022,"title":8023,"titles":8024,"content":8025,"level":1120},"/unity-sdk/api-collection/purchases/aghanimorderstatus#pending","Pending",[719,8019],"Pending The order is pending confirmation of payment or cancelation.",{"id":8027,"title":8028,"titles":8029,"content":8030,"level":1120},"/unity-sdk/api-collection/purchases/aghanimorderstatus#paid","Paid",[719,8019],"Paid Order is paid.",{"id":8032,"title":8033,"titles":8034,"content":8035,"level":1120},"/unity-sdk/api-collection/purchases/aghanimorderstatus#cancelled","Cancelled",[719,8019],"Cancelled Order payment is cancelled.",{"id":8037,"title":8038,"titles":8039,"content":467,"level":1104},"/unity-sdk/api-collection/purchases/aghanimorderstatus#extension-methods","Extension methods",[719],{"id":8041,"title":8042,"titles":8043,"content":8044,"level":1120},"/unity-sdk/api-collection/purchases/aghanimorderstatus#isfinal","IsFinal",[719,8038],"static bool IsFinal(this AghanimOrderStatus status) Return true if status is Paid or Cancelled. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":723,"title":583,"titles":8046,"content":8047,"level":1110},[],"Description of the ads-related API Here you will be able to find various campaigns API: AdvertiserService allows asynchronous loading of rewards ads, inter ads and provides comfortable banner handling;IMinimalAdsMediator describes the interface for integration with any ads mediator;IAdsMediator describes the advanced integration with any ads mediator.",{"id":729,"title":728,"titles":8049,"content":8050,"level":1110},[],"Description of the AdvertiserService API",{"id":8052,"title":4180,"titles":8053,"content":8054,"level":1104},"/unity-sdk/api-collection/advertisement/advertiserservice#overview",[728],"The service is a wrapper over IMinimalAdsMediator (IAdsMediator in advanced integration), which allows asynchronous loading of rewards ads, inter ads and provides comfortable banner handling. Since you have the option to create and use your own implementation of IMinimalAdsMediator and you don't have to implement the entire API of this interface, you should be careful with using the API of this service.\nMethods listed below won’t work correctly without a full implementation of the IMinimalAdsMediator interface.",{"id":8056,"title":8057,"titles":8058,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/advertiserservice#main-api","Main Api",[728],{"id":8060,"title":8061,"titles":8062,"content":8063,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#mediator","Mediator",[728,8057],"IAdsMediator Mediator { get; } This property provides access to the mediator implementation that is used for Magify's communication with the specific advertising mediator API. This field is filled in after the initialization of the MagifyService.",{"id":8065,"title":8066,"titles":8067,"content":8068,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#waitforinitialization","WaitForInitialization",[728,8057],"UniTask\u003Cbool> WaitForInitialization(\n    float timeout,\n    CancellationToken cancellationToken\n) Asynchronous method that provides an opportunity to wait for mediator implementation initialization. This method is used by the Load...VideoAsync() and Show...VideoAsync() methods, in case mediator has been added and initialization has not completed. You can also use it if you need to wait until the initialization of the advertising mediator is finished.",{"id":8070,"title":8071,"titles":8072,"content":8073,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#adpreloadenable","AdPreloadEnable",[728,8057],"IReactiveProperty\u003Cbool> AdPreloadEnable { get; } Allows you to control when ads preloading. You can read more about preloading in the corresponding section.",{"id":8075,"title":5317,"titles":8076,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/advertiserservice#banner",[728],{"id":8078,"title":8079,"titles":8080,"content":8081,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#isbannerrequired","IsBannerRequired",[728,5317],"IReactiveProperty\u003Cbool> IsBannerRequired { get; } This property indicates if the banner is currently needed or not. This state is controlled at the project level. By default the state is false. If set to true, then Advetriser will try to show the banner by calling Mediator.ShowBanner method. If set to false, then Advetriser will hide the banner by calling Mediator.HideBanner method.",{"id":8083,"title":8084,"titles":8085,"content":8086,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#isbanneractive","IsBannerActive",[728,5317],"IReadOnlyReactiveProperty\u003Cbool> IsBannerActive { get; } The result of all conditions necessary for banner display. The method takes into account global state (IsBannerRequired), temporary deactivations and presence of campaign in Magify. It property cannot be changed.",{"id":8088,"title":8089,"titles":8090,"content":8091,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#temporarydisablebanner","TemporaryDisableBanner",[728,5317],"IDisposable TemporaryDisableBanner() Call a method to temporarily disable the banner. The method returns IDisposable, after calling Dispose the banner will become active again. You can use the TemporaryDisposableBanner method in the using block to temporarily deactivate the banner display, this can be useful during the display of other campaigns.",{"id":8093,"title":8094,"titles":8095,"content":8096,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#refreshbanner","RefreshBanner",[728,5317],"void RefreshBanner() The method updates the state of the banner. The banner will be displayed if: IsBannerRequired is true;Mediator.IsBannerVisible is true;There is access to the internet;",{"id":8098,"title":8099,"titles":8100,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/advertiserservice#reward","Reward",[728],{"id":8102,"title":8103,"titles":8104,"content":8105,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#onbeforeshowrewardvideo","OnBeforeShowRewardVideo",[728,8099],"IObservable\u003CUnit> OnBeforeShowRewardVideo { get; } The event will be triggered before the reward ad is displayed. You can subscribe to execute your logic. For example, to disable the sound in the game (if it will overlap with the sound of advertising)",{"id":8107,"title":8108,"titles":8109,"content":8110,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#onaftershowrewardvideo","OnAfterShowRewardVideo",[728,8099],"IObservable\u003CUnit> OnAfterShowRewardVideo { get; } The event will be triggered after displaying the reward ad. You can subscribe to execute your logic. For example, to enable the sound in the game after the previous disabling.",{"id":8112,"title":8113,"titles":8114,"content":8115,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#loadrewardvideoasync","LoadRewardVideoAsync",[728,8099],"UniTask\u003CAdLoadResult> LoadRewardVideoAsync(\n    CancellationToken cancellationToken\n) The method tries to load a reward ad. If it fails to load the advertisement, then repeated attempts will be made with small pauses between them. The retries will continue for the duration of the Reward Load Timeout which is set in MagifySettings -> Default Features or if the load is not canceled with cancellationToken.",{"id":8117,"title":8118,"titles":8119,"content":8120,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#showrewardedvideoasync","ShowRewardedVideoAsync",[728,8099],"UniTask\u003CAdShowResult> ShowRewardedVideoAsync(\n    string placement\n) The method in case the advertisement is ready to be displayed (check with Mediator.IsRewardVideoReady) sends OnBeforeShowRewardVideo event before the advertisement starts, then displays the advertisement and sends OnAfterShowRewardVideo event after the advertisement ends.",{"id":8122,"title":5322,"titles":8123,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/advertiserservice#interstitial",[728],{"id":8125,"title":8126,"titles":8127,"content":8128,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#onbeforeshowinterstitialvideo","OnBeforeShowInterstitialVideo",[728,5322],"IObservable\u003CUnit> OnBeforeShowInterstitialVideo { get; } The event will be triggered before the interstitial ad is displayed. You can subscribe to execute your logic. For example, to disable the sound in the game (if it will overlap with the sound of advertising)",{"id":8130,"title":8131,"titles":8132,"content":8133,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#onaftershowinterstitialvideo","OnAfterShowInterstitialVideo",[728,5322],"IObservable\u003CUnit> OnAfterShowInterstitialVideo { get; } The event will be triggered after displaying the interstitial ad. You can subscribe to execute your logic. For example, to enable the sound in the game after the previous disabling.",{"id":8135,"title":8136,"titles":8137,"content":8138,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#loadintervideoasync","LoadInterVideoAsync",[728,5322],"UniTask\u003CAdLoadResult> LoadInterVideoAsync(\n    float timeout,\n    CancellationToken cancellationToken\n) The method tries to load a interstitial ad. If it fails to load the advertisement, then repeated attempts will be made with small pauses between them. The retries will continue for the timeout that was passed as an argument or if the download is not canceled with cancellationToken.",{"id":8140,"title":8141,"titles":8142,"content":8143,"level":1120},"/unity-sdk/api-collection/advertisement/advertiserservice#showintervideoasync","ShowInterVideoAsync",[728,5322],"UniTask\u003CAdShowResult> ShowInterVideoAsync(\n    string placement\n) The method in case the advertisement is ready to be displayed (check with Mediator.IsInterVideoReady) sends OnBeforeShowInterVideo event before the advertisement starts, then displays the advertisement and sends OnAfterShowInterVideo event after the advertisement ends.",{"id":8145,"title":558,"titles":8146,"content":8147,"level":1104},"/unity-sdk/api-collection/advertisement/advertiserservice#advanced",[728],"Advanced Magify SDK integration gives you more advertising opportunities. The main advantage is the ability to use ad campaigns in your app. Since you use advanced integration and want to use custom ads mediator you have to implement IAdsMediator interface instead of IMinimalAdsMediator. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"id":733,"title":732,"titles":8149,"content":8150,"level":1110},[],"Description of IMinimalAdsMediator interface This interface describes the API for interation with any ads mediator.",{"id":8152,"title":5317,"titles":8153,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/iminimaladsmediator#banner",[732],{"id":8155,"title":8156,"titles":8157,"content":8158,"level":1120},"/unity-sdk/api-collection/advertisement/iminimaladsmediator#onbannerloaded","OnBannerLoaded",[732,5317],"event Action\u003CIAdsImpression> OnBannerLoaded; Send this event if the banner has successfully showed.Will be specific for different mediators. Must be invoked when the mediator sending revenue-data.",{"id":8160,"title":8099,"titles":8161,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/iminimaladsmediator#reward",[732],{"id":8163,"title":8164,"titles":8165,"content":8166,"level":1120},"/unity-sdk/api-collection/advertisement/iminimaladsmediator#onrewardshown","OnRewardShown",[732,8099],"event Action\u003CIAdsImpression> OnRewardShown; Must be invoked when rewarded ad successfully shown.\nWill be specific for different mediators. Must be invoked when the mediator sending revenue-data.",{"id":8168,"title":5322,"titles":8169,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/iminimaladsmediator#interstitial",[732],{"id":8171,"title":8172,"titles":8173,"content":8174,"level":1120},"/unity-sdk/api-collection/advertisement/iminimaladsmediator#onintershown","OnInterShown",[732,5322],"event Action\u003CIAdsImpression> OnInterShown; Must be invoked when interstitial ad successfully shown.\nWill be specific for different mediators. Must be invoked when the mediator sending revenue-data. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":737,"title":736,"titles":8176,"content":8177,"level":1110},[],"Description of 4.IAdsMediator interface",{"id":8179,"title":4180,"titles":8180,"content":8181,"level":1104},"/unity-sdk/api-collection/advertisement/iadsmediator#overview",[736],"This interface describes the API for interation with any ads mediator and provides API to show ads. This is interface for advanced integration and it inherits all the API from IMinimalAdsMediator.",{"id":8183,"title":8057,"titles":8184,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/iadsmediator#main-api",[736],{"id":8186,"title":8187,"titles":8188,"content":8189,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#isinitialized","IsInitialized",[736,8057],"bool IsInitialized { get; } Set this field to true after the mediator has been initialized and ready for use.",{"id":8191,"title":5317,"titles":8192,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/iadsmediator#banner",[736],{"id":8194,"title":8156,"titles":8195,"content":8158,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onbannerloaded",[736,5317],{"id":8197,"title":8198,"titles":8199,"content":8200,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onbannerloadfailed","OnBannerLoadFailed",[736,5317],"event Action\u003Cstring> OnBannerLoadFailed; Send this event if mediator has failed to show banner ads.",{"id":8202,"title":8203,"titles":8204,"content":8205,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onbannerclicked","OnBannerClicked",[736,5317],"event Action\u003CIAdsImpression> OnBannerClicked; Send this event if user has clicked banned ads.",{"id":8207,"title":8208,"titles":8209,"content":8210,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#isbannervisible","IsBannerVisible",[736,5317],"bool IsBannerVisible { get; } Indicates whether the banner is currently showing, once the banner is hidden or the advertisement for the banner is not loaded for display the value should be false, if the banner is successfully displayed the value should be true.",{"id":8212,"title":8213,"titles":8214,"content":8215,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#showbanner","ShowBanner",[736,5317],"void ShowBanner(); Method should set true to the IsBannerVisible property and show the banner.",{"id":8217,"title":8218,"titles":8219,"content":8220,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#hidebanner","HideBanner",[736,5317],"void HideBanner(); Method should hide the banner and immediately set false to the IsBannerVisible property.",{"id":8222,"title":8099,"titles":8223,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/iadsmediator#reward",[736],{"id":8225,"title":8164,"titles":8226,"content":8166,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onrewardshown",[736,8099],{"id":8228,"title":8229,"titles":8230,"content":8231,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onrewardloaded","OnRewardLoaded",[736,8099],"event Action OnRewardLoaded; Send this event when the ad is loaded and set the IsRewardedVideoReady field to true.",{"id":8233,"title":8234,"titles":8235,"content":8236,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onrewardloadfailed","OnRewardLoadFailed",[736,8099],"event Action\u003Cstring> OnRewardLoadFailed; Send this event in case of errors during video loading and pass an argument to the error message.",{"id":8238,"title":8239,"titles":8240,"content":8241,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onrewarddisplayfailed","OnRewardDisplayFailed",[736,8099],"event Action\u003Cstring> OnRewardDisplayFailed; Send this event if the ad fails, passing an error message as an argument.",{"id":8243,"title":8244,"titles":8245,"content":8246,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onrewardreceived","OnRewardReceived",[736,8099],"event Action OnRewardReceived; Send this event in the case of a successful showing of a reward in which the player should receive a reward.",{"id":8248,"title":8249,"titles":8250,"content":8251,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onrewardclicked","OnRewardClicked",[736,8099],"event Action\u003CIAdsImpression> OnRewardClicked; Send this event if user has clicked rewarded ads.",{"id":8253,"title":8254,"titles":8255,"content":8256,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onrewardhidden","OnRewardHidden",[736,8099],"event Action\u003CIAdsImpression> OnRewardHidden; Send this event immediately after the rewatch is finished and the player returns to the game (regardless of whether he receives the reward or not), pass information about the advertisement that was shown to player packed in IAdsImpression.",{"id":8258,"title":8259,"titles":8260,"content":8261,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#isrewardedvideoready","IsRewardedVideoReady",[736,8099],"bool IsRewardedVideoReady { get; } This property indicates whether the ad is ready to be displayed. Advertiser accesses this property before loading and displaying ads to check if the ad needs to be loaded or if it is ready to be displayed.",{"id":8263,"title":8264,"titles":8265,"content":8266,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#loadrewardvideo","LoadRewardVideo",[736,8099],"void LoadRewardVideo(); Method should load ads for future display.",{"id":8268,"title":8269,"titles":8270,"content":8271,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#showrewardvideo","ShowRewardVideo",[736,8099],"void ShowRewardVideo(string placement); Method should show the loaded advertisement.",{"id":8273,"title":5322,"titles":8274,"content":467,"level":1104},"/unity-sdk/api-collection/advertisement/iadsmediator#interstitial",[736],{"id":8276,"title":8172,"titles":8277,"content":8278,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#onintershown",[736,5322],"event Action\u003CIAdsImpression> OnInterShown; Must be invoked when interstitial ad successfully shown.\nWill be specific for different mediators. Must be invoked when the mediator sending revenue-data.",{"id":8280,"title":8281,"titles":8282,"content":8283,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#oninterloaded","OnInterLoaded",[736,5322],"event Action OnInterLoaded; Send this event when the ad is loaded and set the IsInterVideoReady field to true.",{"id":8285,"title":8286,"titles":8287,"content":8288,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#oninterloadfailed","OnInterLoadFailed",[736,5322],"event Action\u003Cstring> OnInterLoadFailed; Send this event if the ad fails to load and set the value to false in the IsInterVideoReady field. Pass an error message in the argument.",{"id":8290,"title":8291,"titles":8292,"content":8293,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#oninterdisplayfailed","OnInterDisplayFailed",[736,5322],"event Action\u003Cstring> OnInterDisplayFailed; Send this event if the ad fails, passing an error message as an argument.",{"id":8295,"title":8296,"titles":8297,"content":8298,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#oninterclicked","OnInterClicked",[736,5322],"event Action\u003CIAdsImpression> OnInterClicked; Send this event if user has clicked interstitial ads.",{"id":8300,"title":8301,"titles":8302,"content":8303,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#oninterhidden","OnInterHidden",[736,5322],"event Action\u003CIAdsImpression> OnInterHidden; Send this event after the player views the inter and returns back to the game (regardless of whether the player clicked on the inter or not), pass information about the advertisement that was shown to player packed in IAdsImpression.",{"id":8305,"title":8306,"titles":8307,"content":8308,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#isintervideoready","IsInterVideoReady",[736,5322],"bool IsInterVideoReady { get; } This property indicates whether the ad is ready to be displayed. Advertiser refers to it before loading and displaying ads to check whether it is necessary to load the ad or it is ready for displaying.",{"id":8310,"title":8311,"titles":8312,"content":8313,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#loadintervideo","LoadInterVideo",[736,5322],"void LoadInterVideo(); Method should load ads for future display.",{"id":8315,"title":8316,"titles":8317,"content":8318,"level":1120},"/unity-sdk/api-collection/advertisement/iadsmediator#showintervideo","ShowInterVideo",[736,5322],"void ShowInterVideo(string placement); The method should show the loaded advertisement. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":741,"title":740,"titles":8320,"content":8321,"level":1110},[],"Description of the Features Provider API",{"id":8323,"title":6517,"titles":8324,"content":8325,"level":1104},"/unity-sdk/api-collection/featuresprovider#preparation",[740],"App features are available only with advanced Magify SDK integration.",{"id":8327,"title":4180,"titles":8328,"content":467,"level":1104},"/unity-sdk/api-collection/featuresprovider#overview",[740],{"id":8330,"title":7160,"titles":8331,"content":467,"level":1120},"/unity-sdk/api-collection/featuresprovider#properties",[740,4180],{"id":8333,"title":8334,"titles":8335,"content":8336,"level":4579},"/unity-sdk/api-collection/featuresprovider#onfeaturesupdated","OnFeaturesUpdated",[740,4180,7160],"event Action OnFeaturesUpdated The event is triggered every time a features list or values are updated.",{"id":8338,"title":8339,"titles":8340,"content":8341,"level":4579},"/unity-sdk/api-collection/featuresprovider#iscurrentfeaturesparsed","IsCurrentFeaturesParsed",[740,4180,7160],"bool IsCurrentFeaturesParsed { get; } The field returns true if there is an actual config (the one that was downloaded from the backend) and that was successfully parsed.",{"id":8343,"title":8344,"titles":8345,"content":8346,"level":4579},"/unity-sdk/api-collection/featuresprovider#storedappfeatures","StoredAppFeatures",[740,4180,7160],"IStoredAppFeaturesCollection StoredAppFeatures { get; } Returns read-only reactive collection of current stored app features.",{"id":8348,"title":8349,"titles":8350,"content":8351,"level":4579},"/unity-sdk/api-collection/featuresprovider#storedappfeaturesloadingtimeoutseconds","StoredAppFeaturesLoadingTimeoutSeconds",[740,4180,7160],"NumberRemoteProperty StoredAppFeaturesLoadingTimeoutSeconds { get; } Uses MagifySettings.StoredAppFeaturesLoadingTimeoutSeconds to set timeout for loading of each stored app feature.",{"id":8353,"title":6735,"titles":8354,"content":467,"level":1120},"/unity-sdk/api-collection/featuresprovider#stored-app-features",[740,4180],{"id":8356,"title":8357,"titles":8358,"content":8359,"level":4579},"/unity-sdk/api-collection/featuresprovider#loadstoredappfeature","LoadStoredAppFeature",[740,4180,6735],"UniTask\u003CContentHandle\u003CStoredAppFeatureContent>> LoadStoredAppFeature(StoredAppFeature feature, CancellationToken cancellationToken, double? timeoutSeconds = null);\nUniTask\u003CContentHandle\u003CStoredAppFeatureContent>> LoadStoredAppFeature([NotNull] string featureName, CancellationToken cancellationToken, double? timeoutSeconds = null); Requests to download the feature content. Firstly a web request is sent to check if we already have the actual content value on disk. If there is, it will be loaded from disk, otherwise the content will be downloaded and saved for later use. Returns:\nContent Handle: The content will remain in the cache as long as there is at least one handle that has not been disposed of. Remember to dispose of it when you want to release content from RAM if you don't want a memory leak.",{"id":8361,"title":8362,"titles":8363,"content":8364,"level":4579},"/unity-sdk/api-collection/featuresprovider#loadstoredappfeatures","LoadStoredAppFeatures",[740,4180,6735],"UniTask\u003CIEnumerable\u003CContentHandle\u003CStoredAppFeatureContent>>> LoadStoredAppFeatures([NotNull] IEnumerable\u003CStoredAppFeature> features, CancellationToken cancellationToken, double? timeoutSeconds = null);\nUniTask\u003CIEnumerable\u003CContentHandle\u003CStoredAppFeatureContent>>> LoadStoredAppFeatures([NotNull, ItemNotNull] IEnumerable\u003Cstring> features, CancellationToken cancellationToken, double? timeoutSeconds = null);\nUniTask\u003CIEnumerable\u003CContentHandle\u003CStoredAppFeatureContent>>> LoadStoredAppFeatures(CancellationToken cancellationToken, double? timeoutSeconds = null); The same as LoadStoredAppFeature, but for many features: Requests to download the feature content. Firstly a web request is sent to check if we already have the actual content value on disk. If there is, it will be loaded from disk, otherwise the content will be downloaded and saved for later use.",{"id":8366,"title":8367,"titles":8368,"content":467,"level":1120},"/unity-sdk/api-collection/featuresprovider#boolean","Boolean",[740,4180],{"id":8370,"title":8371,"titles":8372,"content":8373,"level":4579},"/unity-sdk/api-collection/featuresprovider#trygetbool","TryGetBool",[740,4180,8367],"bool TryGetBool(string featureName, out bool result) The method will return true if it was possible to get a bool value for featureName, the obtained value will be put into result, otherwise the method will return false.",{"id":8375,"title":8376,"titles":8377,"content":8378,"level":4579},"/unity-sdk/api-collection/featuresprovider#getbool","GetBool",[740,4180,8367],"bool GetBool(string featureName) The method will return a bool value for featureName, if the value cannot be received an ArgumentException will be thrown.",{"id":8380,"title":8381,"titles":8382,"content":8383,"level":4579},"/unity-sdk/api-collection/featuresprovider#getreactivebool","GetReactiveBool",[740,4180,8367],"IReadOnlyReactiveProperty\u003Cbool> GetReactiveBool(string featureName, bool defaultValue = default) The method will return a bool reactive field for featureName, initializing it with defaultValue in case Magify does not yet have a value for the specified feature. The field will be updated together with the call of the OnFeaturesUpdated event.",{"id":8385,"title":8386,"titles":8387,"content":467,"level":1120},"/unity-sdk/api-collection/featuresprovider#numbers","Numbers",[740,4180],{"id":8389,"title":8390,"titles":8391,"content":8392,"level":4579},"/unity-sdk/api-collection/featuresprovider#trygetnumber","TryGetNumber",[740,4180,8386],"bool TryGetNumber(string featureName, out double result) The method will return true if it was possible to get a double value for featureName, the obtained value will be put into result, otherwise the method will return false.",{"id":8394,"title":8395,"titles":8396,"content":8397,"level":4579},"/unity-sdk/api-collection/featuresprovider#getnumber","GetNumber",[740,4180,8386],"double GetNumber(string featureName) The method will return a double value for featureName, if the value cannot be received an ArgumentException will be thrown.",{"id":8399,"title":8400,"titles":8401,"content":8402,"level":4579},"/unity-sdk/api-collection/featuresprovider#getreactivenumber","GetReactiveNumber",[740,4180,8386],"IReadOnlyReactiveProperty\u003Cdouble> GetReactiveNumber(string featureName, double defaultValue = default) The method will return a double reactive field for featureName, initializing it with defaultValue in case Magify does not yet have a value for the specified feature. The field will be updated together with the call of the OnFeaturesUpdated event.",{"id":8404,"title":8405,"titles":8406,"content":467,"level":1120},"/unity-sdk/api-collection/featuresprovider#strings","Strings",[740,4180],{"id":8408,"title":8409,"titles":8410,"content":8411,"level":4579},"/unity-sdk/api-collection/featuresprovider#trygetstring","TryGetString",[740,4180,8405],"bool TryGetString(string featureName, out string result) The method will return true if it was possible to get a string value for featureName, the obtained value will be put into result, otherwise the method will return false.",{"id":8413,"title":8414,"titles":8415,"content":8416,"level":4579},"/unity-sdk/api-collection/featuresprovider#getstring","GetString",[740,4180,8405],"string GetString(string featureName) The method will return a string value for featureName, if the value cannot be received an ArgumentException will be thrown.",{"id":8418,"title":8419,"titles":8420,"content":8421,"level":4579},"/unity-sdk/api-collection/featuresprovider#getreactivestring","GetReactiveString",[740,4180,8405],"IReadOnlyReactiveProperty\u003Cstring> GetReactiveString(string featureName, string defaultValue = default) The method will return a string reactive field for featureName, initializing it with defaultValue in case Magify does not yet have a value for the specified feature. The field will be updated together with the call of the OnFeaturesUpdated event. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":744,"title":595,"titles":8423,"content":8424,"level":1110},[],"Description of the Magify campaigns Here you will be able to find various campaigns API: CampaignsProvider provides functionality to request campaigns;LimitedTimeOfferProvider provides information about LTO's;ICampaign is the interface that all campaigns implemtent;ICampaignWithCreative extends ICampaign and determines that this campaign has a creative;ICampaignWithProducts extends ICampaign and determines that this campaign has products;LimitedTimeOfferBase provides a simple and basic format for working with offers;ICampaignHandler defines the structure for campaign handlers.",{"id":750,"title":749,"titles":8426,"content":8427,"level":1110},[],"Description of the CampaignsProvider API",{"id":8429,"title":4180,"titles":8430,"content":8431,"level":1104},"/unity-sdk/api-collection/campaigns/campaignsprovider#overview",[749],"The API of the CampaignsProvider service provides functionality to request campaigns, manage campaign handlers and parameters for handling campaigns.",{"id":8433,"title":8434,"titles":8435,"content":8436,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#registercampaignhandler","RegisterCampaignHandler",[749,4180],"void RegisterCampaignHandler(ICampaignHandler handler) Registers your custom campaign handler. See ICampaignHandler for detailed description.",{"id":8438,"title":8439,"titles":8440,"content":8441,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#getcampaign","GetCampaign",[749,4180],"[CanBeNull]\nICampaign GetCampaign(\n    string @event,\n    Dictionary\u003Cstring, object> @params = null\n) Finds a campaign based on the event and parameters.",{"id":8443,"title":8444,"titles":8445,"content":8446,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#iscampaignavailable","IsCampaignAvailable",[749,4180],"bool IsCampaignAvailable(\n    string campaignName,\n    string @event,\n    Dictionary\u003Cstring, object> @params = null\n) Checks if a campaign is available for the specified event and parameters.",{"id":8448,"title":8449,"titles":8450,"content":8451,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#setparam","SetParam",[749,4180],"void SetParam(\n    string @event,\n    string param,\n    object value\n) Set the parameter value for the target event. This parameter will be added to all following campaign requests. Restrictions: after combining all parameters set in this way with the parameters passed in the campaign request to the GetCampaign or MagifyServce.RequestCampaignAsync method the result dictionary in serialized form, the length of a json string cannot exceed 512 characters. This is done to optimize and simplify the configuration of the application in the configuration panel.",{"id":8453,"title":8454,"titles":8455,"content":8456,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#setparams","SetParams",[749,4180],"void SetParams(\n    string @event,\n    IReadOnlyDictionary\u003Cstring, object> @params\n) Set all the parameters values for the target event. These parameters will be added to all following campaign requests. Restrictions: after combining all parameters set in this way with the parameters passed in the campaign request to the GetCampaign or MagifyServce.RequestCampaignAsync method the result dictionary in serialized form, the length of a json string cannot exceed 512 characters. This is done to optimize and simplify the configuration of the application in the configuration panel.",{"id":8458,"title":8459,"titles":8460,"content":8461,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#setuniversalparam","SetUniversalParam",[749,4180],"void SetUniversalParam(string param, object value) Sets a universal parameter applicable to all events. This parameter will be added to all following campaign requests. Restrictions: after combining all parameters set in this way with the parameters passed in the campaign request to the GetCampaign or MagifyServce.RequestCampaignAsync method the result dictionary in serialized form, the length of a json string cannot exceed 512 characters. This is done to optimize and simplify the configuration of the application in the configuration panel.",{"id":8463,"title":8464,"titles":8465,"content":8466,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#setuniversalparams","SetUniversalParams",[749,4180],"void SetUniversalParams(IReadOnlyDictionary\u003Cstring, object> @params) Sets multiple universal parameters applicable to all events. These parameters will be added to all following campaign requests. Restrictions: after combining all parameters set in this way with the parameters passed in the campaign request to the GetCampaign or MagifyServce.RequestCampaignAsync method the result dictionary in serialized form, the length of a json string cannot exceed 512 characters. This is done to optimize and simplify the configuration of the application in the configuration panel.",{"id":8468,"title":8469,"titles":8470,"content":8471,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#removeparam","RemoveParam",[749,4180],"void RemoveParam(string @event, string param) Removes a parameter for a specific event.",{"id":8473,"title":8474,"titles":8475,"content":8476,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#removeallparams","RemoveAllParams",[749,4180],"void RemoveAllParams(string @event) Removes all parameters for a specific event.",{"id":8478,"title":8479,"titles":8480,"content":8481,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#removeuniversalparam","RemoveUniversalParam",[749,4180],"void RemoveUniversalParam(string param) Removes a universal parameter.",{"id":8483,"title":8484,"titles":8485,"content":8486,"level":1120},"/unity-sdk/api-collection/campaigns/campaignsprovider#removealluniversalparams","RemoveAllUniversalParams",[749,4180],"void RemoveAllUniversalParams() Removes all universal parameters. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":754,"title":753,"titles":8488,"content":8489,"level":1110},[],"Description of the LimitedTimeOfferProvider API",{"id":8491,"title":4180,"titles":8492,"content":8493,"level":1104},"/unity-sdk/api-collection/campaigns/limitedtimeofferprovider#overview",[753],"The API of the MagifyService.Offers service providing LTO information is described here. This class is the main entry point to working with LTO.",{"id":8495,"title":8496,"titles":8497,"content":8498,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferprovider#onupdated","OnUpdated",[753,4180],"IObservable\u003CLtoInfo> OnUpdated { get; } Notifies you that the status or content of the offer has changed and you need to update this offer.",{"id":8500,"title":8501,"titles":8502,"content":8503,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferprovider#onfinished","OnFinished",[753,4180],"IObservable\u003CLtoInfo> OnFinished { get; } Notifies that the offer has ended for any reason (expired, the conditions of showing this offer have changed, the company has become irrelevant, conflicting offer, was finished manually).",{"id":8505,"title":8506,"titles":8507,"content":8508,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferprovider#activeoffers","ActiveOffers",[753,4180],"IReadOnlyReactiveCollection\u003CLtoInfo> ActiveOffers { get; } Contains a list of active offerers. It's a reactive collection, so you can subscribe on changing of it to track adding and re,oving of offers.",{"id":8510,"title":8511,"titles":8512,"content":8513,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferprovider#completeactivelto","CompleteActiveLto",[753,4180],"void CompleteActiveLto(string offerName) Force terminates an active offerer by its name. OnFinished listeners will be notified. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":758,"title":757,"titles":8515,"content":8516,"level":1110},[],"Description of the ICampaign interface",{"id":8518,"title":4180,"titles":8519,"content":8520,"level":1104},"/unity-sdk/api-collection/campaigns/icampaign#overview",[757],"All campaigns implement this interface, which provides two primary attributes for campaigns: its name and type.",{"id":8522,"title":8523,"titles":8524,"content":8525,"level":1120},"/unity-sdk/api-collection/campaigns/icampaign#type","Type",[757,4180],"CampaignType Type { get; }",{"id":8527,"title":8523,"titles":8528,"content":8529,"level":1120},"/unity-sdk/api-collection/campaigns/icampaign#type-1",[757,4180],"string Name { get; } html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"id":762,"title":761,"titles":8531,"content":8532,"level":1110},[],"Description of the ICampaignWithCreative interface",{"id":8534,"title":4180,"titles":8535,"content":8536,"level":1104},"/unity-sdk/api-collection/campaigns/icampaignwithcreative#overview",[761],"This interface extends ICampaign and determines that this campaign has a creative.",{"id":8538,"title":8539,"titles":8540,"content":8541,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignwithcreative#creative","Creative",[761,4180],"ICreative Creative { get; } html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":766,"title":765,"titles":8543,"content":8544,"level":1110},[],"Description of the ICampaignWithProducts interface",{"id":8546,"title":4180,"titles":8547,"content":8548,"level":1104},"/unity-sdk/api-collection/campaigns/icampaignwithproducts#overview",[765],"This interface extends ICampaign and determines that this campaign has products.",{"id":8550,"title":777,"titles":8551,"content":8552,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignwithproducts#products",[765,4180],"IReadOnlyList\u003CProductDef> Products { get; } html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":770,"title":769,"titles":8554,"content":8555,"level":1110},[],"Description of the LimitedTimeOfferBase interface",{"id":8557,"title":4180,"titles":8558,"content":8559,"level":1104},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#overview",[769],"The main purpose of this class is to provide a simple and basic format for working with offers. Based on it you can write your own implementations, or inherit from this class and extend its logic. To start working with this class you can create your own inheritor, or use a LimitedTimeOffer class. Then you must add this script to your game object and configure serializable fields. The SDK itself does not create instances with this component when adding offers, so you must either add them manually or with code. Once the object has been configured and Awake called for it, this class will independently follow changes in the state of the offer and update its content. The following will often use the word view, in this context it represents the visual of the offer. At the moment, depending on the LTO configuration, it can be texture or asset bundle.",{"id":8561,"title":8562,"titles":8563,"content":467,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#serialize-fields","Serialize fields",[769,4180],{"id":8565,"title":8566,"titles":8567,"content":8568,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#_content","_content",[769,4180,8562],"[SerializeField] private GameObject _content; Store a reference to all of the content of the offer. This object will be activated at the time of configuring the offer if there is an available view.",{"id":8570,"title":8571,"titles":8572,"content":8573,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#_ltocontainer","_ltoContainer",[769,4180,8562],"[SerializeField] private Transform _ltoContainer; Store a reference to the parent object in which the view will be placed.",{"id":8575,"title":8576,"titles":8577,"content":8578,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#_offerspot","_offerSpot",[769,4180,8562],"[SerializeField] private string _offerSpot; Must store the name of the spot which this offer is using.",{"id":8580,"title":8581,"titles":8582,"content":8583,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#_title","_title",[769,4180,8562],"[SerializeField] private TextMeshProUGUI _title; Stores a reference to where you the title or timer of this offer might be set.",{"id":8585,"title":8586,"titles":8587,"content":8588,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#_button","_button",[769,4180,8562],"[SerializeField] private Button _button; A button that will be used to track player interaction with the offer when clicked OnButtonClick will be called.",{"id":8590,"title":7160,"titles":8591,"content":467,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#properties",[769,4180],{"id":8593,"title":8594,"titles":8595,"content":8596,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#offer","Offer",[769,4180,7160],"LtoInfo Offer { get; } Provides access to the current LtoInfo instance. With this you can access all main information about the current offer.",{"id":8598,"title":8599,"titles":8600,"content":8601,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#isdefaultview","IsDefaultView",[769,4180,7160],"protected bool IsDefaultView { get; } Reflects whether the default view for the current LTO has been used.",{"id":8603,"title":8604,"titles":8605,"content":8606,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#offerspot","OfferSpot",[769,4180,7160],"string OfferSpot { get; protected set; } Provides access to the current _offerSpot value.",{"id":8608,"title":8609,"titles":8610,"content":8611,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#offertimeleft","OfferTimeLeft",[769,4180,7160],"TimeSpan OfferTimeLeft { get; } Reflects the amount of time left before the offer expires.",{"id":8613,"title":8614,"titles":8615,"content":467,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#unity-lifecycle","Unity lifecycle",[769,4180],{"id":8617,"title":8618,"titles":8619,"content":8620,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#awake","Awake",[769,4180,8614],"protected virtual void Awake() By default, this method calls the initialization of the offer. When overriding this method, you should call base.Awake() to initialize correctly.",{"id":8622,"title":8623,"titles":8624,"content":8625,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#ondestroy","OnDestroy",[769,4180,8614],"protected virtual void OnDestroy() This method frees data from RAM by default, and unsubscribes from SDK calbacks. When overriding this method, you should call base.OnDestroy() to cleanup correctly.",{"id":8627,"title":8628,"titles":8629,"content":8630,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#update","Update",[769,4180,8614],"protected virtual void Update() By default, the current LTO state is processed and updated in this method. The LTO text and timer will be updated here, and the view may also be updated. When overriding this method, you can call base.Update() if you need.",{"id":8632,"title":7589,"titles":8633,"content":467,"level":1120},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#methods",[769,4180],{"id":8635,"title":8636,"titles":8637,"content":8638,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#canupdatedefaultview","CanUpdateDefaultView",[769,4180,7589],"protected virtual bool CanUpdateDefaultView() This method should return true if it is possible to update the default view to some other view at this point in time. By default, this method always returns false.\nThis method makes sense only if the default view was used during initialization of the offer and then some other view value became available during the application and you want to replace it.",{"id":8640,"title":8641,"titles":8642,"content":8643,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#onbuttonclick","OnButtonClick",[769,4180,7589],"protected abstract void OnButtonClick() This method is called when _button was clicked.",{"id":8645,"title":8646,"titles":8647,"content":8648,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#getformattedtitle","GetFormattedTitle",[769,4180,7589],"protected virtual string GetFormattedTitle() The method returns the title of the given offer. By default it returns Offer.BadgeCreative.LabelText.",{"id":8650,"title":8651,"titles":8652,"content":8653,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#getformattedtimer","GetFormattedTimer",[769,4180,7589],"protected virtual string GetFormattedTimer() The method returns the timer of the given offer. By default it uses formatted OfferTimeLeft with format hours:minutes:seconds.",{"id":8655,"title":8656,"titles":8657,"content":8658,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#offeradded","OfferAdded",[769,4180,7589],"protected virtual void OfferAdded(LtoInfo ltoInfo) This method is called when SDK notifies that an offer with such a OfferSpot has been started/added.\nBy default, this method calls the setup of the current offer, which includes setting the view, title, timer, and other details.",{"id":8660,"title":8661,"titles":8662,"content":8663,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#offerupdated","OfferUpdated",[769,4180,7589],"protected virtual void OfferUpdated(LtoInfo ltoInfo) This method is called when SDK notifies that an offer with such a OfferSpot has been updated.\nBy default, this method updates all values that may have changed, the work done is similar to calling OfferAdded.",{"id":8665,"title":8666,"titles":8667,"content":8668,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#offerremoved","OfferRemoved",[769,4180,7589],"protected virtual void OfferRemoved(LtoInfo ltoInfo) This method is called when SDK notifies that an offer with such a OfferSpot has been removed.\nThis method causes the data of the offer to be cleaned using the CleanUp.",{"id":8670,"title":8671,"titles":8672,"content":8673,"level":4579},"/unity-sdk/api-collection/campaigns/limitedtimeofferbase#cleanup","CleanUp",[769,4180,7589],"protected virtual void CleanUp() This method should clean up all data after an offer is finished, such as when it is finished or removed. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":774,"title":773,"titles":8675,"content":8676,"level":1110},[],"Description of the ICampaignHandler API",{"id":8678,"title":8679,"titles":8680,"content":467,"level":1104},"/unity-sdk/api-collection/campaigns/icampaignhandler#icampaignhandler-interface","ICampaignHandler Interface",[773],{"id":8682,"title":4180,"titles":8683,"content":8684,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignhandler#overview",[773,8679],"The ICampaignHandler interface defines the structure for campaign handlers, which determine if they can handle specific campaigns and execute them asynchronously.",{"id":8686,"title":8687,"titles":8688,"content":8689,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignhandler#canhandlecampaign","CanHandleCampaign",[773,8679],"bool CanHandleCampaign(CampaignRequest request) Determines whether the handler can process the given campaign request.",{"id":8691,"title":8692,"titles":8693,"content":8694,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignhandler#handlecampaignasync","HandleCampaignAsync",[773,8679],"UniTask\u003CCampaignResult> HandleCampaignAsync(CampaignRequest request, CancellationToken cancellationToken) Handles the campaign asynchronously.",{"id":8696,"title":8697,"titles":8698,"content":467,"level":1104},"/unity-sdk/api-collection/campaigns/icampaignhandler#campaignhandlert-abstract-class","CampaignHandler\u003CT> Abstract Class",[773],{"id":8700,"title":4180,"titles":8701,"content":8702,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignhandler#overview-1",[773,8697],"The CampaignHandler\u003CT> abstract class provides a base implementation of the ICampaignHandler interface for generic campaign type.",{"id":8704,"title":8687,"titles":8705,"content":8706,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignhandler#canhandlecampaign-1",[773,8697],"bool CanHandleCampaign(CampaignRequest request)\n{\n    return request.Campaign is T typed && CanHandleCampaign(request, typed);\n} Checks whether the handler can process the campaign request based on its type.",{"id":8708,"title":8709,"titles":8710,"content":8711,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignhandler#canhandlecampaign-overridable","CanHandleCampaign (Overridable)",[773,8697],"protected virtual bool CanHandleCampaign(CampaignRequest request, T campaign) Provides a customizable check for handling a campaign of type T.",{"id":8713,"title":8692,"titles":8714,"content":8715,"level":1120},"/unity-sdk/api-collection/campaigns/icampaignhandler#handlecampaignasync-1",[773,8697],"abstract UniTask\u003CCampaignResult> HandleCampaignAsync(CampaignRequest request, CancellationToken cancellationToken) Processes the campaign asynchronously. This method must be implemented by derived classes. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":778,"title":777,"titles":8717,"content":8718,"level":1110},[],"Description of the Magify products Here you will be able to find various products API: ProductDef is the base abstract class for all product types;InAppProduct describes the in-app product;SubscriptionProduct describes the subscription product;RewardProduct describes the reward product that is received for viewing the reward ads;BonusProduct describes the product that the user receives for free e.g. daily rewards;InfoProduct describes the free rewards that the player receives for studying some information;ExternalLinkProduct describes the product received when external links are clicked;InternalLinkProduct describes the product received when internal links are clicked;CrossPromoProduct describes the product received when interacting with a campaign promoting another of your app.",{"id":784,"title":783,"titles":8720,"content":8721,"level":1110},[],"Description of the CrossPromoProduct API",{"id":8723,"title":4180,"titles":8724,"content":8725,"level":1104},"/unity-sdk/api-collection/products/crosspromoproduct#overview",[783],"Describes the product received when interacting with a campaign promoting another of your app. Inherits ProductDef.",{"id":8727,"title":8728,"titles":8729,"content":8730,"level":1120},"/unity-sdk/api-collection/products/crosspromoproduct#bundleid","BundleId",[783,4180],"[NotNull]\nstring BundleId { get; } The identifier of the promoting application. Android: application idiOS: bundle id",{"id":8732,"title":8733,"titles":8734,"content":8735,"level":1120},"/unity-sdk/api-collection/products/crosspromoproduct#url","Url",[783,4180],"[NotNull]\nstring Url { get; } Link to this application.",{"id":8737,"title":8738,"titles":8739,"content":8740,"level":1120},"/unity-sdk/api-collection/products/crosspromoproduct#schemas","Schemas",[783,4180],"[CanBeNull]\nIReadOnlyList\u003Cstring> Schemas { get; } The url schemas of the promoting application. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":788,"title":787,"titles":8742,"content":8743,"level":1110},[],"Description of the ProductDef API",{"id":8745,"title":4180,"titles":8746,"content":8747,"level":1104},"/unity-sdk/api-collection/products/productdef#overview",[787],"This class is the base abstract class for all product types.",{"id":8749,"title":8750,"titles":8751,"content":8752,"level":1120},"/unity-sdk/api-collection/products/productdef#id","Id",[787,4180],"[NotNull]\nstring Id { get; } The unique identifier for this product.",{"id":8754,"title":8755,"titles":8756,"content":8757,"level":1120},"/unity-sdk/api-collection/products/productdef#payout","Payout",[787,4180],"[NotNull]\nIReadOnlyList\u003CPayoutDef> Payout { get; } List of product data contents. Each element is a description of a bonus that should be credited to the user.",{"id":8759,"title":8539,"titles":8760,"content":8761,"level":1120},"/unity-sdk/api-collection/products/productdef#creative",[787,4180],"[CanBeNull]\nProductCreative Creative { get; } Describes the visual representation of this product.",{"id":8763,"title":8764,"titles":8765,"content":8766,"level":1120},"/unity-sdk/api-collection/products/productdef#context","Context",[787,4180],"[CanBeNull]\nIReadOnlyDictionary\u003Cstring, object> Context { get; } Raw product context. Usually contains payout and other data. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":792,"title":791,"titles":8768,"content":8769,"level":1110},[],"Description of the InAppProduct API",{"id":8771,"title":4180,"titles":8772,"content":8773,"level":1104},"/unity-sdk/api-collection/products/inappproduct#overview",[791],"Describes the in-app product. Inherits ProductDef. bool IsConsumable { get; } Determines whether the product is consumable. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":796,"title":795,"titles":8775,"content":8776,"level":1110},[],"Description of the SubscriptionProduct API",{"id":8778,"title":4180,"titles":8779,"content":8780,"level":1104},"/unity-sdk/api-collection/products/subscriptionproduct#overview",[795],"Describes the subscription product. Inherits ProductDef.",{"id":800,"title":799,"titles":8782,"content":8783,"level":1110},[],"Description of the RewardProduct API",{"id":8785,"title":4180,"titles":8786,"content":8787,"level":1104},"/unity-sdk/api-collection/products/rewardproduct#overview",[799],"Describes the reward product that is received for viewing the reward ads. Inherits ProductDef. int Count { get; } Amount of reward products. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":804,"title":803,"titles":8789,"content":8790,"level":1110},[],"Description of the BonusProduct API",{"id":8792,"title":803,"titles":8793,"content":8794,"level":1104},"/unity-sdk/api-collection/products/bonusproduct#bonusproduct",[803],"A product that the user receives for free e.g. daily rewards. Inherits ProductDef.",{"id":808,"title":807,"titles":8796,"content":8797,"level":1110},[],"Description of the InfoProduct API",{"id":8799,"title":4180,"titles":8800,"content":8801,"level":1104},"/unity-sdk/api-collection/products/infoproduct#overview",[807],"Free rewards that the player receives for studying some information, for example, there was an update of the application user read the list of changes because of this received a reward. Inherits ProductDef.",{"id":812,"title":811,"titles":8803,"content":8804,"level":1110},[],"Description of the ExternalLinkProduct API",{"id":8806,"title":4180,"titles":8807,"content":8808,"level":1104},"/unity-sdk/api-collection/products/externallinkproduct#overview",[811],"Describes the product received when external links are clicked. Inherits ProductDef.",{"id":8810,"title":8733,"titles":8811,"content":8812,"level":1120},"/unity-sdk/api-collection/products/externallinkproduct#url",[811,4180],"string Url { get; } Stores an external link url. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":816,"title":815,"titles":8814,"content":8815,"level":1110},[],"Description of the InternalLinkProduct API",{"id":8817,"title":4180,"titles":8818,"content":8819,"level":1104},"/unity-sdk/api-collection/products/internallinkproduct#overview",[815],"Describes the product received when internal links are clicked. Inherits ProductDef.",{"id":8821,"title":8822,"titles":8823,"content":8824,"level":1120},"/unity-sdk/api-collection/products/internallinkproduct#link","Link",[815,4180],"string Link { get; } Stores an internal link. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":820,"title":819,"titles":8826,"content":8827,"level":1110},[],"Description of the Magify creatives Here you will be able to find various creatives-related API: ICreative is basic interface for all types of creative;ImageCreative contains an image that is configured in the admin panel and will be shown to the user within a frame;CustomCreative is a screen (popup/prefab) embedded in the application, with a configurable ScreenId from the front-end configuratuion panel;BundleCreative allows you to use asset bundles as a creative;CreativeBackground describes the background for creative.",{"id":826,"title":825,"titles":8829,"content":8830,"level":1110},[],"Description of the ICreative interface",{"id":8832,"title":4180,"titles":8833,"content":8834,"level":1104},"/unity-sdk/api-collection/creatives/icreative#overview",[825],"A basic interface for all types of creative.",{"id":8836,"title":8837,"titles":8838,"content":8839,"level":1120},"/unity-sdk/api-collection/creatives/icreative#attributes","Attributes",[825,4180],"[CanBeNull]\nIReadOnlyDictionary\u003Cstring, object> Attributes { get; } Stores the attributes with which the given creative is configured. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":830,"title":829,"titles":8841,"content":8842,"level":1110},[],"Description of the ImageCreative",{"id":8844,"title":4180,"titles":8845,"content":8846,"level":1104},"/unity-sdk/api-collection/creatives/imagecreative#overview",[829],"This creative contains an image that is configured in the admin panel and will be shown to the user within a frame. For example, after the transition to a new level InApp campaign will be requested, which will first show the user an image of what he will get by purchasing this product, the user can close this creative or click on the purchase button after which the native window from the store for purchasing the product will appear. Inherits ICreative.",{"id":8848,"title":8837,"titles":8849,"content":8850,"level":1120},"/unity-sdk/api-collection/creatives/imagecreative#attributes",[829,4180],"IReadOnlyDictionary\u003Cstring, object> Attributes { get; } See ICreative.",{"id":8852,"title":8853,"titles":8854,"content":8855,"level":1120},"/unity-sdk/api-collection/creatives/imagecreative#isfullscreen","IsFullScreen",[829,4180],"bool IsFullScreen { get; } Describes whether this image should be displayed full screen. By default, returns true if the Background Opacity is equal to or greater than 100.",{"id":8857,"title":8858,"titles":8859,"content":8860,"level":1120},"/unity-sdk/api-collection/creatives/imagecreative#portrait","Portrait",[829,4180],"string Portrait { get; } Stores a link to a portrait image for creative.",{"id":8862,"title":8863,"titles":8864,"content":8865,"level":1120},"/unity-sdk/api-collection/creatives/imagecreative#landscape","Landscape",[829,4180],"string Landscape { get; } Stores a link to a landscape image for creative.",{"id":8867,"title":8868,"titles":8869,"content":8870,"level":1120},"/unity-sdk/api-collection/creatives/imagecreative#buttonclosetimeout","ButtonCloseTimeout",[829,4180],"float ButtonCloseTimeout { get; } Determines the time after which the button to close the creative should appear.",{"id":8872,"title":8873,"titles":8874,"content":8875,"level":1120},"/unity-sdk/api-collection/creatives/imagecreative#background","Background",[829,4180],"[CanBeNull]\nCreativeBackground Background { get; } See CreativeBackground. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":834,"title":833,"titles":8877,"content":8878,"level":1110},[],"Description of the CustomCreative",{"id":8880,"title":4180,"titles":8881,"content":8882,"level":1104},"/unity-sdk/api-collection/creatives/customcreative#overview",[833],"This is a screen (popup/prefab) embedded in the application, with a configurable ScreenId from the front-end configuratuion panel. It will be requested from the application during campaign processing. For example, an InApp campaign will be requested after a transition that will first show the user some sort of popup (created directly in Unity by you) about what they will get by purchasing this product, the user can close this creative or click on the buy button, then a native store window will appear to purchase the product. Inherits ICreative.",{"id":8884,"title":8837,"titles":8885,"content":8850,"level":1120},"/unity-sdk/api-collection/creatives/customcreative#attributes",[833,4180],{"id":8887,"title":8888,"titles":8889,"content":8890,"level":1120},"/unity-sdk/api-collection/creatives/customcreative#screenid","ScreenId",[833,4180],"string ScreenId { get; } The unique identifier of the custom creative. Used to display an appropriate popup, such as some prefab. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":838,"title":837,"titles":8892,"content":8893,"level":1110},[],"Description of the BundleCreative interface",{"id":8895,"title":8896,"titles":8897,"content":8898,"level":1104},"/unity-sdk/api-collection/creatives/bundlecreative#bundlecreative-api","BundleCreative API",[837],"Bundles are entities that are not in the application at the build-time, but are uploaded to the server as asset bundles and downloaded in the runtime game for later display to the user. In our SDK they are represented by default as bundle creatives that you can add for different campaigns. You can read more about building and usage of bundles on the related page. Inherits ICreative.",{"id":8900,"title":8837,"titles":8901,"content":8850,"level":1120},"/unity-sdk/api-collection/creatives/bundlecreative#attributes",[837,8896],{"id":8903,"title":8733,"titles":8904,"content":8905,"level":1120},"/unity-sdk/api-collection/creatives/bundlecreative#url",[837,8896],"string Url { get; } Stores a url link to the Asset Bundle content.",{"id":8907,"title":8868,"titles":8908,"content":8870,"level":1120},"/unity-sdk/api-collection/creatives/bundlecreative#buttonclosetimeout",[837,8896],{"id":8910,"title":8873,"titles":8911,"content":8875,"level":1120},"/unity-sdk/api-collection/creatives/bundlecreative#background",[837,8896],{"id":842,"title":841,"titles":8913,"content":8914,"level":1110},[],"Description of the CreativeBackground",{"id":8916,"title":841,"titles":8917,"content":8918,"level":1104},"/unity-sdk/api-collection/creatives/creativebackground#creativebackground",[841],"This type describes the background for creative.",{"id":8920,"title":8921,"titles":8922,"content":8923,"level":1120},"/unity-sdk/api-collection/creatives/creativebackground#color","Color",[841,841],"Color Color { get; } Backgorund color.",{"id":8925,"title":8926,"titles":8927,"content":8928,"level":1120},"/unity-sdk/api-collection/creatives/creativebackground#opacity","Opacity",[841,841],"int Opacity { get; } Backgoung opacity/transparency.",{"id":8930,"title":8931,"titles":8932,"content":8933,"level":1120},"/unity-sdk/api-collection/creatives/creativebackground#isblurred","IsBlurred",[841,841],"bool IsBlurred { get; } Defines if backgound must be blured. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"id":846,"title":845,"titles":8935,"content":8936,"level":1110},[],"Description of the Magify popups Here you will be able to find various popups-related API: IPopupBase is interface that each popup must implement;IPopup is designed for popups, which in addition to displaying information request the player to act;IPopupWithProducts is intended for campaigns that are capable of displaying one or many products;IPopupsProvider is interface that provides the ability to define your own way of loading popups.",{"id":852,"title":851,"titles":8938,"content":8939,"level":1110},[],"Description of the IPopupBase interface",{"id":8941,"title":4180,"titles":8942,"content":8943,"level":1104},"/unity-sdk/api-collection/popups/ipopupbase#overview",[851],"Each popup implements this interface, which is a very simple contract:",{"id":8945,"title":8946,"titles":8947,"content":8948,"level":1120},"/unity-sdk/api-collection/popups/ipopupbase#onhiderequested","OnHideRequested",[851,4180],"event Action OnHideRequested Should be called after the popup is closed.",{"id":8950,"title":8951,"titles":8952,"content":8953,"level":1120},"/unity-sdk/api-collection/popups/ipopupbase#showasync","ShowAsync",[851,4180],"ShowAsync(TArgs arguments, CancellationToken cancellationToken) Should display the popup on the screen. The method accepts as input parameters with the help of which the campaign can pass additional data to the popup to customize the display and CancellationToken on the cancellation of which the display should be interrupted as soon as possible.",{"id":8955,"title":8956,"titles":8957,"content":8958,"level":1120},"/unity-sdk/api-collection/popups/ipopupbase#hideasync","HideAsync",[851,4180],"HideAsync(CancellationToken cancellationToken) Should hide the popup from the screen. The method accepts CancellationToken on canceling of which the display should be interrupted as soon as possible. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":856,"title":855,"titles":8960,"content":8961,"level":1110},[],"Description of the IPopup interface",{"id":8963,"title":4180,"titles":8964,"content":8965,"level":1104},"/unity-sdk/api-collection/popups/ipopup#overview",[855],"This interface, inherited from IPopupBase, is designed for popups, which in addition to displaying information request the player to act, giving the opportunity to click on the button:",{"id":8967,"title":8968,"titles":8969,"content":8970,"level":1120},"/unity-sdk/api-collection/popups/ipopup#onclicked","OnClicked",[855,4180],"event Action OnClicked Should be called after the player expresses his desire to perform an action (e.g. click on the \"Buy\" button). html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":860,"title":859,"titles":8972,"content":8973,"level":1110},[],"Description of the IPopupWithProducts interface",{"id":8975,"title":859,"titles":8976,"content":8977,"level":1104},"/unity-sdk/api-collection/popups/ipopupwithproducts#ipopupwithproducts",[859],"This interface is inherited from IPopupBase and is intended for campaigns that are capable of displaying one or many products. For example, a user has triggered a RateReview campaign that requires a popup with stars to be displayed for evaluation, MagifyService will call IPopupsProvider.LoadRateReviewPopup to request a popup that is intended to display the desired visual, the method will load the popup in some way (depending on the IPopupsProvider implementation) and return it to MagifyService (the popup class must be inherited from IPopup). After that MagifyService will call the IPopupBase.ShowAsync method to display the popup and wait for the user's actions: If the user closes the popup, the popup should close and call the IPopupBase.OnHideRequested, by which MagifyService will continue and finish displaying the company with the marker \"Declined\".If the user clicks on the \"Evaluate\" button, then the IPopup.OnClicked will be called, by which MagifyService will redirect the player to the Store to evaluate the game in it, after the player returns MagifyService will finish the company with the marker \"Applied\".",{"id":8979,"title":8968,"titles":8980,"content":8981,"level":1120},"/unity-sdk/api-collection/popups/ipopupwithproducts#onclicked",[859,859],"event Action\u003CProductDef> OnClicked Should be called after the player expresses his desire to fulfill the purchase and transfer the product the player has chosen.",{"id":8983,"title":8984,"titles":8985,"content":8986,"level":1120},"/unity-sdk/api-collection/popups/ipopupwithproducts#closeafterobtain","CloseAfterObtain",[859,859],"bool CloseAfterObtain { get; } = true; Determines whether the popup should be closed after abtaining the product.",{"id":8988,"title":8989,"titles":8990,"content":8991,"level":1120},"/unity-sdk/api-collection/popups/ipopupwithproducts#updateproducts","UpdateProducts",[859,859],"UpdateProducts(IReadOnlyList\u003CProductDef> products) Method will be called while preparing the campaign for display by passing the list of available products. The method can also be called in case the campaign is still displayed, but for some reason the list of products has been updated, in this case the popup should update the display using the new product data. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":864,"title":863,"titles":8993,"content":8994,"level":1110},[],"Description of the IPopupsProvider interface",{"id":8996,"title":4180,"titles":8997,"content":8998,"level":1104},"/unity-sdk/api-collection/popups/ipopupsprovider#overview",[863],"The interface provides the ability to define your own way of loading popups (e.g. using Addresables). SDK out of the box contains ResourcesPopupsProvider class, which loads popups from Resources folder. More information about popups here.",{"id":9000,"title":9001,"titles":9002,"content":9003,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#unloadpopup","UnloadPopup",[863,4180],"void UnloadPopup\u003CTArgs>(IPopupBase\u003CTArgs> popup)\n    where TArgs : PopupArgs; The method must be defined, because regardless of the number of supported popups, any of them must be able to be unloaded after use.\nThe method must unload the popup that was passed as an argument popup.",{"id":9005,"title":9006,"titles":9007,"content":9008,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loadpopup","LoadPopup",[863,4180],"UniTask\u003CIPopup\u003CPopupArgs>> LoadPopup(string screenId, CancellationToken cancellationToken) The method is used when processing campaigns that have CustomCreative. The method should load the creative by screenId (which comes with the creative) and return a reference to an already created popup on the stage.",{"id":9010,"title":9011,"titles":9012,"content":9013,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loadcreativewithproductspopup","LoadCreativeWithProductsPopup",[863,4180],"UniTask\u003CIPopupWithProducts\u003CCreativePopup.Args>> LoadCreativeWithProductsPopup(string screenId, CancellationToken cancellationToken) The method is used when processing campaigns that have CustomCreative but also have one or many products. The method should load the creative by screenId (which comes with the creative) and return a reference to an already created popup on the stage. The difference between this method and LoadPopup is that the popup loaded by this method must implement the IPopupWithProducts interface, thus indicating that it supports the display of products.",{"id":9015,"title":9016,"titles":9017,"content":9018,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loadspinner","LoadSpinner",[863,4180],"UniTask\u003CIPopupBase\u003CPopupArgs>> LoadSpinner(CancellationToken cancellationToken) The method must load a spinner that can be used in processing some campaigns and obtaining some products.",{"id":9020,"title":9021,"titles":9022,"content":9023,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loadimagepopup","LoadImagePopup",[863,4180],"UniTask\u003CIPopup\u003CImagePopup.Args>> LoadImagePopup(CancellationToken cancellationToken) The method should load a popup that implements the IPopup\u003CImagePopup.Args> interface and return a reference to the created popup on the scene. IPopup\u003CImagePopup.Args> should be able to display an ImageCreative with a texture, which will be passed to the popup via ImagePopup.Args when it tries to show it.",{"id":9025,"title":9026,"titles":9027,"content":9028,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loadfullscreenpopup","LoadFullscreenPopup",[863,4180],"UniTask\u003CIPopup\u003CImagePopup.Args>> LoadFullscreenPopup(CancellationToken cancellationToken) The method should load a popup that implements the IPopup\u003CImagePopup.Args> interface and return a reference to the created popup on the scene. IPopup\u003CImagePopup.Args> should be able to display an ImageCreative with a texture, which will be passed to the popup via ImagePopup.Args when it tries to show it. LoadFullscreenPopup differs from LoadImagePopup in that a popup loaded with LoadFullscreenPopup should display a full screen picture without frames, while LoadImagePopup is the opposite.",{"id":9030,"title":9031,"titles":9032,"content":9033,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loadratereviewpopup","LoadRateReviewPopup",[863,4180],"UniTask\u003CIPopup\u003CPopupArgs>> LoadRateReviewPopup(CancellationToken cancellationToken) The method should load the popup to be used in Rate Review Campaign. The method should load a popup that implements the IPopup interface and return a reference to the created popup on the scene.",{"id":9035,"title":9036,"titles":9037,"content":9038,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loadinterpopupsplash","LoadInterPopupSplash",[863,4180],"UniTask\u003CIPopupBase\u003CPopupArgs>> LoadInterPopupSplash(CancellationToken cancellationToken) The method should load the popup to be used in Campaigns handling | Interstitial Campaign. The method should load a popup that implements the IPopupBase interface and return a reference to the created popup on the scene.",{"id":9040,"title":9041,"titles":9042,"content":9043,"level":1120},"/unity-sdk/api-collection/popups/ipopupsprovider#loaderrorpopup","LoadErrorPopup",[863,4180],"UniTask\u003CIPopup\u003CErrorPopup.Args>> LoadErrorPopup(CancellationToken cancellationToken) The method is not yet used inside the SDK. Will be added in future updates. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":868,"title":867,"titles":9045,"content":9046,"level":1110},[],"Description of the Magify  product obtainers Here you will be able to find various product obtiners API: ProductsObtainer  is responsible for performing the obtaining all kinds of campaign products (ProductDef);IProductObtainer defines the structure for obtaining and preparing products.",{"id":874,"title":873,"titles":9048,"content":9049,"level":1110},[],"Description of the ProductsObtainer",{"id":9051,"title":6517,"titles":9052,"content":9053,"level":1104},"/unity-sdk/api-collection/obtainers/productsobtainer#preparation",[873],"This API become available with advanced Magify SDK integration are described here.",{"id":9055,"title":4180,"titles":9056,"content":9057,"level":1104},"/unity-sdk/api-collection/obtainers/productsobtainer#overview",[873],"This service is responsible for performing the obtaining all kinds of campaign products (ProductDef).\nIn addition to the embedded handlers, you will also be able to add custom obtainers in case you need specific logic to obtain any types of products.",{"id":9059,"title":9060,"titles":9061,"content":9062,"level":1120},"/unity-sdk/api-collection/obtainers/productsobtainer#onproductobtainbegan","OnProductObtainBegan",[873,4180],"IObservable\u003CProductDef> OnProductObtainBegan { get; } If the IProductObtainer has been successfully found and the product is ready to be obtained then this observable will be notified at the very beginning of the process.",{"id":9064,"title":9065,"titles":9066,"content":9067,"level":1120},"/unity-sdk/api-collection/obtainers/productsobtainer#onproductobtained","OnProductObtained",[873,4180],"IObservable\u003CProductObtainResult> OnProductObtained { get; } If the product was successfully obtained then this observable will be notified.",{"id":9069,"title":9070,"titles":9071,"content":9072,"level":1120},"/unity-sdk/api-collection/obtainers/productsobtainer#onproductobtainfinished","OnProductObtainFinished",[873,4180],"IObservable\u003CProductObtainResult> OnProductObtainFinished { get; } At the very end, after the obtaining has been processed, this observable will be notified regardless of whether the product was successfully received or whether some error occurred.",{"id":9074,"title":8434,"titles":9075,"content":9076,"level":1120},"/unity-sdk/api-collection/obtainers/productsobtainer#registercampaignhandler",[873,4180],"void RegisterCampaignHandler(IProductObtainer obtainer) Allows you to register a custom product obtain handler. Custom handlers always take precedence over embedded handlers.",{"id":9078,"title":9079,"titles":9080,"content":9081,"level":1120},"/unity-sdk/api-collection/obtainers/productsobtainer#canobtainproduct","CanObtainProduct",[873,4180],"bool CanObtainProduct(ProductDef product) Returns true if any handler that can handle this product (embedded or custom) was found.",{"id":9083,"title":9084,"titles":9085,"content":9086,"level":1120},"/unity-sdk/api-collection/obtainers/productsobtainer#obtainproductasync","ObtainProductAsync",[873,4180],"UniTask\u003CProductObtainResult> ObtainProductAsync(ProductDef product, CampaignRequest request, CancellationToken cancellationToken) Performs the process of obtaining a product using embedded or custom obtain handler. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":878,"title":877,"titles":9088,"content":9089,"level":1110},[],"Description of the IProductObtainer interface",{"id":9091,"title":4180,"titles":9092,"content":9093,"level":1104},"/unity-sdk/api-collection/obtainers/iproductobtainer#overview",[877],"Magify provides functionality for managing product obtainers and their behavior. This includes checking product availability, preparing products, and obtaining them through campaigns.",{"id":9095,"title":9096,"titles":9097,"content":467,"level":1104},"/unity-sdk/api-collection/obtainers/iproductobtainer#iproductobtainer-interface","IProductObtainer Interface",[877],{"id":9099,"title":4180,"titles":9100,"content":9101,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#overview-1",[877,9096],"The IProductObtainer interface defines the structure for obtaining and preparing products.",{"id":9103,"title":9104,"titles":9105,"content":9106,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#obtainunderspin","ObtainUnderSpin",[877,9096],"bool ObtainUnderSpin => false; Indicates whether the product should be obtained under spinner popup.",{"id":9108,"title":9079,"titles":9109,"content":9110,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#canobtainproduct",[877,9096],"bool CanObtainProduct(ProductDef product); Determines if the specified product can be obtained by this implementation.",{"id":9112,"title":9113,"titles":9114,"content":9115,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#needprepareproduct","NeedPrepareProduct",[877,9096],"bool NeedPrepareProduct(ProductDef product) => false; Checks whether the specified product needs preparation before obtaining.",{"id":9117,"title":7528,"titles":9118,"content":9119,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#prepareproductasync",[877,9096],"UniTask\u003CProductPrepareResult> PrepareProductAsync(ProductDef product, CancellationToken cancellationToken) => UniTask.FromResult(ProductPrepareResult.Success()); Asynchronously prepares the specified product for obtaining. Defaults to returning a successful result.",{"id":9121,"title":9084,"titles":9122,"content":9123,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#obtainproductasync",[877,9096],"UniTask\u003CProductObtainResult> ObtainProductAsync(ProductDef product, CampaignRequest request); Asynchronously obtains the specified product based on the provided campaign request.",{"id":9125,"title":9126,"titles":9127,"content":467,"level":1104},"/unity-sdk/api-collection/obtainers/iproductobtainer#productobtainert-abstract-class","ProductObtainer\u003CT> Abstract Class",[877],{"id":9129,"title":4180,"titles":9130,"content":9131,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#overview-2",[877,9126],"The ProductObtainer\u003CT> abstract class provides a base implementation of the IProductObtainer interface for specific product types.",{"id":9133,"title":9079,"titles":9134,"content":9135,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#canobtainproduct-1",[877,9126],"virtual bool CanObtainProduct(ProductDef product)\n{\n    return product is T;\n} Checks whether the specified product can be obtained. By default, verifies if the product is of type T.",{"id":9137,"title":9084,"titles":9138,"content":9139,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#obtainproductasync-1",[877,9126],"UniTask\u003CProductObtainResult> ObtainProductAsync(ProductDef product, CampaignRequest request)\n{\n    return ObtainProductAsync((T)product, request);\n} Delegates the product obtaining operation to a type-specific implementation.",{"id":9141,"title":9142,"titles":9143,"content":9144,"level":1120},"/unity-sdk/api-collection/obtainers/iproductobtainer#obtainproductasync-type-specific","ObtainProductAsync (Type-Specific)",[877,9126],"private protected abstract UniTask\u003CProductObtainResult> ObtainProductAsync(T product, CampaignRequest request); Type-specific implementation of the product obtaining operation. Must be implemented by derived classes. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":882,"title":881,"titles":9146,"content":9147,"level":1110},[],"Description of the ServiceTime API",{"id":9149,"title":4180,"titles":9150,"content":9151,"level":1104},"/unity-sdk/api-collection/servicetime#overview",[881],"Magify SDK provides built-in way to verify the current real time using time synchronization with the server.",{"id":9153,"title":9154,"titles":9155,"content":9156,"level":1120},"/unity-sdk/api-collection/servicetime#isnetworktimeprotected","IsNetworkTimeProtected",[881,4180],"IReadOnlyReactiveProperty\u003Cbool> IsNetworkTimeProtected { get; } Determines whether the current Now and UtcNow time provided can be trusted. SDK automatically marks it as untrusted if synchronization with the server after hot start fails.",{"id":9158,"title":9159,"titles":9160,"content":9161,"level":1120},"/unity-sdk/api-collection/servicetime#now","Now",[881,4180],"DateTime Now { get; } Displays the current local time synchronized with the server (based on DateTime.Now).",{"id":9163,"title":9164,"titles":9165,"content":9166,"level":1120},"/unity-sdk/api-collection/servicetime#utcnow","UtcNow",[881,4180],"DateTime UtcNow { get; } Displays the current UTC time synchronized with the server (based on DateTime.UtcNow).",{"id":9168,"title":9169,"titles":9170,"content":9171,"level":1120},"/unity-sdk/api-collection/servicetime#markasunprotected","MarkAsUnprotected",[881,4180],"void MarkAsUnprotected() Allows you to force mark the current provided time as untrusted. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":885,"title":591,"titles":9173,"content":9174,"level":1110},[],"Description of the Magify content-realated types Here you will be able to find various product obtiners API: ContentItem describes some content available for downloading.",{"id":891,"title":890,"titles":9176,"content":9177,"level":1110},[],"Description of the ContentItem",{"id":9179,"title":4180,"titles":9180,"content":9181,"level":1104},"/unity-sdk/api-collection/content/contentitem#overview",[890],"This type describes some content available for downloading.",{"id":9183,"title":9184,"titles":9185,"content":9186,"level":1120},"/unity-sdk/api-collection/content/contentitem#key","Key",[890,4180],"string Key { get; init; } Key of the content;",{"id":9188,"title":8822,"titles":9189,"content":9190,"level":1120},"/unity-sdk/api-collection/content/contentitem#link",[890,4180],"string Link { get; init; } Link for downloading of content;",{"id":9192,"title":9193,"titles":9194,"content":9195,"level":1120},"/unity-sdk/api-collection/content/contentitem#previews","Previews",[890,4180],"List\u003Cstring> Previews { get; init; } Links for downloading of content's preview;",{"id":9197,"title":9198,"titles":9199,"content":9200,"level":1120},"/unity-sdk/api-collection/content/contentitem#tags","Tags",[890,4180],"List\u003Cstring> Tags { get; init; } List of tags assigned to the content. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":895,"title":894,"titles":9202,"content":9203,"level":1110},[],"Description of the networking in Magify Here you will be able to find various networking API: INetworkStatusProvider interface used to provide network reachbility status;NetworkStatus gives network reachability status.",{"id":901,"title":900,"titles":9205,"content":9206,"level":1110},[],"Description of the INetworkStatusProvider API",{"id":9208,"title":4180,"titles":9209,"content":9210,"level":1104},"/unity-sdk/api-collection/network/inetworkstatusprovider#overview",[900],"Magify SDK uses this interface to provide network reachbility status. Default implementation: NetworkStatus.",{"id":9212,"title":9213,"titles":9214,"content":9215,"level":1120},"/unity-sdk/api-collection/network/inetworkstatusprovider#reachability","Reachability",[900,4180],"[NotNull]\nIReactiveProperty\u003CNetworkState> Reachability { get; } Must return current network reachability status.",{"id":9217,"title":9218,"titles":9219,"content":9220,"level":1120},"/unity-sdk/api-collection/network/inetworkstatusprovider#isnetworkreachable","IsNetworkReachable",[900,4180],"bool IsNetworkReachable\n{\n    get => Reachability.Value == NetworkState.Reachable;\n} Sugar to check whether the network is reachable. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":905,"title":904,"titles":9222,"content":9223,"level":1110},[],"Description of the NetworkStatus API",{"id":9225,"title":4180,"titles":9226,"content":9227,"level":1104},"/unity-sdk/api-collection/network/networkstatus#overview",[904],"Checks network reachability.\nImplements: INetworkStatusProvider.",{"id":9229,"title":9213,"titles":9230,"content":9231,"level":1120},"/unity-sdk/api-collection/network/networkstatus#reachability",[904,4180],"[NotNull]\nIReactiveProperty\u003CNetworkState> Reachability { get; } Returns current network reachability status. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":909,"title":908,"titles":9233,"content":9234,"level":1110},[],"Description of the IAppNavigator API",{"id":9236,"title":4180,"titles":9237,"content":9238,"level":1104},"/unity-sdk/api-collection/iappnavigator#overview",[908],"This interface must be implemented by you if you want to use Internal Link campaigns in your application. This interface is used by our SDK to perform navigate to a given link. Since each application is unique we cannot provide any out of the box implementation of this interface. UniTask NavigateTo(string link); The method should initiate a navigate to the given link. And end its execution after the navigation has occurred. After that, the campaign will be considered completed. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":913,"title":912,"titles":9240,"content":9241,"level":1110},[],"Description of the Magify utils Here you will be able to find various utilities API: ConfigScope allows you to control scopes of config that will be loaded with the next requests to the server;MagifyPresenter used by Magify SDK to show different visual elements.",{"id":919,"title":918,"titles":9243,"content":9244,"level":1110},[],"Description of the ConfigScope API",{"id":9246,"title":4180,"titles":9247,"content":9248,"level":1104},"/unity-sdk/api-collection/utils/configscope#overview",[918],"Allows you to control scopes of config that will be loaded with the next requests to the server. Members: None - default, use it if you want to load all the content of config. ConfigScope.Segmentations and ConfigScope.AbTests won't be included in request if this was set. You have to request them manually; Limits - responsible for campaigns and application limits;ProductIds - responsible for storing a list of current products. You should realize, that this scope content is using by Magify SDK internally (for external purchases, subscription status and others), so you should be careful and request this scope at least once;Content - responsible for storing a list of current content url's;Campaigns - responsible for storing main campaigns-related info;AppFeatures - responsible for storing all the value app features;StoredAppFeatures - responsible for storing a stored app features info.Segmentations - responsible for stiring a info about user's segmentation;AbTests - responsible for storing a info about user's A/B-tests;",{"id":923,"title":922,"titles":9250,"content":9251,"level":1110},[],"Description of the MagifyPresenter API",{"id":9253,"title":4180,"titles":9254,"content":9255,"level":1104},"/unity-sdk/api-collection/utils/magifypresenter#overview",[922],"This class used by Magify SDK to show different visual elements, such as popups.\nYou can find list of configuration fields in the MagifySerrings -> Embedded Canvas section.",{"id":9257,"title":9258,"titles":9259,"content":9260,"level":1120},"/unity-sdk/api-collection/utils/magifypresenter#canvas","Canvas",[922,4180],"Canvas Canvas { get; } Provides access to the canvas that is used to display visual elements of the Magify SDK.",{"id":9262,"title":9263,"titles":9264,"content":9265,"level":1120},"/unity-sdk/api-collection/utils/magifypresenter#scaler","Scaler",[922,4180],"CanvasScaler Scaler { get; } Provides access to the canvas scaler that is used to display visual elements of the Magify SDK.",{"id":9267,"title":9268,"titles":9269,"content":9270,"level":1120},"/unity-sdk/api-collection/utils/magifypresenter#raycaster","Raycaster",[922,4180],"GraphicRaycaster Raycaster { get; } Provides access to the graphic raycaster that is used to raycasts for visual elements of the Magify SDK.",{"id":9272,"title":9273,"titles":9274,"content":9275,"level":1120},"/unity-sdk/api-collection/utils/magifypresenter#recalculatesafearea","RecalculateSafeArea",[922,4180],"void RecalculateSafeArea() Force applies safe area for all the children of MagifyPresenter.SafeArea.\nBy default it's called on OnRectTransformDimensionsChange() unity lifecycle event for MagifyPresenter.SafeArea instance. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":927,"title":926,"titles":9277,"content":9278,"level":1110},[],"Description of the MagifyManager API",{"id":9280,"title":9281,"titles":9282,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#main-api","Main API",[926],{"id":9284,"title":7164,"titles":9285,"content":9286,"level":1120},"/unity-sdk/api-collection/magify-manager#clientid",[926,9281],"string ClientId { get; } The primary method of user identification in Magify SDK.\nRandomly generated GUID string.\nUsed for linking analytics, saving progress and many other processes.\nAlso, can be passed to other SDKs for linking.",{"id":9288,"title":9289,"titles":9290,"content":9291,"level":1120},"/unity-sdk/api-collection/magify-manager#commonclientid","CommonClientId",[926,9281],"string CommonClientId { get; } A method for identifying a user who has restored their progress from another device. Most often, it will be identical to ClientId from the very first device on which this user saved their progress. It is obtained after successful social authorization via AuthorizeUser.",{"id":9293,"title":9294,"titles":9295,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#application-state","Application state",[926],{"id":9297,"title":9298,"titles":9299,"content":9300,"level":1120},"/unity-sdk/api-collection/magify-manager#isportrait","IsPortrait",[926,9294],"bool IsPortrait { get; } Indicates whether the application is currently in portrait mode (width \u003C height).",{"id":9302,"title":9303,"titles":9304,"content":9305,"level":1120},"/unity-sdk/api-collection/magify-manager#limits","Limits",[926,9294],"Limits Limits { get; } Provides access to defined application limits.",{"id":9307,"title":9308,"titles":9309,"content":9310,"level":1120},"/unity-sdk/api-collection/magify-manager#onapplicationenterforeground","OnApplicationEnterForeground",[926,9294],"event Action OnApplicationEnterForeground; Triggered when the application enters the foreground (relates on native callbacks). iOS: always works on Unity main thread;Android: works in the Android main thread (if you want to use the Unity API, you need to switch to the Unity main thread. Be careful, this will take some time and can be dangerous for critical code).",{"id":9312,"title":9313,"titles":9314,"content":9315,"level":1120},"/unity-sdk/api-collection/magify-manager#onapplicationenterbackground","OnApplicationEnterBackground",[926,9294],"event Action OnApplicationEnterBackground; Triggered when the application enters the background (relates on native callbacks). iOS: always works on Unity main thread;Android: works in the Android main thread (if you want to use the Unity API, you need to switch to the Unity main thread. Be careful, this will take some time and can be dangerous for critical code).",{"id":9317,"title":9318,"titles":9319,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#sessions","Sessions",[926],{"id":9321,"title":467,"titles":9322,"content":9323,"level":1120},"/unity-sdk/api-collection/magify-manager#",[926,9318],"event Action\u003Cint> OnSessionChanged; Triggered when the session changes due to: Application restart.The app being in the background longer than the configured SessionsInterval.User progress restoration.",{"id":9325,"title":7179,"titles":9326,"content":9327,"level":1120},"/unity-sdk/api-collection/magify-manager#sessionsinterval",[926,9318],"IReactiveProperty\u003CTimeSpan> SessionsInterval { get; } Defines the interval between separate sessions.",{"id":9329,"title":9330,"titles":9331,"content":9332,"level":1120},"/unity-sdk/api-collection/magify-manager#sessionnumber","SessionNumber",[926,9318],"int SessionNumber { get; } Returns the current session number.",{"id":9334,"title":562,"titles":9335,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#purchases",[926],{"id":9337,"title":9338,"titles":9339,"content":9340,"level":1120},"/unity-sdk/api-collection/magify-manager#hasprocessedpurchase","HasProcessedPurchase",[926,562],"bool HasProcessedPurchase(string productId) Determines if the product with specific productId has been tracked.",{"id":9342,"title":9343,"titles":9344,"content":9345,"level":1120},"/unity-sdk/api-collection/magify-manager#oninappstatuschanged","OnInAppStatusChanged",[926,562],"event Action OnInAppStatusChanged; Triggered when the in-app status changes.",{"id":9347,"title":9348,"titles":9349,"content":9350,"level":1120},"/unity-sdk/api-collection/magify-manager#onsubscriptionstatuschanged","OnSubscriptionStatusChanged",[926,562],"event Action OnSubscriptionStatusChanged; Triggered when the subscription status changes.",{"id":9352,"title":9353,"titles":9354,"content":9355,"level":1120},"/unity-sdk/api-collection/magify-manager#onpurchasedproductschanged","OnPurchasedProductsChanged",[926,562],"event Action OnPurchasedProductsChanged; Triggered when the list of purchased products changes.",{"id":9357,"title":7194,"titles":9358,"content":9359,"level":1120},"/unity-sdk/api-collection/magify-manager#externalpurchaseverificationhandler",[926,562],"IReactiveProperty\u003CIPurchaseVerificationHandler> ExternalPurchaseVerificationHandler { get; } Allows to set and get external purchase verification handler instance.",{"id":9361,"title":7199,"titles":9362,"content":9363,"level":1120},"/unity-sdk/api-collection/magify-manager#verificationretryinterval",[926,562],"FloatReactiveProperty VerificationRetryInterval { get; } The time in seconds between purchase verification attempts. Minimum allowed value is 1 second.",{"id":9365,"title":7388,"titles":9366,"content":9367,"level":1120},"/unity-sdk/api-collection/magify-manager#subscriptionstatus",[926,562],"SubscriptionStatus SubscriptionStatus { get; set; } Allows to set and get the subscription status.",{"id":9369,"title":9370,"titles":9371,"content":9372,"level":1120},"/unity-sdk/api-collection/magify-manager#inappstatus","InAppStatus",[926,562],"InAppStatus InAppStatus { get; set; } Allows to set and get the in-app status.",{"id":9374,"title":7501,"titles":9375,"content":9376,"level":1120},"/unity-sdk/api-collection/magify-manager#inappproducts",[926,562],"List\u003CInAppProduct> InAppProducts { get; } Returns a list of available in-app products.",{"id":9378,"title":7506,"titles":9379,"content":9380,"level":1120},"/unity-sdk/api-collection/magify-manager#subscriptionproducts",[926,562],"List\u003CSubscriptionProduct> SubscriptionProducts { get; } Returns a list of available subscription products.",{"id":9382,"title":9383,"titles":9384,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#segmentation-and-filtering","Segmentation and filtering",[926],{"id":9386,"title":7184,"titles":9387,"content":9388,"level":1120},"/unity-sdk/api-collection/magify-manager#environment",[926,9383],"[Obsolete]\nEnvironment Environment { get; set; } You should no longer use this property. It is obsolete and will be removed in approximately the second half of 2026. Consider using MagifyConfig.IsSandbox instead.",{"id":9390,"title":9391,"titles":9392,"content":9393,"level":1120},"/unity-sdk/api-collection/magify-manager#issandbox","IsSandbox",[926,9383],"bool IsSandbox { get; } Allows you to check whether the SDK is in sandbox mode.",{"id":9395,"title":9396,"titles":9397,"content":9398,"level":1120},"/unity-sdk/api-collection/magify-manager#onissandboxchanged","OnIsSandboxChanged",[926,9383],"IObservable\u003Cbool> OnIsSandboxChanged { get; } Allows to handle the sandbox mode changing.",{"id":9400,"title":9401,"titles":9402,"content":9403,"level":1120},"/unity-sdk/api-collection/magify-manager#segmentations","Segmentations",[926,9383],"IReadOnlyReactiveProperty\u003CIReadOnlyList\u003Cstring>> Segmentations { get; } Returns a list of segmentations applicable to the user.",{"id":9405,"title":9406,"titles":9407,"content":9408,"level":1120},"/unity-sdk/api-collection/magify-manager#assignedabtests","AssignedAbTests",[926,9383],"IReadOnlyReactiveProperty\u003CIReadOnlyList\u003CAssignedAbTest>> AssignedAbTests { get; } Returns a list of assigned A/B tests for the user.",{"id":9410,"title":7242,"titles":9411,"content":9412,"level":1120},"/unity-sdk/api-collection/magify-manager#setattstatus",[926,9383],"void SetAttStatus(bool authorized) The method tells to SDK that the user has been agreed or disagreed to app tracking transparency policy (read more).",{"id":9414,"title":9415,"titles":9416,"content":9417,"level":1120},"/unity-sdk/api-collection/magify-manager#trackgdpraccessstate","TrackGdprAccessState",[926,9383],"void TrackGdprAccessState(bool accessState) Sets the user's consent to GDPR.",{"id":9419,"title":7247,"titles":9420,"content":9421,"level":1120},"/unity-sdk/api-collection/magify-manager#setmediasource",[926,9383],"void SetMediaSource(\n    string networkName = null,\n    string campaignName = null,\n    string adGroup = null\n) You can set the media source in real time. If this method hasn’t been called, the SDK will return mediaSource = null. Optionally you can set attribution info if any. At any time when information is received, pass it to Magify SDK. This data provides information about what source the user came from. network - source network namecampaign - acquisition campaign nameadGroup - acquisition ads group name Retrieving the Media Source (for example, from Adjust) remains on the client side.",{"id":9423,"title":7341,"titles":9424,"content":7343,"level":1120},"/unity-sdk/api-collection/magify-manager#setuseremail",[926,9383],{"id":9426,"title":7295,"titles":9427,"content":9428,"level":1120},"/unity-sdk/api-collection/magify-manager#authorizationstatus",[926,9383],"AuthorizationStatus AuthorizationStatus { get; set; } Gets or sets the authorization status, which shows whether a user is authorized in your app under any account. Used in segmentation and filtering.",{"id":9430,"title":9431,"titles":9432,"content":9433,"level":1120},"/unity-sdk/api-collection/magify-manager#onauthorizationstatuschanged","OnAuthorizationStatusChanged",[926,9383],"event Action OnAuthorizationStatusChanged; Triggered when the authorization status changes.",{"id":9435,"title":7305,"titles":9436,"content":9437,"level":1120},"/unity-sdk/api-collection/magify-manager#referrerid",[926,9383],"string ReferrerId { get; set; } Gets or sets the referrer ID.",{"id":9439,"title":9440,"titles":9441,"content":9442,"level":1120},"/unity-sdk/api-collection/magify-manager#onreferrerchanged","OnReferrerChanged",[926,9383],"event Action OnReferrerChanged; Triggered when the referrer changes.",{"id":9444,"title":9445,"titles":9446,"content":9447,"level":1120},"/unity-sdk/api-collection/magify-manager#adjustid","AdjustId",[926,9383],"string AdjustId { get; set; } Gets or sets the Adjust ID.",{"id":9449,"title":9450,"titles":9451,"content":9452,"level":1120},"/unity-sdk/api-collection/magify-manager#firebaseinstanceid","FirebaseInstanceId",[926,9383],"string FirebaseInstanceId { get; set; } Gets or sets the Firebase Instance ID.",{"id":9454,"title":7280,"titles":9455,"content":9456,"level":1120},"/unity-sdk/api-collection/magify-manager#firstinstalledversion",[926,9383],"string FirstInstalledVersion { get; } Gets the first installed version of the app that had Magify SDK integrated.",{"id":9458,"title":9459,"titles":9460,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#visualization","Visualization",[926],{"id":9462,"title":9463,"titles":9464,"content":9465,"level":1120},"/unity-sdk/api-collection/magify-manager#presenter","Presenter",[926,9459],"MagifyPresenter Presenter { get; } Gives access to the current presenter instance.",{"id":9467,"title":9468,"titles":9469,"content":9470,"level":1120},"/unity-sdk/api-collection/magify-manager#root","Root",[926,9459],"Transform Root { get; } Returns the root transform that uses by Magify SDK for visual representation of campaigns.",{"id":9472,"title":9473,"titles":9474,"content":9475,"level":1120},"/unity-sdk/api-collection/magify-manager#hasdefaultcreative","HasDefaultCreative",[926,9459],"bool HasDefaultCreative(ICampaignWithCreative campaign) Will return true if creative has default version in the StreamingAssets, that might be shown.",{"id":9477,"title":9478,"titles":9479,"content":9480,"level":1120},"/unity-sdk/api-collection/magify-manager#isremotecreativedownloaded","IsRemoteCreativeDownloaded",[926,9459],"bool IsRemoteCreativeDownloaded(ICampaignWithCreative campaign) Will return true if remote creative has been downloaded.",{"id":9482,"title":9483,"titles":9484,"content":9485,"level":1120},"/unity-sdk/api-collection/magify-manager#iscreativecached","IsCreativeCached",[926,9459],"[Obsolete(\"Use IsRemoteCreativeDownloaded instead\")]\nbool IsCreativeCached(ICampaignWithCreative campaign)",{"id":9487,"title":9488,"titles":9489,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#sdk-lifecycle","SDK Lifecycle",[926],{"id":9491,"title":9492,"titles":9493,"content":9494,"level":1120},"/unity-sdk/api-collection/magify-manager#initialized","Initialized",[926,9488],"bool Initialized { get; } Indicates whether the SDK has been successfully initialized.",{"id":9496,"title":7145,"titles":9497,"content":9498,"level":1120},"/unity-sdk/api-collection/magify-manager#initialize",[926,9488],"void Initialize(\n    MagifyConfig config,\n    MagifyDebugConfig debugConfig = null\n) Initializes the Magify SDK with the provided configuration.",{"id":9500,"title":9501,"titles":9502,"content":9503,"level":1120},"/unity-sdk/api-collection/magify-manager#shutdown","ShutDown",[926,9488],"void ShutDown() Shuts down the Magify SDK and resets all event handlers.",{"id":9505,"title":9506,"titles":9507,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#config-management","Config Management",[926],{"id":9509,"title":7346,"titles":9510,"content":9511,"level":1120},"/unity-sdk/api-collection/magify-manager#sync",[926,9506],"void Sync() Synchronizes the SDK configuration with the backend.",{"id":9513,"title":9514,"titles":9515,"content":9516,"level":1120},"/unity-sdk/api-collection/magify-manager#awaitinitialconfigparsing","AwaitInitialConfigParsing",[926,9506],"AwaitInitialConfigParsing(CancellationToken cancellationToken) Allows to wait until completion of parsing and handling of the initial configs (default and saved)",{"id":9518,"title":9519,"titles":9520,"content":9521,"level":1120},"/unity-sdk/api-collection/magify-manager#onconfigloaded","OnConfigLoaded",[926,9506],"event Action OnConfigLoaded; Triggered when the current remote config is loaded.",{"id":9523,"title":9524,"titles":9525,"content":9526,"level":1120},"/unity-sdk/api-collection/magify-manager#onconfigparsed","OnConfigParsed",[926,9506],"event Action\u003CConfigKind> OnConfigParsed; A callback notifying that a config of a certain ConfigKind has been loaded (from disk or network) and processed by SDK",{"id":9528,"title":9529,"titles":9530,"content":9531,"level":1120},"/unity-sdk/api-collection/magify-manager#onconfigparsedonmainthread","OnConfigParsedOnMainThread;",[926,9506],"event Action\u003CConfigKind> OnConfigParsedOnMainThread; OnConfigParsed callback variant synchronized with Unity main thread",{"id":9533,"title":7290,"titles":9534,"content":9535,"level":1120},"/unity-sdk/api-collection/magify-manager#remoteconfigscopes",[926,9506],"IReactiveProperty\u003CConfigScope> RemoteConfigScopes { get; } Allows you to control scopes of config that will be loaded with the next requests to the server.",{"id":9537,"title":9538,"titles":9539,"content":9540,"level":1120},"/unity-sdk/api-collection/magify-manager#lastcontextsynctime","LastContextSyncTime",[926,9506],"ContextSyncTime LastContextSyncTime { get; } Represents the last time the config was synchronized.",{"id":9542,"title":9543,"titles":9544,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#user-progress-application-state","User progress / Application State",[926],{"id":9546,"title":9547,"titles":9548,"content":9549,"level":1120},"/unity-sdk/api-collection/magify-manager#syncstateenabled","SyncStateEnabled",[926,9543],"IReactiveProperty\u003Cbool> SyncStateEnabled { get; } Indicates whether application state synchronization is enabled.",{"id":9551,"title":9552,"titles":9553,"content":9554,"level":1120},"/unity-sdk/api-collection/magify-manager#onrestorestatecompleted","OnRestoreStateCompleted",[926,9543],"IObservable\u003CSyncStateResult> OnRestoreStateCompleted { get; } Allows you to handle successful state synchronization.",{"id":9556,"title":9557,"titles":9558,"content":9559,"level":1120},"/unity-sdk/api-collection/magify-manager#authorizeuser","AuthorizeUser",[926,9543],"UniTask\u003Cbool> AuthorizeUser(\n    string provider,\n    string token,\n    CancellationToken cancellationToken\n) Requests authorization with the social authorization data. provider - the name of the social authorization method. You can select it yourself depends on your environment.token - a unique token for each user that will be associated with the current user account.cancellationToken - pass cancellation token if you want to cancel this operation, for example by timeout.",{"id":9561,"title":9562,"titles":9563,"content":9564,"level":1120},"/unity-sdk/api-collection/magify-manager#resetuserauthorization","ResetUserAuthorization",[926,9543],"void ResetUserAuthorization() Resets the authorization data (provider and token) that were set earlier.",{"id":9566,"title":9567,"titles":9568,"content":9569,"level":1120},"/unity-sdk/api-collection/magify-manager#savestate","SaveState",[926,9543],"UniTask\u003CSyncStateResult> SaveState(\n    int? weight,\n    CancellationToken cancellationToken\n) Requests saving the application state.",{"id":9571,"title":9572,"titles":9573,"content":9574,"level":1120},"/unity-sdk/api-collection/magify-manager#restorestate","RestoreState",[926,9543],"UniTask\u003CSyncStateResult> RestoreState(\n    int? weight,\n    CancellationToken cancellationToken\n) Requests restoring the application state.",{"id":9576,"title":552,"titles":9577,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#analytics",[926],{"id":9579,"title":9580,"titles":9581,"content":9582,"level":1120},"/unity-sdk/api-collection/magify-manager#trackapplaunch","TrackAppLaunch",[926,552],"[Obsolete]\nvoid TrackAppLaunch() Tracks when the application is launched. Now SDK tracks application launches internally on initialization.",{"id":9584,"title":9585,"titles":9586,"content":9587,"level":1120},"/unity-sdk/api-collection/magify-manager#trackcustomevent","TrackCustomEvent",[926,552],"void TrackCustomEvent(\n    string eventName,\n    IReadOnlyDictionary\u003Cstring, object> customParams = null\n) Tracks a custom event.",{"id":9589,"title":9590,"titles":9591,"content":9592,"level":1120},"/unity-sdk/api-collection/magify-manager#tracktrustedpurchase","TrackTrustedPurchase",[926,552],"void TrackTrustedPurchase(TrustedPurchaseRecord record) Allows to track additional purchasing information. For example, information about renewing or canceling a subscription, or to send refund information for an in-app purchase.",{"id":9594,"title":9595,"titles":9596,"content":9597,"level":1120},"/unity-sdk/api-collection/magify-manager#trackinappfor","TrackInAppFor",[926,552],"void TrackInAppFor(\n    string productId,\n    string price,\n    string currency,\n    string transactionId = null,\n    string purchaseToken = null,\n    string originalTransactionId = null,\n    string receipt = null\n) Allows you to track in-app product purchases initiated from a Magify campaign. This will track analytics, track used campaign product, initiate validation of purchase, update data for filtering and segmentation (update list of received products, InApp status change to paid).",{"id":9599,"title":9600,"titles":9601,"content":9602,"level":1120},"/unity-sdk/api-collection/magify-manager#trackexternalinappfor","TrackExternalInAppFor",[926,552],"void TrackExternalInAppFor(\n    string productId,\n    string price,\n    string currency,\n    string transactionId = null,\n    string purchaseToken = null,\n    string originalTransactionId = null,\n    string receipt = null\n) Allows you to track in-app product purchases thar weren't initiated from a Magify campaign (if you were to implement your own purchase offer). This will track analytics, initiate validation of purchase, update data for filtering and segmentation (update list of received products, InApp status change to paid).",{"id":9604,"title":9605,"titles":9606,"content":9607,"level":1120},"/unity-sdk/api-collection/magify-manager#tracktrustedinappfor","TrackTrustedInAppFor",[926,552],"void TrackTrustedInAppFor(TrustedPurchaseRecord record) Allows you to track initial pre-verified in-app purchase that the Magify SDK can trust and not request verification on the Magify services side. This will track analytics, initiate validation of purchase, update data for filtering and segmentation (update list of received products, InApp status change to paid).",{"id":9609,"title":9610,"titles":9611,"content":9612,"level":1120},"/unity-sdk/api-collection/magify-manager#trackexternaltrustedinappfor","TrackExternalTrustedInAppFor",[926,552],"void TrackExternalTrustedInAppFor(TrustedPurchaseRecord record) Allows you to track initial external pre-verified in-app purchase that the Magify SDK can trust and not request verification on the Magify services side. This will track analytics, initiate validation of purchase, update data for filtering and segmentation (update list of received products, InApp status change to paid).",{"id":9614,"title":9615,"titles":9616,"content":9617,"level":1120},"/unity-sdk/api-collection/magify-manager#trackrestoredinappfor","TrackRestoredInAppFor",[926,552],"void TrackRestoredInAppFor(string productId) Allows you to track restored in-app product purchases. This will only update data for filtering and segmentation (update list of received products, InApp status change to paid), no analytics or validation (because it must have been shipped with the original purchase track).",{"id":9619,"title":9620,"titles":9621,"content":9622,"level":1120},"/unity-sdk/api-collection/magify-manager#tracksubscriptionactivation","TrackSubscriptionActivation",[926,552],"void TrackSubscriptionActivation(\n    bool isTrial,\n    string productId,\n    string price,\n    string currency,\n    string period,\n    string transactionId = null,\n    string purchaseToken = null,\n    string originalTransactionId = null,\n    string receipt = null\n) Allows you to track subscription product purchases initiated from a Magify campaign. This will track analytics, track used campaign product, initiate validation of purchase, update data for filtering and segmentation (update list of received products). SubscriptionStatus will NOT be changed after calling this method, because we must have access to purchasing service to check this status on ours own.",{"id":9624,"title":9625,"titles":9626,"content":9627,"level":1120},"/unity-sdk/api-collection/magify-manager#trackexternalsubscriptionactivation","TrackExternalSubscriptionActivation",[926,552],"void TrackExternalSubscriptionActivation(\n    bool isTrial,\n    string productId,\n    string price,\n    string currency,\n    string transactionId = null,\n    string purchaseToken = null,\n    string originalTransactionId = null,\n    string receipt = null\n) Allows you to track subscription product purchases thar weren't initiated from a Magify campaign (if you were to implement your own purchase offer). This will track analytics, initiate validation of purchase, update data for filtering and segmentation (update list of received products). SubscriptionStatus will NOT be changed after calling this method, because we must have access to purchasing service to check this status on ours own.",{"id":9629,"title":9630,"titles":9631,"content":9632,"level":1120},"/unity-sdk/api-collection/magify-manager#tracktrustedsubscriptionactivation","TrackTrustedSubscriptionActivation",[926,552],"void TrackTrustedSubscriptionActivation(TrustedPurchaseRecord record) Allows you to track initial pre-verified subscription purchase that the Magify SDK can trust and not request verification on the Magify services side. This will track analytics, initiate validation of purchase, update data for filtering and segmentation (update list of received products). SubscriptionStatus will NOT be changed after calling this method, because we must have access to purchasing service to check this status on ours own.",{"id":9634,"title":9635,"titles":9636,"content":9637,"level":1120},"/unity-sdk/api-collection/magify-manager#trackexternaltrustedsubscriptionactivation","TrackExternalTrustedSubscriptionActivation",[926,552],"void TrackExternalTrustedSubscriptionActivation(TrustedPurchaseRecord record) Allows you to track initial external pre-verified subscription purchase that the Magify SDK can trust and not request verification on the Magify services side. This will track analytics, initiate validation of purchase, update data for filtering and segmentation (update list of received products). SubscriptionStatus will NOT be changed after calling this method, because we must have access to purchasing service to check this status on ours own.",{"id":9639,"title":9640,"titles":9641,"content":9642,"level":1120},"/unity-sdk/api-collection/magify-manager#trackrestoredsubscription","TrackRestoredSubscription",[926,552],"void TrackRestoredSubscription(string productId) Allows you to track restored subscription product purchases. This will only update data for filtering and segmentation (update list of received products), no analytics or validation (because it must have been shipped with the original purchase track) SubscriptionStatus will NOT be changed after calling this method, because we must have access to purchasing service to check this status on ours own.",{"id":9644,"title":9645,"titles":9646,"content":9647,"level":1120},"/unity-sdk/api-collection/magify-manager#trackadsimpression","TrackAdsImpression",[926,552],"void TrackAdsImpression(\n    CampaignType campaignType,\n    IAdsImpression impression\n) Allows you to track analytics on ad impressions. In advanced mode also initiates tracking of relevant ad campaign.",{"id":9649,"title":9650,"titles":9651,"content":9652,"level":1120},"/unity-sdk/api-collection/magify-manager#trackadsclickfor","TrackAdsClickFor",[926,552],"void TrackAdsClickFor(CampaignType campaignType) Allows you to track analytics on ad click and relevant ad campaign click (use it for ads without products, usually banner and interstitial ads). Works only in advanced mode.",{"id":9654,"title":9655,"titles":9656,"content":9657,"level":1120},"/unity-sdk/api-collection/magify-manager#trackadsproductclickfor","TrackAdsProductClickFor",[926,552],"void TrackAdsProductClickFor(\n    CampaignType campaignType,\n    string productId\n) Allows you to track analytics on ad click and relevant ad campaign click with exact product (use it for ads with products, usually rewarded ads). Works only in advanced mode.",{"id":9659,"title":9660,"titles":9661,"content":9662,"level":1120},"/unity-sdk/api-collection/magify-manager#trackimpression","TrackImpression",[926,552],"void TrackImpression(CampaignType campaignType) Allows you to track analytics on campaign impressions. Also affects filtering (impression limits). Works only in advanced mode.",{"id":9664,"title":9665,"titles":9666,"content":9667,"level":1120},"/unity-sdk/api-collection/magify-manager#trackimpressionfailfor","TrackImpressionFailFor",[926,552],"void TrackImpressionFailFor(\n    CampaignType campaignType,\n    string reason\n) Allows you to track analytics on campaign impression fails. Works only in advanced mode.",{"id":9669,"title":9670,"titles":9671,"content":9672,"level":1120},"/unity-sdk/api-collection/magify-manager#trackparentcampaignimpression","TrackParentCampaignImpression",[926,552],"void TrackParentCampaignImpression(CampaignType campaignType) Allows you to track analytics on campaign impressions, but only for parent (root) campaign. In meant than nested campaigns (that the same as products) impressions won't be tracked in analytics. Also affects filtering (impression limits). This might be useful for cases when you use TrackProductsImpression method. For example, you have campaign with screen creative and it has a lot of products. You want to add scroll bar and not all the products are visible since creative popup is opened. Firstly you must track campaign impression without products via this method. Then the user scrolls through the list of products and each product is shown one by one. When popap is closed you should call the TrackProductsImpression with the list of seen products. Works only in advanced mode.",{"id":9674,"title":9675,"titles":9676,"content":9677,"level":1120},"/unity-sdk/api-collection/magify-manager#trackproductsimpression","TrackProductsImpression",[926,552],"void TrackProductsImpression(\n    CampaignType campaignType,\n    List\u003Cstring> productIds\n) Allows you to track analytics on product impressions of the last tracked (via TrackParentCampaignImpression) parent campaign of type campaignType.",{"id":9679,"title":9680,"titles":9681,"content":9682,"level":1120},"/unity-sdk/api-collection/magify-manager#trackclickfor","TrackClickFor",[926,552],"void TrackClickFor(CampaignType campaignType) Allows you to track analytics on campaign click. Also affects filtering (impression limits). You should use this method for clicks by campaign withoud products. This usually only makes sense for a Rate-review campaign, because clicks on other campaigns only make sense if products were obtained.",{"id":9684,"title":9685,"titles":9686,"content":9687,"level":1120},"/unity-sdk/api-collection/magify-manager#trackproductclickfor","TrackProductClickFor",[926,552],"void TrackProductClickFor(\n    CampaignType campaignType,\n    string productId\n) Allows you to track analytics on campaign with products click. Also affects filtering (impression limits). You should use this method for clicks by campaign with products. For example, if you have an in-app offer campaign and user purchased the product.",{"id":9689,"title":7472,"titles":9690,"content":9691,"level":1120},"/unity-sdk/api-collection/magify-manager#trackincometransaction",[926,552],"void TrackIncomeTransaction(\n    string source,\n    List\u003CBonusInfo> bonuses,\n    ProductInfo product = null\n) Allows you to track analytics for resources that a user receives. For example, when accruing coins for passing levels, accruing boosters for watching ads. I.e. for any receipts “wallet” of the user.",{"id":9693,"title":7477,"titles":9694,"content":9695,"level":1120},"/unity-sdk/api-collection/magify-manager#trackexpensetransaction",[926,552],"void TrackExpenseTransaction(List\u003CBonusInfo> bonuses) Allows you to track analythics for resources that the user spends. For example, when spending coins, when using boosters. That is, for any spending from the user's “wallet”.",{"id":9697,"title":9698,"titles":9699,"content":9700,"level":1120},"/unity-sdk/api-collection/magify-manager#trackcorrectiontransaction","TrackCorrectionTransaction",[926,552],"void TrackCorrectionTransaction(List\u003CBonusInfo> bonuses) Allows you to track analytics to correct the resources the user has. For example, if a booster has a “lifetime” and the user has not used it, but the booster has disappeared (i.e. it is not an expense, but nevertheless the number has changed).",{"id":9702,"title":9703,"titles":9704,"content":9705,"level":1120},"/unity-sdk/api-collection/magify-manager#trackrewardgranted","TrackRewardGranted",[926,552],"void TrackRewardGranted(string productId) Allows you to track reward product obtaining initiated from a Magify campaign. This will track used campaign product, update data for filtering and segmentation (update list of received products).",{"id":9707,"title":9708,"titles":9709,"content":9710,"level":1120},"/unity-sdk/api-collection/magify-manager#trackfreebonusgranted","TrackFreeBonusGranted",[926,552],"void TrackFreeBonusGranted(string productId) Allows you to track free bonus product obtaining initiated from a Magify campaign. This will track used campaign product, update data for filtering and segmentation (update list of received products).",{"id":9712,"title":9713,"titles":9714,"content":9715,"level":1120},"/unity-sdk/api-collection/magify-manager#trackordinaryproductused","TrackOrdinaryProductUsed",[926,552],"void TrackOrdinaryProductUsed(string productId) Allows you to track ordinary product (info, external, internal, cross-promo) obtaining initiated from a Magify campaign. This will track used campaign product, update data for filtering and segmentation (update list of received products).",{"id":9717,"title":595,"titles":9718,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#campaigns",[926],{"id":9720,"title":9721,"titles":9722,"content":9723,"level":1120},"/unity-sdk/api-collection/magify-manager#campaignfor","CampaignFor",[926,595],"ICampaign CampaignFor(\n    [NotNull] string eventName,\n    CampaignRequestFlags flags,\n    [CanBeNull] Dictionary\u003Cstring, object> customParams = null\n);\nICampaign CampaignFor(\n    string eventName,\n    IReadOnlyDictionary\u003Cstring, object> customParams = null,\n    bool silent = false\n); Requests campaign model for specific event and parameters. Also tracks this campaign, that allows you to track impressions, clicks and impression fails for this campaign. Use silent mode if you only want to get the campaign model as if this campaign was never requested.",{"id":9725,"title":8444,"titles":9726,"content":9727,"level":1120},"/unity-sdk/api-collection/magify-manager#iscampaignavailable",[926,595],"bool IsCampaignAvailable(\n    string campaignName,\n    string eventName,\n    Dictionary\u003Cstring, object> customParams = null\n) Checks if you can get exact campaign for specific event and parameters. Don't use it if you're going to request a campaign on the next line of code anyway. This method is not performant and essentially performs a silent campaign request.",{"id":9729,"title":9730,"titles":9731,"content":9732,"level":1120},"/unity-sdk/api-collection/magify-manager#lastimpressionfor","LastImpressionFor",[926,595],"CampaignImpression LastImpressionFor(\n    CampaignType campaignType,\n    string campaignName,\n    string eventName\n) Returns information about the last successful tracked campaign impression.",{"id":9734,"title":9735,"titles":9736,"content":9737,"level":1120},"/unity-sdk/api-collection/magify-manager#subscribecampaignupdates","SubscribeCampaignUpdates",[926,595],"void SubscribeCampaignUpdates(\n    string campaignName,\n    Action\u003CICampaign> updateAction\n) Registers a handler to modify the last successfully requested campaign.",{"id":9739,"title":9740,"titles":9741,"content":9742,"level":1120},"/unity-sdk/api-collection/magify-manager#unsubscribecampaignupdates","UnsubscribeCampaignUpdates",[926,595],"void UnsubscribeCampaignUpdates(string campaignName) Allows you to remove the change handler of the last successfully requested campaign.",{"id":9744,"title":912,"titles":9745,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#utils",[926],{"id":9747,"title":9748,"titles":9749,"content":9750,"level":1120},"/unity-sdk/api-collection/magify-manager#isapplicationinstalled","IsApplicationInstalled",[926,912],"bool IsApplicationInstalled(string identifier) Checks whether an application with provided identifier is installed on this device For Android it is Bundle ID of an applicationFor iOS it is URL scheme of an applicationAlso used internally to verify suitability of CrossPromoProduct",{"id":9752,"title":9753,"titles":9754,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager#tweaks","Tweaks",[926],{"id":9756,"title":7252,"titles":9757,"content":9758,"level":1120},"/unity-sdk/api-collection/magify-manager#reset",[926,9753],"void Reset(\n    bool clearNativeStorage = true,\n    bool clearCloudStorage = true\n) Resets all the the SDK state. Also clears specified storage options (both are using to restore ClientId between reinstalls on iOS). Use for testing purposes only.",{"id":9760,"title":9761,"titles":9762,"content":9763,"level":1120},"/unity-sdk/api-collection/magify-manager#clearnativestorage","ClearNativeStorage",[926,9753],"void ClearNativeStorage() Clears the native data storage: iOS: keychain;Android: nothing. Use for testing purposes only.",{"id":9765,"title":9766,"titles":9767,"content":9768,"level":1120},"/unity-sdk/api-collection/magify-manager#resetandforceupdate","ResetAndForceUpdate",[926,9753],"void ResetAndForceUpdate() Resets the current loaded config and initiates loading a new one. Use for testing purposes only.",{"id":9770,"title":9771,"titles":9772,"content":9773,"level":1120},"/unity-sdk/api-collection/magify-manager#tweakenvironment","TweakEnvironment",[926,9753],"void TweakEnvironment(Environment? environment, bool? isSandbox) Tweak environment and isSandbox flag.\nThe SDK would be reset if the environment or isSandbox flag values were really changed. Use for testing purposes only.",{"id":9775,"title":7409,"titles":9776,"content":9777,"level":1120},"/unity-sdk/api-collection/magify-manager#tweakanalyticsconfig",[926,9753],"void TweakAnalyticsConfig(\n    int eventsGroupSize,\n    int syncTimeInterval\n) Changes current configuration of analytics sending: eventsGroupSize - how many events will be collected before sending;syncTimeInterval - the interval between retries to send events. Use for testing purposes only.",{"id":9779,"title":7419,"titles":9780,"content":9781,"level":1120},"/unity-sdk/api-collection/magify-manager#tweakuserlocale",[926,9753],"void TweakUserLocale(string languageTag) Simulates changing the user's locale: iOS: works only in the current application session (resets after a cold restart);Android: works in the current application session. Starting with Android Nougat also sets the locale for the current app at the OS level, which must be saved between sessions. Use for testing purposes only.",{"id":9783,"title":7419,"titles":9784,"content":9785,"level":1120},"/unity-sdk/api-collection/magify-manager#tweakuserlocale-1",[926,9753],"void TweakFirstLaunchDate(DateTime date) Changes application first launch date Use for testing purposes only. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"id":933,"title":932,"titles":9787,"content":9788,"level":1110},[],"Description of the MagifyManager.Features API",{"id":9790,"title":4180,"titles":9791,"content":9792,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-features#overview",[932],"This part of the MagifyManager provides access to remote features.",{"id":9794,"title":9795,"titles":9796,"content":9797,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#onfeaturesparsed","OnFeaturesParsed",[932,4180],"event Action\u003CConfigKind> OnFeaturesParsed; The event is triggered when features list or values are parsed",{"id":9799,"title":8334,"titles":9800,"content":9801,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#onfeaturesupdated",[932,4180],"event Action OnFeaturesUpdated The event is triggered every time a features list or values are updated (after synchronizing the config, changing the filtering).",{"id":9803,"title":8339,"titles":9804,"content":9805,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#iscurrentfeaturesparsed",[932,4180],"bool IsCurrentFeaturesParsed The field returns true if there is an actual config (the one that was downloaded from the backend) and that was successfully parsed.",{"id":9807,"title":8344,"titles":9808,"content":9809,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#storedappfeatures",[932,4180],"IStoredAppFeaturesCollection StoredAppFeatures Returns read-only reactive collection of current stored app features.",{"id":9811,"title":8371,"titles":9812,"content":9813,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#trygetbool",[932,4180],"bool TryGetBool(string featureName, out Feature\u003Cbool> result) The method will return true if it was possible to get a bool value for featureName, the obtained value will be put into result, otherwise the method will return false.",{"id":9815,"title":8376,"titles":9816,"content":9817,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#getbool",[932,4180],"Feature\u003Cbool> GetBool(string featureName) The method will return a bool value for featureName, if the value cannot be received an ArgumentException will be thrown.",{"id":9819,"title":8390,"titles":9820,"content":9821,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#trygetnumber",[932,4180],"bool TryGetNumber(string featureName, out Feature\u003Cdouble> result) The method will return true if it was possible to get a double value for featureName, the obtained value will be put into result, otherwise the method will return false.",{"id":9823,"title":8395,"titles":9824,"content":9825,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#getnumber",[932,4180],"Feature\u003Cdouble> GetNumber(string featureName) The method will return a double value for featureName, if the value cannot be received an ArgumentException will be thrown.",{"id":9827,"title":8409,"titles":9828,"content":9829,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#trygetstring",[932,4180],"bool TryGetString(string featureName, out Feature\u003Cstring> result) The method will return true if it was possible to get a string value for featureName, the obtained value will be put into result, otherwise the method will return false.",{"id":9831,"title":8414,"titles":9832,"content":9833,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#getstring",[932,4180],"Feature\u003Cstring> GetString(string featureName) The method will return a string value for featureName, if the value cannot be received an ArgumentException will be thrown.",{"id":9835,"title":9836,"titles":9837,"content":9838,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-features#setignoredfeatures","SetIgnoredFeatures",[932,4180],"SetIgnoredFeatures(IEnumerable\u003Cstring> features, FeatureSource source) Allows you to ignore features from a specific source (config) html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"id":937,"title":936,"titles":9840,"content":9841,"level":1110},[],"Description of the MagifyManager.Storage API",{"id":9843,"title":4180,"titles":9844,"content":9845,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#overview",[936],"This part of the MagifyManager provides access to operations with storage.",{"id":9847,"title":9848,"titles":9849,"content":9850,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#loadimage","LoadImage",[936,4180],"UniTask\u003CContentHandle\u003CTexture>> LoadImage(\n    string url,\n    double timeout,\n    CancellationToken cancellationToken = default\n) Tries to load the texture by url and save to disk.",{"id":9852,"title":9853,"titles":9854,"content":9855,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#loadimagefromstreamingassets","LoadImageFromStreamingAssets",[936,4180],"ContentHandle\u003CTexture> LoadImageFromStreamingAssets(string url) Tries to load the texture from streaming assets by name from url (parses url to get file name and finds file with the same name in StreamingAssets folder).",{"id":9857,"title":9858,"titles":9859,"content":9860,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#loadbundle","LoadBundle",[936,4180],"UniTask\u003CContentHandle\u003CAssetBundle>> LoadBundle(\n    string url,\n    double timeout,\n    CancellationToken cancellationToken = default\n) Tries to load the asset bundle by url and save to disk.",{"id":9862,"title":8357,"titles":9863,"content":9864,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#loadstoredappfeature",[936,4180],"UniTask\u003CContentHandle\u003CStoredAppFeatureContent>> LoadStoredAppFeature(\n    [NotNull] string url,\n    double timeout,\n    CancellationToken cancellationToken\n) Tries to load the stored app feature content by url and save to disk.",{"id":9866,"title":9867,"titles":9868,"content":9869,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#imageiscached","ImageIsCached",[936,4180],"bool ImageIsCached(string url) Checks if the image was downloaded from this url and saved to disk.",{"id":9871,"title":9872,"titles":9873,"content":9874,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#bundleiscached","BundleIsCached",[936,4180],"bool BundleIsCached(string url) Checks if the asset bundle was downloaded from this url and saved to disk.",{"id":9876,"title":9473,"titles":9877,"content":9878,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#hasdefaultcreative",[936,4180],"bool HasDefaultCreative(string url) Checks for creative in streaming assets by name from url (parses url to get filename and finds file with same name in StreamingAssets folder).",{"id":9880,"title":9881,"titles":9882,"content":9883,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#hasdefaultbundle","HasDefaultBundle",[936,4180],"bool HasDefaultBundle(string url) Checks for bundle in streaming assets by name from url (parses url to get filename and finds file with same name in StreamingAssets folder).",{"id":9885,"title":9886,"titles":9887,"content":9888,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#clear","Clear",[936,4180],"void Clear() Deletes cached to disk images and bundles.",{"id":9890,"title":9891,"titles":9892,"content":9893,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-storage#clearstoredappfeatures","ClearStoredAppFeatures",[936,4180],"void ClearStoredAppFeatures() Deletes all downloaded stored app features content from disk. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":941,"title":940,"titles":9895,"content":9896,"level":1110},[],"Description of the MagifyManager.Content API",{"id":9898,"title":4180,"titles":9899,"content":9900,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-content#overview",[940],"This part of the MagifyManager provides access to operations with content via ContentItem.",{"id":9902,"title":9903,"titles":9904,"content":9905,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-content#getcontentlist","GetContentList",[940,4180],"List\u003CContentItem> GetContentList(\n    string group,\n    string key,\n    List\u003Cstring> tags = null\n) Tries to find content info by given parameters.",{"id":9907,"title":9908,"titles":9909,"content":9910,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-content#getearliestcontent","GetEarliestContent",[940,4180],"ContentItem GetEarliestContent(string group, string key) Tries to find content info by given parameters and tag 'earliest'.",{"id":9912,"title":9913,"titles":9914,"content":9915,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-content#getlatestcontent","GetLatestContent",[940,4180],"ContentItem GetLatestContent(string group, string key) Tries to find content info by given parameters and tag 'latest'. html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":945,"title":944,"titles":9917,"content":9918,"level":1110},[],"Description of the MagifyManager.Lto API",{"id":9920,"title":4180,"titles":9921,"content":9922,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-lto#overview",[944],"This part of the MagifyManager provides access to operations with LTO.",{"id":9924,"title":9925,"titles":9926,"content":9927,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-lto#onadded","OnAdded",[944,4180],"event Action\u003CLtoInfo> OnAdded Notifies that new offer has been added (activated).",{"id":9929,"title":8496,"titles":9930,"content":9931,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-lto#onupdated",[944,4180],"event Action\u003CLtoInfo> OnUpdated Notifies that the status or content of the offer has changed and you need to update this offer.",{"id":9933,"title":9934,"titles":9935,"content":9936,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-lto#onremoved","OnRemoved",[944,4180],"event Action\u003CLtoInfo> OnRemoved Notifies that the offer has ended for some reason: expired or replaced by another offer on this spot or force complete of some offers because of filtering changed.",{"id":9938,"title":8501,"titles":9939,"content":9940,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-lto#onfinished",[944,4180],"event Action\u003CLtoInfo> OnFinished Notifies that the offer has ended for any reason (expired, the conditions of showing this offer have changed, the company has become irrelevant, conflicting offer, was finished manually).",{"id":9942,"title":9943,"titles":9944,"content":9945,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-lto#getactiveltooffers","GetActiveLtoOffers",[944,4180],"IReadOnlyCollection\u003CLtoInfo> GetActiveLtoOffers() Contains a list of active offerers.",{"id":9947,"title":8511,"titles":9948,"content":8513,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-lto#completeactivelto",[944,4180],{"id":949,"title":948,"titles":9950,"content":9951,"level":1110},[],"Description of the MagifyManager.GameState API",{"id":9953,"title":4180,"titles":9954,"content":9955,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-gamestate#overview",[948],"This part of the MagifyManager provides access to operations with game state data.",{"id":9957,"title":7454,"titles":9958,"content":9959,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-gamestate#setgamemode",[948,4180],"void SetGameMode(string mode) Sets game mode for analytics.",{"id":9961,"title":7459,"titles":9962,"content":9963,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-gamestate#setgamelevel",[948,4180],"void SetGameLevel(int level) Sets game level for analytics.",{"id":9965,"title":7464,"titles":9966,"content":9967,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-gamestate#setgamemaxlevel",[948,4180],"void SetGameMaxLevel(int level) Sets game max level for analytics. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":953,"title":952,"titles":9969,"content":9970,"level":1110},[],"Description of the MagifyManager.Logging API",{"id":9972,"title":4180,"titles":9973,"content":9974,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#overview",[952],"This part of the MagifyManager provides access to operations with logging.",{"id":9976,"title":7189,"titles":9977,"content":9978,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#isloggingenabled",[952,4180],"bool IsLoggingEnabled Sets or gets logging state.",{"id":9980,"title":9981,"titles":9982,"content":9983,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#enablescope","EnableScope",[952,4180],"void EnableScope(string scope) Enables logging scope.",{"id":9985,"title":9986,"titles":9987,"content":9988,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#disablescope","DisableScope",[952,4180],"void DisableScope(string scope) Disables logging scope.",{"id":9990,"title":9991,"titles":9992,"content":9993,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#enableallscopes","EnableAllScopes",[952,4180],"void EnableAllScopes() Enables all Magify logging scopes.",{"id":9995,"title":9996,"titles":9997,"content":9998,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#isscopeactive","IsScopeActive",[952,4180],"bool IsScopeActive(string scope) Checks if the scope if enabled.",{"id":10000,"title":10001,"titles":10002,"content":10003,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#getactivescopes","GetActiveScopes",[952,4180],"IEnumerable\u003Cstring> GetActiveScopes() Returns all enabled scopes.",{"id":10005,"title":7252,"titles":10006,"content":10007,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-logging#reset",[952,4180],"void Reset() Resets all enabled scopes. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":957,"title":956,"titles":10009,"content":10010,"level":1110},[],"Description of the MagifyManager.Aghanim API",{"id":10012,"title":4180,"titles":10013,"content":10014,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#overview",[956],"This part of the MagifyManager provides access to operations with Aghanim.",{"id":10016,"title":7160,"titles":10017,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#properties",[956],{"id":10019,"title":7199,"titles":10020,"content":10021,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#verificationretryinterval",[956,7160],"IReactiveProperty\u003Cfloat> VerificationRetryInterval { get; } Allows you to set a value for the AghanimOrderStatus check retry interval.",{"id":10023,"title":10024,"titles":10025,"content":10026,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#onorderstatuschanged","OnOrderStatusChanged",[956,7160],"IObservable\u003C(string OrderId, AghanimOrderStatus Status)> OnOrderStatusChanged { get; } Notifies about change of AghanimOrderStatus.",{"id":10028,"title":7589,"titles":10029,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#methods",[956],{"id":10031,"title":10032,"titles":10033,"content":10034,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#issueorder","IssueOrder",[956,7589],"UniTask\u003CAghanimOrder> IssueOrder([NotNull] string productId, bool isSandbox, CancellationToken cancellationToken) Creates a request to issue a new order to purchase a product of productId. If isSandbox == true, the order will be created on the test environment. If an AghanimOrderStatus.Pending order is present, a new web request will not be initiated, but will simply return the information created in the initial web request to issue an order for this product.",{"id":10036,"title":10037,"titles":10038,"content":10039,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#iterateallorders","IterateAllOrders",[956,7589],"IEnumerable\u003CAghanimOrderInfo> IterateAllOrders() Iterates all previously issued orders and information related to them.",{"id":10041,"title":10042,"titles":10043,"content":10044,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#loadpurchasedproductsasync","LoadPurchasedProductsAsync",[956,7589],"UniTask\u003CIReadOnlyList\u003CAghanimProductCounting>> LoadPurchasedProductsAsync(CancellationToken cancellationToken) Loads information from the backend about which products and how many times have been purchased, and returns a list of AghanimProductCounting.",{"id":10046,"title":10047,"titles":10048,"content":10049,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#trygetproductsoforder","TryGetProductsOfOrder",[956,7589],"bool TryGetProductsOfOrder([NotNull] string orderId, [CanBeNull] out string productId) Returns the product for which this order was issued, if indeed there was one.",{"id":10051,"title":10052,"titles":10053,"content":10054,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#trygetorderwithstatus","TryGetOrderWithStatus",[956,7589],"bool TryGetOrderWithStatus([NotNull] string orderId, out AghanimOrderStatus status) Returns: true with filled out status parameter if there is a status for provided orderId.false with defatul value for out status parameter if there is no status data for provided orderId.",{"id":10056,"title":10057,"titles":10058,"content":10059,"level":1120},"/unity-sdk/api-collection/magify-manager/magifymanager-aghanim#waitforfinalorderstatusasync","WaitForFinalOrderStatusAsync",[956,7589],"UniTask\u003CAghanimOrderStatus> WaitForFinalOrderStatusAsync([NotNull] string orderId, CancellationToken cancellationToken) Waits for the order status to change so that AghanimOrderStatus.IsFinal() returns true. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"id":961,"title":960,"titles":10061,"content":10062,"level":1110},[],"Configuration parameters for MagifyManager initialization.",{"id":10064,"title":4180,"titles":10065,"content":10066,"level":1104},"/unity-sdk/api-collection/magify-manager/magifyconfig#overview",[960],"Allows you to configure the parameters with which Magify Manager will be initialized.",{"id":10068,"title":1295,"titles":10069,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager/magifyconfig#general-settings",[960],{"id":10071,"title":10072,"titles":10073,"content":10074,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#appnameios","AppNameIOS",[960,1295],"string AppNameIOS { get; init; } Short name of the Magify application for iOS.",{"id":10076,"title":10077,"titles":10078,"content":10079,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#configpathios","ConfigPathIOS",[960,1295],"string ConfigPathIOS { get; init; } Path in StreamingAssets to the default application config JSON for the current version for iOS.",{"id":10081,"title":10082,"titles":10083,"content":10084,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#appnamegp","AppNameGP",[960,1295],"string AppNameGP { get; init; } Short name of the Magify application for Android.",{"id":10086,"title":10087,"titles":10088,"content":10089,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#configpathgp","ConfigPathGP",[960,1295],"string ConfigPathGP { get; init; } Path in StreamingAssets to the default application config JSON for the current version for Android.",{"id":10091,"title":10092,"titles":10093,"content":10094,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#clientstateconfig","ClientStateConfig",[960,1295],"ClientStateConfig ClientStateConfig { get; init; } Configuration used to save and restore client state.",{"id":10096,"title":7169,"titles":10097,"content":10098,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#customclientid",[960,1295],"[Obsolete]\nstring CustomClientId { get; init; }",{"id":10100,"title":10101,"titles":10102,"content":10103,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#skipclientidfromcloudloading","SkipClientIdFromCloudLoading",[960,1295],"SkipClientIdFromCloudLoading { get; init; } = false; Allows to pass loading of ClientId from native cloud storage",{"id":10105,"title":10106,"titles":10107,"content":10108,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#clientidfromcloudloadingtimeout","ClientIdFromCloudLoadingTimeout",[960,1295],"ClientIdFromCloudLoadingTimeout { get; init; } = 30; Allows to set timeout for loading of ClientId from native cloud storage (in seconds)",{"id":10110,"title":10111,"titles":10112,"content":10113,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#isautorestorestateenabled","IsAutoRestoreStateEnabled",[960,1295],"IsAutoRestoreStateEnabled { get; init; } = true; Enables or disables automatic state restoring",{"id":10115,"title":10116,"titles":10117,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager/magifyconfig#sdk-behavior","SDK Behavior",[960],{"id":10119,"title":10120,"titles":10121,"content":10122,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#useadvancedversion","UseAdvancedVersion",[960,10116],"bool UseAdvancedVersion { get; init; } Indicates whether the full SDK functionality is enabled.",{"id":10124,"title":10125,"titles":10126,"content":10127,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#presentersettings","PresenterSettings",[960,10116],"IPresenterSettings PresenterSettings { get; init; } Settings for the Magify presenter canvas.",{"id":10129,"title":7184,"titles":10130,"content":10131,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#environment",[960,10116],"[Obsolete]\nEnvironment Environment { get; init; } You should no longer use this property. It is obsolete and will be removed in approximately the second half of 2026. Consider using MagifyConfig.IsSandbox instead.",{"id":10133,"title":9391,"titles":10134,"content":10135,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#issandbox",[960,10116],"bool IsSandbox { get; init; } Allows testing in an isolated environment without interfering with production data. Ensure the property is set to false before publishing application.",{"id":10137,"title":7290,"titles":10138,"content":10139,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#remoteconfigscopes",[960,10116],"ConfigScope RemoteConfigScopes { get; init; } Defines remote configuration scopes. Can be changed later using MagifyManager.RemoteConfigScopes.",{"id":10141,"title":9547,"titles":10142,"content":10143,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#syncstateenabled",[960,10116],"bool? SyncStateEnabled { get; init; } Enables or disables user progress/application state sync. If null, the default or previously saved value is used.",{"id":10145,"title":7388,"titles":10146,"content":10147,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#subscriptionstatus",[960,10116],"SubscriptionStatus SubscriptionStatus { get; init; } Default subscription status. Can be changed later using MagifyManager.SubscriptionStatus.",{"id":10149,"title":7295,"titles":10150,"content":10151,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#authorizationstatus",[960,10116],"AuthorizationStatus AuthorizationStatus { get; set; } Default authorization status. Can be changed later using MagifyManager.AuthorizationStatus.",{"id":10153,"title":10154,"titles":10155,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager/magifyconfig#privacy-compliance","Privacy & Compliance",[960],{"id":10157,"title":10158,"titles":10159,"content":10160,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#isgdprapplied","IsGdprApplied",[960,10154],"bool? IsGdprApplied { get; set; } State of user consent to GDPR. If null, the default or previously saved value is used. Can be changed later using MagifyManager.TrackGdprAccessState.",{"id":10162,"title":10163,"titles":10164,"content":10165,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#isattauthorized","IsAttAuthorized",[960,10154],"bool? IsAttAuthorized { get; set; } State of user consent to ATT. If null, the default or previously saved value is used. Can be changed later using MagifyManager.SetAttStatus.",{"id":10167,"title":10168,"titles":10169,"content":10170,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#revenuepercountrypath","RevenuePerCountryPath",[960,10154],"[Obsolete]\nstring RevenuePerCountryPath { get; init; }",{"id":10172,"title":10173,"titles":10174,"content":10175,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#revenuelevelspath","RevenueLevelsPath",[960,10154],"[Obsolete]\nstring RevenueLevelsPath { get; init; }",{"id":10177,"title":10178,"titles":10179,"content":10180,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#defaultcurrencyratespath","DefaultCurrencyRatesPath",[960,10154],"[Obsolete]\nstring DefaultCurrencyRatesPath { get; init; }",{"id":10182,"title":10183,"titles":10184,"content":10185,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#subscriptionmultiplierspath","SubscriptionMultipliersPath",[960,10154],"[Obsolete]\nstring SubscriptionMultipliersPath { get; init; }",{"id":10187,"title":10188,"titles":10189,"content":467,"level":1104},"/unity-sdk/api-collection/magify-manager/magifyconfig#debugging","Debugging",[960],{"id":10191,"title":7189,"titles":10192,"content":10193,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#isloggingenabled",[960,10188],"bool IsLoggingEnabled { get; init; } Default logging status. Can be changed later using MagifyManager.IsLoggingEnabled.",{"id":10195,"title":10196,"titles":10197,"content":10198,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#editormoq","EditorMoq",[960,10188],"MagifyEditorMoq EditorMoq { get; init; } Used for emulating campaigns in the editor.",{"id":10200,"title":10201,"titles":10202,"content":10203,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#isdevelopermode","IsDeveloperMode",[960,10188],"bool IsDeveloperMode { get; init; } Indicates whether developer mode is enabled.",{"id":10205,"title":10206,"titles":10207,"content":10208,"level":1120},"/unity-sdk/api-collection/magify-manager/magifyconfig#editordevice","EditorDevice",[960,10188],"EditorDevice EditorDevice { get; init; } Used for emulating a device in the editor. html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"id":965,"title":964,"titles":10210,"content":467,"level":1110},[],{"id":10212,"title":4180,"titles":10213,"content":10214,"level":1104},"/aghanim-integration#overview",[964],"Aghanim is a Direct-to-Consumer (D2C) platform for mobile games that enables in-game purchases and refunds outside of the App Store and Google Play via a web checkout. The Aghanim integration in Magify allows you to: sell in-game products directly to players;use a single unified product catalog;track purchases and refunds in Magify analytics;treat D2C purchases on par with native store purchases. The same product can be sold: through Native Stores (App Store / Google Play);through Aghanim (web checkout).",{"id":10216,"title":10217,"titles":10218,"content":10219,"level":1104},"/aghanim-integration#conceptual-overview-how-aghanim-works","Conceptual Overview: How Aghanim Works",[964],"Aghanim is not a store and not a billing SDK. It is an external D2C web checkout with several fundamental differences from native stores: purchases happen outside the app, in a browser;purchase confirmation is asynchronous;purchases are not tied to the app session;financial values at purchase time are estimated, not final. These characteristics directly affect: user experience,SDK flow,analytics,pending states,restore behavior. All edge cases described below are expected behavior, not integration errors.",{"id":10221,"title":10222,"titles":10223,"content":467,"level":1104},"/aghanim-integration#platform-support-and-payment-methods","Platform Support and Payment Methods",[964],{"id":10225,"title":10226,"titles":10227,"content":10228,"level":1120},"/aghanim-integration#app-store-ios","App Store (iOS)",[964,10222],"Aghanim is used as an external payment provider.The purchase flow redirects the user to a browser.Availability depends on regional restrictions and Apple policies.",{"id":10230,"title":10231,"titles":10232,"content":10233,"level":1120},"/aghanim-integration#google-play-android","Google Play (Android)",[964,10222],"Aghanim does not replace Google Play Billing.Purchases do not go through Google Play In-App Billing. The Aghanim web checkout may support different payment methods depending on region and configuration, such as credit cards, Apple Pay, Google Pay, PayPal, and others.",{"id":10235,"title":10236,"titles":10237,"content":467,"level":1104},"/aghanim-integration#roles-and-responsibilities","Roles and Responsibilities",[964],{"id":10239,"title":7890,"titles":10240,"content":10241,"level":1120},"/aghanim-integration#aghanim",[964,10236],"payment processing;web checkout flow;calculation of expected (estimated) revenue;final revenue reconciliation;webhook delivery.",{"id":10243,"title":10244,"titles":10245,"content":10246,"level":1120},"/aghanim-integration#magify","Magify",[964,10236],"unified product catalog;product export to Aghanim;webhook processing;analytics;store context (store_name);reporting.",{"id":10248,"title":10249,"titles":10250,"content":10251,"level":1120},"/aghanim-integration#app-sdk","App / SDK",[964,10236],"purchase UX logic;purchase timeout handling;pending state handling;restore logic;delayed / external purchase handling.",{"id":10253,"title":10254,"titles":10255,"content":10256,"level":1104},"/aghanim-integration#purchase-lifecycle","Purchase Lifecycle",[964],"The user initiates a purchase in the app.The app opens the Aghanim web checkout in a browser.The app goes to the background and may lose focus.The user either completes the purchase or exits the checkout.Aghanim sends:\nitem-add for a successful purchase,item-remove for a refund.The app returns to the foreground or restarts.The SDK checks the purchase status.The purchase is confirmed or remains in pending. A purchase may be confirmed after an app restart — this is a valid and expected scenario.",{"id":10258,"title":10259,"titles":10260,"content":467,"level":1104},"/aghanim-integration#products-and-pricing","Products and Pricing",[964],{"id":10262,"title":10263,"titles":10264,"content":10265,"level":1120},"/aghanim-integration#general-rules","General Rules",[964,10259],"Products are created only in Magify.Every product must exist in Aghanim.Product catalog integration is one-way: Magify → Aghanim.There is no reverse import from Aghanim to Magify.",{"id":10267,"title":10268,"titles":10269,"content":10270,"level":1120},"/aghanim-integration#pricing","Pricing",[964,10259],"The same product can be sold in the store and via Aghanim only at the same price.Aghanim-exclusive products may have different pricing.In Aghanim, prices are shown as marketing prices (usually $0.01 lower).",{"id":10272,"title":10273,"titles":10274,"content":10275,"level":1120},"/aghanim-integration#rounding","Rounding",[964,10259],"Prices are rounded to two decimal places.If more precision is provided, mathematical rounding is applied.",{"id":10277,"title":10278,"titles":10279,"content":467,"level":1104},"/aghanim-integration#aghanim-side-integration-setup","Aghanim-Side Integration Setup",[964],{"id":10281,"title":10282,"titles":10283,"content":10284,"level":1120},"/aghanim-integration#project-application","Project (Application)",[964,10278],"Each Magify application requires a dedicated project in Aghanim. An Aghanim project contains: products;payment configuration;webhooks;API access keys.",{"id":10286,"title":10287,"titles":10288,"content":10289,"level":1120},"/aghanim-integration#api-keys","API Keys",[964,10278],"The following keys are required: API Key (production);Sandbox API Key.",{"id":10291,"title":10292,"titles":10293,"content":10294,"level":1120},"/aghanim-integration#webhooks","Webhooks",[964,10278],"The following events must be enabled: verify-player;item-add;item-remove. Webhook secrets are used to validate incoming requests.",{"id":10296,"title":10297,"titles":10298,"content":10299,"level":1120},"/aghanim-integration#sandbox-environment","Sandbox Environment",[964,10278],"Sandbox is fully isolated: separate keys;separate products;separate transactions.",{"id":10301,"title":10302,"titles":10303,"content":10304,"level":1104},"/aghanim-integration#magify-integration-setup","Magify Integration Setup",[964],"Integration path in the Magify UI: Configuration → Integrations → Aghanim Integration → Create New Required fields: Application;API Key;Sandbox API Key;Webhook Secret;Sandbox Webhook Secret.",{"id":10306,"title":10307,"titles":10308,"content":10309,"level":1104},"/aghanim-integration#product-import","Product Import",[964],"Automatic import runs every 11 hours.Manual bulk import for production and sandbox.Single product import fromRemote Config → Native Elements.",{"id":10311,"title":10312,"titles":10313,"content":10314,"level":1104},"/aghanim-integration#aghanim-webhooks","Aghanim Webhooks",[964],"verify-player — pre-purchase validation;item-add — successful purchase;item-remove — refund. Webhook events are the primary source of truth for purchase status.",{"id":10316,"title":10317,"titles":10318,"content":10319,"level":1104},"/aghanim-integration#pending-status-and-interrupted-purchases","Pending Status and Interrupted Purchases",[964],"If a user opens the Aghanim checkout, does not complete payment, and returns to the app, the purchase remains in pending. The app must apply a timeout when waiting for purchase completion.If the purchase is completed later, it should be processed as a delayed / external purchase.",{"id":10321,"title":10322,"titles":10323,"content":10324,"level":1104},"/aghanim-integration#sessions-and-counters","Sessions and Counters",[964],"Aghanim purchases occur outside the app session. If the user stays in the browser for an extended period: the app session may expire;session-based counters (Transaction / inApps) may reset to 0. This does not affect purchase validity.",{"id":10326,"title":10327,"titles":10328,"content":10329,"level":1104},"/aghanim-integration#restore-and-re-purchases","Restore and Re-Purchases",[964],"Previously purchased products are filtered at the campaign level.Without restore, Magify does not detect Native Store purchases on iOS.Aghanim supports its own restore mechanism.Automatic restore on app launch is supported.",{"id":10331,"title":10332,"titles":10333,"content":10334,"level":1104},"/aghanim-integration#store-context-store_name","Store Context (store_name)",[964],"Supported values: nativeaghanimmixed store_name: is calculated from nested campaigns;can be inherited from a parent campaign;is used for analytics in Magify.",{"id":10336,"title":10337,"titles":10338,"content":467,"level":1104},"/aghanim-integration#analytics-revenue-and-reporting","Analytics, Revenue, and Reporting",[964],{"id":10340,"title":10341,"titles":10342,"content":10343,"level":1120},"/aghanim-integration#estimated-revenue","Estimated Revenue",[964,10337],"Aghanim sends expected revenue, calculated using estimated FX rates and payment fees. Final revenue: is reconciled by Aghanim;typically finalized by the 10th of the following month;is not re-sent to Magify.",{"id":10345,"title":10346,"titles":10347,"content":10348,"level":1120},"/aghanim-integration#negative-revenue","Negative Revenue",[964,10337],"The value in item-remove may exceed item-add.If a single purchase is fully refunded, total revenue may become negative.",{"id":10350,"title":10351,"titles":10352,"content":10353,"level":1120},"/aghanim-integration#analytics-limitations","Analytics Limitations",[964,10337],"Aghanim provides only in-app purchase metrics.Store-level breakdown is not included in Aghanim data.Store breakdown is handled in Magify and reflected in daily reports.",{"id":10355,"title":10356,"titles":10357,"content":10358,"level":1120},"/aghanim-integration#country-field","Country Field",[964,10337],"In Magify, country reflects the device locale.In Aghanim, country reflects the payment method / bank country. Values may differ.",{"id":10360,"title":10361,"titles":10362,"content":10363,"level":1104},"/aghanim-integration#unity-sdk-reference","Unity SDK Reference",[964],"MagifyManager — Aghanim APIhttps://help.magify.com/unity-sdk/api-collection/magify-manager/magifymanager-aghanim AghanimStore — Purchaseshttps://help.magify.com/unity-sdk/api-collection/purchases/aghanimstore",{"id":977,"title":976,"titles":10365,"content":10366,"level":1110},[],"This document describes App Config parameters, their usage rules, and the logic for generating and validating application configurations.",{"id":10368,"title":4180,"titles":10369,"content":10370,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#overview",[976],"This article provides a detailed reference for App Config, focusing on its parameter structure, configuration logic, and practical usage scenarios. It explains how App Config is used to generate both the default configuration embedded into the app build and the current configuration resolved under additional user conditions, such as segmentation rules or A/B test participation. The following sections describe the role of the default configuration, how App Config parameters are structured, and how different parameter groups are combined to resolve a single configuration state.",{"id":10372,"title":10373,"titles":10374,"content":10375,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#default-configuration","Default Configuration",[976,4180],"The default configuration is the baseline configuration the application launches and operates with, regardless of segmentation, A/B tests, or additional conditions. It is embedded into the app build and represents the initial set of parameters available to the app before any Remote Config rules are applied. The default configuration guarantees that the application always starts in a valid and predictable state — even if network rules are not yet applied or the user does not match any segmentation criteria. All Remote Config rules, segmentation logic, and A/B tests are applied on top of this configuration, modifying individual parameters rather than replacing it entirely. Because of this, the default configuration serves as the reference point and foundation for all configuration logic in the application.",{"id":10377,"title":10378,"titles":10379,"content":10380,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#app-config-parameter-structure","App Config Parameter Structure",[976,4180],"App Config parameters are divided into two logical groups, each serving a distinct purpose. Main fields define the baseline configuration context. They are used both to generate the default configuration and to validate the current configuration, and are typically configured once. After that, the main block does not need to be modified when downloading default configurations for different app versions, unless the baseline configuration itself changes. Additional parameters complement the main fields and are used only to validate the current configuration under extra conditions — such as segmentation rules, user states, or A/B tests. They do not affect the default configuration and are not included in the production build. All selected parameters are applied together to resolve a single configuration state. The resulting JSON configuration can be downloaded from Remote Config > App Version. As a result, App Config can be used both to verify the default configuration and to validate the current configuration under additional conditions.",{"id":10382,"title":10383,"titles":10384,"content":10385,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#what-is-a-json-config","What is a JSON Config",[976,4180],"A JSON configuration is a set of server-defined parameters such as feature flags, LiveOps settings, and A/B test conditions. Downloading the JSON configuration allows you to see the exact configuration state the app would receive under the selected conditions.",{"id":10387,"title":10388,"titles":10389,"content":10390,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#important","Important",[976,4180],"Changes made in App Config do not affect real users. The main block defines parameters used for generating the default configuration.Additional fields are used only for testing and validation. They are not included in the production build. App Config allows testers, product managers, and marketers to reproduce app behavior without code changes or developer involvement. ExampleYou can simulate a user from Canada on Day 3 after installation and download the JSON config to see which values the app would receive.",{"id":10392,"title":10393,"titles":10394,"content":10395,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#general-information","General Information",[976],"Each application has a single App Config card. It is reused and updated as needed; separate cards per app version are not required.",{"id":10397,"title":10398,"titles":10399,"content":10400,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#how-to-create-an-app-config","How to Create an App Config",[976],"Open App Config.Click Create New.Fill in the required fields.Save the configuration.",{"id":10402,"title":10403,"titles":10404,"content":10405,"level":1110},"/app-config/app-config-parameters-logic-and-use-cases#settings-overview","Settings Overview",[],"Although many fields mirror parameters in Remote Config > Segmentation, here they are used solely for testing configuration states, not for segmentation logic.",{"id":10407,"title":1328,"titles":10408,"content":10409,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#application",[10403],"The application for which the configuration is created. Selected once.Becomes locked after saving.",{"id":10411,"title":10412,"titles":10413,"content":10414,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#device","Device",[10403],"Defines the device profile used to generate the configuration.",{"id":10416,"title":10417,"titles":10418,"content":10419,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#android","Android",[10403,10412],"phone-xxhdpi — mid-rangephone-xxxhdpi — flagshiptablet-xhdpi — tablets",{"id":10421,"title":10422,"titles":10423,"content":10424,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#ios","iOS",[10403,10412],"iPhone12,3 (iPhone 11 Pro)iPhone14,5 (iPhone 13)iPhone15,2 (iPhone 14 Pro)iPad8,9 (iPad Pro 11\") RecommendationsUse phone for most apps.Choose tablet for tablet-optimized interfaces.For Android: phone-xxxhdpi is most common.For iOS: choose a widely used model (iPhone 13/14).\n::OrientationSpecifies the screen orientation in which the app operates on the selected device. This parameter is useful when UI layout or feature behavior differs between portrait and landscape modes.Available values:portrait — the app operates only in vertical orientationlandscape — the app operates only in horizontal orientationboth — the app supports both orientations; the configuration is not tied to a specific modeExamples:vertical-only apps > portraitgames with horizontal gameplay > landscapeapps supporting both orientations > both\n::OS VersionSpecifies the operating system version used to generate the configuration. This parameter helps reproduce cases where app behavior, SDK logic, or system APIs differ across OS releases.Examples:iOS: 16.6, 17.2Android: 12, 13, 14\n::Used for:validating compatibility with older and newer OS versionstesting features that rely on OS-specific APIs or permissionsverifying ATT flows, system dialogs, and permission promptsreproducing layout or behavior differences caused by OS upgradesInitial App VersionSpecifies the first app version installed by the user. This parameter is important because many flows and features depend on the user’s initial installation version.Used for testing:different onboarding flows introduced across versionsnew or deprecated features that depend on version rangesversion-based A/B testsLiveOps logic tied to installation historyupgrade and migration scenarios (e.g., moving from older builds)Example: A user who first installed version 3.1.0 may receive different onboarding or feature sets than a user who started on 4.0.0.Is New UserIndicates whether the user is new.Default behavior: false (existing user).true > configuration for the first app launch.Used for testing onboarding, welcome offers, new-user A/B tests, early-stage feature availability.If you do not need to simulate first-launch behavior, leave this value set to false.LanguageExamples: English, French, German, Spanish, Japanese.Recommended default: enWhy:English is the base language used in most projects.Other languages may have incomplete overrides.Ensures the most stable and predictable configuration.\n::CountryExamples: United States, Canada, Germany, Brazil, Japan.Used for validating regional rules, A/B tests, LiveOps, and localized parameters.Recommended default: United StatesWhy:Common baseline region.Most complete and stable configuration.Standard environment for testing and launch scenarios.\n::Launch DateSpecifies the date and time at which the configuration should be generated. This parameter allows you to reproduce the configuration state at a specific moment — for example, when a LiveOps campaign starts or an A/B test becomes active.Important:The timestamp must always be provided in UTC to ensure accurate evaluation of any time-based rules.App Config always reflects the configuration state at the specified moment. Future configuration states cannot be emulated.\n::Used for:validating LiveOps campaigns scheduled to start at a specific time;testing A/B tests activated at defined timestamps;confirming the correct behavior of time-based configuration logic.Recommended default: current time (UTC)Why:reflects the real moment when the app typically requests configuration;provides a stable and accurate baseline;avoids distortions caused by outdated or future timestamps.\n::Additional ParametersThe basic App Config fields are used both for generating the default configuration and for validating the current configuration under different conditions. Additional parameters do not override basic fields — they complement them and further narrow the configuration conditions.Days After LaunchSpecifies how many days have passed since the app was installed. The count starts from the first launch, regardless of whether the user opened the app again on the same day or not.0 — the installation day (first launch day)1 — the next calendar day2 — the second day after installation, and so onExample: If Days After Launch = 2, the configuration will correspond to the third calendar day after installation (0 > 1 > 2).Special case: If a user launches the app for the first time at 23:55, their “day 0” lasts only 5 minutes — but still counts as a full D0.Important:This field must always have a value.If you do not need this parameter, leave it set to 0.\n::Days of WeekSpecifies the day of the week for which the configuration should be generated. This parameter is used when testing logic that depends on calendar days, such as weekly events, rotations, or scheduled LiveOps behavior.You can select only one day of the week.If the field is set to “–”, the configuration is generated for the current server day of the week.Examples:Monday > the configuration reflects conditions for MondaySunday > the configuration reflects conditions for Sunday\n::Important:Leave the field set to “–” if you do not need to target a specific day.Select a specific day only when you need to test scheduled or day-dependent logic.\n::IDFASpecifies the user’s IDFA (Identifier for Advertising) consent status. This parameter allows you to validate configuration behavior for different privacy and attribution scenarios.Available values:Yes — the user has granted permission to collect IDFANo — the user has denied permissionUnknown — the user’s status is unknown (for example, the prompt was not shown or the response is unavailable)Only one value can be selected.Use cases:testing feature behavior that depends on tracking authorizationvalidating attribution or ad-related logic under different consent scenariossimulating users with missing or undefined IDFA statusImportant: If you do not need to target a specific consent group, leave the value set to Unknown.",{"id":10426,"title":10427,"titles":10428,"content":10429,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#generated-in-app-purchases","Generated In-App Purchases",[10403],"This section allows you to specify parameters related to the user's previously completed in-app purchases. These parameters help simulate and validate configuration behavior for different payer segments: non-payers, low-payers, and high-payers. The section contains two fields:",{"id":10431,"title":10432,"titles":10433,"content":10434,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#generated-in-app-purchases-revenue","Generated In-App Purchases Revenue",[10403,10427],"Indicates the total revenue generated by the user through in-app purchases over their entire lifetime in the app. The value is specified in US dollars (USD). Examples:0 — the user has not made any purchases> 0 — the cumulative lifetime revenue in USD\n::Only one value can be set.Used for:testing configuration behavior across different payer segmentsvalidating logic applied to payer vs. non-payer groupschecking A/B tests that depend on revenue-based segmentationBought In-App PurchasesIndicates the total number of in-app purchase transactions completed by the user.Examples:0 — no purchases1, 2, 5… — the number of completed transactions\n::Only one value can be set.Used for:testing logic tied to purchase count (e.g., first purchase, repeat purchases)validating segmentation rules based on user purchasing activitysimulating different purchase behavior scenariosImportantThese fields can be used independently or together.If you do not need to target a specific purchase profile, leave both values set to 0.\n::Rewarded Video ImpressionsSpecifies the number of rewarded video (RV) ads the user has watched by a specific analytical milestone X (DX). These values are cumulative, meaning they represent the total number of RV impressions watched from D0 through DX (inclusive), regardless of when exactly the impressions occurred.The user accumulated the specified number of RV impressions by the D7 analytical checkpoint (i.e., during the period from D0 to D7 inclusive). This could have happened at any time — even months after installation.Important Notes1. Impressions dX does NOT indicate that the user actually spent X days in the appFor example, Impressions d7 means:If you need to restrict the configuration to users who are actually no more than X days old, you must also use: Days After Launch.2. Days After Launch is required when the real age of the user in the app mattersRV metrics alone do not indicate how long the user has been active — they only show cumulative behavior.Therefore:D7 in RV ≠ the user has spent 7 days in the appTo filter users who have truly reached a specific day in their lifecycle, set: Days After Launch = X\n::How cumulative RV logic worksAnalytical checkpoints might include: D0, D4, D7, D14, etc.At each checkpoint, the system records the total number of RV impressions accumulated up to that moment. Later checkpoints inherit earlier totals and increase only when new impressions occur.Example timeline:D0User watches 2 RVs → D0 = 2 → D4 = 2 → D7 = 2 → D14 = 2D3User watches 1 more RV → D0 = 2 → D4 = 3 → D7 = 3 → D14 = 3D9User watches 2 more RVs → D7 = 3 → D14 = 5Summary:An RV watched on a later day does not modify earlier checkpoints (e.g., D7), but does increase all later checkpoints (e.g., D14).",{"id":10436,"title":10437,"titles":10438,"content":10439,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#available-fields","Available Fields",[10403,10427],"You may select one, several, or all of the following: Impressions d0 — RV impressions accumulated by day 0Impressions d1 — by day 1Impressions d4 — by day 4Impressions d7 — by day 7Impressions d14 — by day 14Impressions d30 — by day 30 Each field accepts one numeric value. If you do not need to use these parameters leave all selected fields set to 0.",{"id":10441,"title":10442,"titles":10443,"content":10444,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#ua-user-acquisition","UA (User Acquisition)",[10403],"Specifies user acquisition attributes used to validate configuration behavior for different traffic sources, campaigns, and ad groups. This section allows you to reproduce scenarios for users coming from specific marketing channels. The following parameters are available:",{"id":10446,"title":10447,"titles":10448,"content":10449,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#media-source","Media Source",[10403,10442],"The traffic source from which the user was acquired. This is a dropdown containing all media sources detected in the system. Only one value can be selected. Use cases: testing configuration behavior for users acquired from a specific traffic sourcevalidating segmentation rules for paid vs. organic trafficreproducing behavior associated with particular ad networks",{"id":10451,"title":10452,"titles":10453,"content":10454,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#acquisition-campaign-name","Acquisition Campaign Name",[10403,10442],"The attribution campaign name associated with the user. This value must be entered manually. Only one value can be selected. Use cases: validating logic tied to specific UA campaignstesting A/B tests applied to users from individual campaign funnelsQA verification of campaign-level segmentation",{"id":10456,"title":10457,"titles":10458,"content":10459,"level":1120},"/app-config/app-config-parameters-logic-and-use-cases#acquisition-ad-group-name","Acquisition Ad Group Name",[10403,10442],"The attribution ad group name from which the user was acquired. This value is also entered manually. Only one value can be selected. Use cases: validating segmentation based on ad group or creative settesting behavior tied to specific creative structuresreproducing granular acquisition-based scenarios Important: If you do not need to target specific acquisition attributes, leave all fields empty.",{"id":10461,"title":10462,"titles":10463,"content":10464,"level":1104},"/app-config/app-config-parameters-logic-and-use-cases#ab-test-configuration","A/B Test Configuration",[10403],"Specifies A/B tests and test groups used to validate configuration behavior. This section allows you to reproduce the configuration a user would receive when participating in specific experiments. The following rules apply: Only A/B tests with Running status are displayed in the dropdown.For a single A/B test, you can select only one group to generate a valid configuration.You can add multiple A/B tests using the Add A/B Test Configuration button.Each selected test must have a corresponding group specified. Important: If A/B test participation is not required for configuration validation, leave all fields empty. Use cases: validating configuration values for a specific A/B test group;QA verification of experiment setup and group assignment;reproducing user behavior under multiple active experiments.",{"id":971,"title":970,"titles":10466,"content":10467,"level":1110},[],"Overview of App Config, a Remote Config section used to generate and inspect application configurations for different user scenarios without affecting production. App Config is a section of Remote Config designed to generate and inspect application configurations for different user scenarios. It allows you to determine which configuration the app would receive for a specific user context — such as device, OS version, country, user lifecycle stage, or A/B test participation — without affecting real users or production behavior. App Config is commonly used to: verify the default configuration embedded into the app build;inspect the current configuration under different user conditions;validate segmentation logic and A/B test setups;reproduce user scenarios during testing and debugging. App Config does not modify configuration behavior for real users. It is used exclusively to analyze and validate how Remote Config resolves configuration states. For a detailed description of all parameters, their logic, and practical usage examples, see “App Config: Parameters, Logic, and Use Cases.”",{"id":981,"title":980,"titles":10469,"content":10470,"level":1110},[],"Overview of the App Version section, used to manage application versions and download configuration files generated from App Config for specific app versions. The App Version section is used to manage application versions and retrieve configuration files generated based on App Config settings. It allows you to download the configuration that the application uses for a specific app version, in different states — from the baseline default configuration embedded into the build to the current configuration resolved with segmentation and additional user conditions.",{"id":10472,"title":10473,"titles":10474,"content":10475,"level":1104},"/app-version#purpose-of-app-version","Purpose of App Version",[980],"App Version serves two primary purposes:",{"id":10477,"title":10478,"titles":10479,"content":10480,"level":1120},"/app-version#_1-application-version-management","1. Application version management",[980,10473],"Each application version is registered in the system and used as an independent context across segmentation rules, campaigns, reports, and configuration resolution.",{"id":10482,"title":10483,"titles":10484,"content":10485,"level":1120},"/app-version#_2-configuration-retrieval-for-specific-versions","2. Configuration retrieval for specific versions",[980,10473],"The section allows you to download JSON configuration files that correspond to a particular app version, including: the default configuration (default config),the current configuration (current config),configurations generated with additional custom user parameters (config with custom params).",{"id":10487,"title":10488,"titles":10489,"content":10490,"level":1104},"/app-version#relationship-between-app-version-and-app-config","Relationship Between App Version and App Config",[980],"App Config defines how configurations are formed — including parameters, rules, and conditions. App Version is used to retrieve the result — the resolved configuration file for a selected application version. The typical workflow is: configuration rules and parameters are defined in App Config;an application version is selected in App Version;the system generates and returns the configuration corresponding to that version and context.",{"id":10492,"title":10493,"titles":10494,"content":10495,"level":1104},"/app-version#common-use-cases","Common Use Cases",[980],"App Version is commonly used to: verify the default configuration embedded into a specific app build;inspect the current configuration applied to users in production;reproduce configuration states for specific user conditions;validate segmentation rules and A/B tests for a given app version;debug and analyze application behavior without modifying code.",{"id":10497,"title":4001,"titles":10498,"content":10499,"level":1104},"/app-version#next-steps",[980],"For a detailed explanation of: how application versions are created and managed;how to work with the version list;configuration types and their application logic;downloading default, current, and custom-parameter configurations, see “App Version: Configuration Download and Usage.”",{"id":987,"title":986,"titles":10501,"content":10502,"level":1110},[],"This article provides a detailed reference for the App Version section. It explains how application versions are managed in the system and how different types of configurations are generated and downloaded for a specific app version.",{"id":10504,"title":4180,"titles":10505,"content":10506,"level":1104},"/app-version/app-version-configuration-download-and-usage#overview",[986],"The App Version section is used to manage application versions and retrieve configuration files generated based on App Config settings. It allows you to download the configuration that the application uses for a specific app version in different states — from the baseline configuration embedded into the build to the current configuration resolved with segmentation and additional user conditions.",{"id":10508,"title":10473,"titles":10509,"content":10510,"level":1104},"/app-version/app-version-configuration-download-and-usage#purpose-of-app-version",[986],"The App Version section serves two primary purposes:",{"id":10512,"title":10478,"titles":10513,"content":10514,"level":1120},"/app-version/app-version-configuration-download-and-usage#_1-application-version-management",[986,10473],"Each application version is registered in the system and used as an independent context when resolving configuration logic. App versions are used through Segmentation — to define rules that apply only to specific app versions or version ranges. Segments are applied across multiple system entities, including campaigns, features, experiments, and configuration resolution logic. In addition, app versions are used in LTO campaign settings, where campaign behavior may depend on the application version.",{"id":10516,"title":10517,"titles":10518,"content":10519,"level":1120},"/app-version/app-version-configuration-download-and-usage#_2-configuration-retrieval-for-a-specific-version","2. Configuration retrieval for a specific version",[986,10473],"The App Version section allows you to download JSON configuration files calculated for a selected application version and execution context.",{"id":10521,"title":10522,"titles":10523,"content":10524,"level":1120},"/app-version/app-version-configuration-download-and-usage#howapp-versions-appear-in-the-system","How App Versions Appear in the System",[986,10473],"App versions are created and managed inside the application card and can appear in the system either automatically or manually. When a version is created, the following attributes are defined: version number;publication date (Published At);verification status (Is Verified).",{"id":10526,"title":10527,"titles":10528,"content":10529,"level":1120},"/app-version/app-version-configuration-download-and-usage#automatic-version-creation","Automatic Version Creation",[986,10473],"A new version is created automatically when the application sends a configuration request with a version number that does not yet exist in the system. This usually happens when a new build is launched and makes its first request to the backend. In this case: the version is created automatically;Published At is set to the version creation date;the version is created without Is Verified and is considered unverified.",{"id":10531,"title":10532,"titles":10533,"content":10534,"level":1120},"/app-version/app-version-configuration-download-and-usage#manual-version-creation","Manual Version Creation",[986,10473],"App versions can also be added manually in advance, before a new release goes live. This is recommended when you want to prepare configuration, segmentation, or analytics ahead of the rollout. Versions are created in: Configuration > Remote Config > Application",{"id":10536,"title":10537,"titles":10538,"content":10539,"level":1120},"/app-version/app-version-configuration-download-and-usage#how-to-add-a-version-manually","How to add a version manually",[986,10473],"Open the application card.Go to the versions list.Click + Add Version.Enter the version number and save the changes. After saving: the version becomes available in the system;Published At is filled with the creation date;the version remains unverified until the release is confirmed.",{"id":10541,"title":10542,"titles":10543,"content":10544,"level":1120},"/app-version/app-version-configuration-download-and-usage#version-verification-is-verified","Version Verification (Is Verified)",[986,10473],"Is Verified indicates that the application version has been released to real users. Version verification is performed in the same application card where versions are managed.",{"id":10546,"title":10547,"titles":10548,"content":10549,"level":1120},"/app-version/app-version-configuration-download-and-usage#how-to-verify-a-version","How to verify a version",[986,10473],"Open Configuration > Remote Config > Application.Locate the required version in the versions list.If needed, update Published At to match the actual store release date.Enable the Is Verified checkbox next to the version. After verification: the version is treated as released in production;it is considered an active production version by the system;its status and publication date are used in analytics and reports. Example dashboard with a dashed line indicating the app version release date Hovering over the dashed line displays the application version number Best practiceAdd versions in advance if preparation is required.Update Published At before enabling Is Verified.Enable Is Verified only after the version is actually released.Do not verify test or internal-only versions unless they are intentionally included in analytics.",{"id":10551,"title":10552,"titles":10553,"content":10554,"level":1104},"/app-version/app-version-configuration-download-and-usage#managing-versions-in-app-version","Managing Versions in App Version",[986],"The App Version section displays all registered application versions and provides tools to work with them. You can: filter versions by application;search for a version by number;customize visible table columns;sort versions by application or version name. Each table row represents a specific app version and provides actions for downloading configuration files related to that version. Column titles such as Get Default, Get Current, and Get Config with custom parameters indicate the available configuration types. To start a download, click the highlighted configuration name (for example, Default config) inside the corresponding column. Clicking the configuration name triggers generation and download of the configuration file in JSON format.",{"id":10556,"title":10557,"titles":10558,"content":10559,"level":1104},"/app-version/app-version-configuration-download-and-usage#configuration-types-in-app-version","Configuration Types in App Version",[986],"For each app version, the following configuration types are available: Get Default config: download Default configGet Default (sandbox) config: download Default (sandbox) configGet Current config: download Current configGet Current (sandbox) config: download Current (sandbox) configGet Config with custom parameters: download Current configGet Config with custom parameters (sandbox): download Current (sandbox) config Each type represents a distinct way of resolving and downloading a configuration file for the selected app version.",{"id":10561,"title":10562,"titles":10563,"content":10564,"level":1104},"/app-version/app-version-configuration-download-and-usage#default-config","Default Config",[986],"Default config is the baseline configuration embedded into the application build for the selected app version. Default (sandbox) config is the same baseline configuration, generated using sandbox data.",{"id":10566,"title":10567,"titles":10568,"content":10569,"level":1120},"/app-version/app-version-configuration-download-and-usage#purpose","Purpose",[986,10562],"Ensures a predictable startup state of the application (for example, on first launch without internet connectivity).Used as the configuration embedded into the build before the first successful server request.Defines the base configuration on top of which Remote Config and segmentation rules are applied. Important NotesDefault configurations are generated only from the main App Config block (baseline context).Additional parameters (Days After Launch, UA, A/B tests, etc.) do not affect default configurations in either production or sandbox mode.",{"id":10571,"title":10572,"titles":10573,"content":10574,"level":1104},"/app-version/app-version-configuration-download-and-usage#current-config","Current Config",[986],"Current config is the active configuration delivered to the application from the server when internet connectivity is available. Current (sandbox) config is the same configuration calculated using sandbox data.",{"id":10576,"title":10567,"titles":10577,"content":10578,"level":1120},"/app-version/app-version-configuration-download-and-usage#purpose-1",[986,10572],"Inspect the configuration currently delivered to users.Validate changes in Remote Config rules, segmentation, campaigns, features, and experiments without releasing a new app version.Safely test configuration logic using sandbox data.",{"id":10580,"title":10581,"titles":10582,"content":10583,"level":1120},"/app-version/app-version-configuration-download-and-usage#key-logic","Key Logic",[986,10572],"Current configurations include all active rules: segmentation, campaigns, features, and experiments.The baseline context is taken from the main App Config block. The only difference between production and sandbox is the data source.",{"id":10585,"title":10586,"titles":10587,"content":10588,"level":1104},"/app-version/app-version-configuration-download-and-usage#config-with-custom-parameters","Config with Custom Parameters",[986],"Get Config with custom parameters is a separate configuration type used to validate a specific user scenario. It is resolved using current configuration logic but with an extended user context.",{"id":10590,"title":10591,"titles":10592,"content":10593,"level":1120},"/app-version/app-version-configuration-download-and-usage#variants","Variants",[986,10586],"Get Config with custom parameters — production dataGet Config with custom parameters (sandbox) — sandbox data",{"id":10595,"title":10596,"titles":10597,"content":10598,"level":1120},"/app-version/app-version-configuration-download-and-usage#custom-parameters","Custom Parameters",[986,10586],"May include: Days After LaunchDays of WeekIDFAIn-App Purchases (revenue / count)Rewarded Video ImpressionsUA fields (Media Source / Campaign / Ad Group)ProductsA/B test parameters",{"id":10600,"title":10567,"titles":10601,"content":10602,"level":1120},"/app-version/app-version-configuration-download-and-usage#purpose-2",[986,10586],"QA and debugging: “What configuration does a user with condition X receive under scenario Y?”Validation of A/B tests and narrow segmentation rules.Reproducing real-user cases without impacting production.",{"id":10604,"title":10488,"titles":10605,"content":10606,"level":1104},"/app-version/app-version-configuration-download-and-usage#relationship-between-app-version-and-app-config",[986],"App Config defines the context from which all configurations are resolved. The main App Config block defines the baseline context (device, OS, country, language, etc.) > used for Default config and Current config.Additional parameters are applied when a more specific user scenario is required > used in Get Config with custom parameters.",{"id":10608,"title":10609,"titles":10610,"content":10611,"level":1104},"/app-version/app-version-configuration-download-and-usage#configuration-application-logic-in-the-app","Configuration Application Logic in the App",[986],"The application always uses the last successfully fetched current config.",{"id":10613,"title":5090,"titles":10614,"content":10615,"level":1120},"/app-version/app-version-configuration-download-and-usage#how-it-works",[986,10609],"The app requests the current config.If the config is successfully fetched and valid:\nit is applied;saved locally;used for subsequent launches.If a subsequent request fails or returns an invalid config:\nthe app continues using the last working current config. ImportantDefault config is not reapplied once a valid current config has been fetched.Default config is used only as the initial startup configuration.",{"id":10617,"title":10618,"titles":10619,"content":10620,"level":1104},"/app-version/app-version-configuration-download-and-usage#configuration-validation","Configuration Validation",[986],"After downloading a configuration, it is recommended to inspect its structure and contents. You can use any convenient JSON tool, for example: Online JSON Viewer and FormatterJSON Online ViewerJSON Editor Online Or any other tool suitable for viewing and analyzing JSON files. Configuration validation is especially useful for QA, debugging, and analyzing configs generated with custom parameters.",{"id":997,"title":996,"titles":10622,"content":10623,"level":1110},[],"This article explains how to configure segmented and A/B-tested application features, enabling targeted feature delivery based on user segments or experimental groups.",{"id":10625,"title":4180,"titles":10626,"content":10627,"level":1104},"/application-feature/segmented-and-ab-features#overview",[996],"Magify allows features to be targeted to specific user groups through segmentation and A/B testing. This provides flexibility in delivering customized experiences and testing feature impact across different audiences.",{"id":10629,"title":10630,"titles":10631,"content":10632,"level":1120},"/application-feature/segmented-and-ab-features#feature-selection-logic","Feature Selection Logic",[996,4180],"When the client requests a configuration, Magify evaluates applicable feature values in the following priority order: A/B Test assignment – If the user matches any active A/B test group.Segmented value – If no A/B test is matched but the user fits a defined segment.Default value – Used if no match is found. Only one value is assigned per user. Magify uses a waterfall approach, selecting the first applicable value based on the order above. A default key–value pair is mandatory and must be defined in every feature. This ensures all users receive a fallback value when no other targeting applies.",{"id":10634,"title":10635,"titles":10636,"content":10637,"level":1104},"/application-feature/segmented-and-ab-features#creating-a-segmented-feature","Creating a Segmented Feature",[996],"To define segment-based behavior for a feature: Go to an existing Application Feature (Navigate to Remote Config → Configurations → Application Feature).Scroll to or open the Segmented Application Feature section in the left navigation menu.Click +Add Segmented Application Feature.Select one or more segments in Segmentationsfield (looked up based on the selected application).\nYou can optionally exclude specific segments using the Exclude segmentations field.Define the Value to be delivered to users in the selected segments.Repeat this process to assign different values to other segments, if needed. Order matters: If a user matches multiple segment rules, they will receive the value from the first applicable segment in the list. You can reorder segment entries by dragging them in the UI:",{"id":10639,"title":10640,"titles":10641,"content":10642,"level":1120},"/application-feature/segmented-and-ab-features#start-at-end-at","Start at / End at",[996,10635],"The Start at and End at fields define the time window during which a segmented feature value is active and delivered in the configuration for users matching the specified segment. Times are specified in UTC timezone. Start at – The date and time from which the feature value becomes active. Before this time, users will receive another applicable value (e.g., from a different segment or the default).End at – The date and time after which the feature value is no longer active. Once this time is reached, users will receive the next available value in the evaluation order (such as another segment or the default). Notes:If only Start at is set, the feature value will become active at the specified time and remain active indefinitely.If only End at is set, the value will be active immediately (if the user qualifies for the segment) and expire at the defined time.These fields are available only for segmented application features. They cannot be used in default or A/B test configurations.\n::Filters and StatusesThe feature configuration interface supports a combination of filters and statuses that allow precise control over feature value delivery. Filters such as In-App Product Filters can be used to target users based on specific purchases, while statuses like Subscription Status, In-App Status, and Paying Status help define user eligibility based on their engagement and monetization activity. These tools ensure that feature values are shown only to users who match defined behavioral or transactional criteria. The same statuses and filters are used in campaign configurations. For more detailed information, refer to the Filters And Payment Statuses article.Example: Conditional Booster Feature Distribution LogicScenario: The feature startup_booster_count defines how many boosters a user receives at the start of the game.Default value: 3Segmented value: 1 — for users located in the United States, using any language except Spanish, and running app version 3.0.0 or higherResult: Users from the US with a non-Spanish language and app version ≥ 3.0.0 receive 1; all others receive the default value 3.User DescriptionCountry ConditionLanguage ConditionApp Version ConditionDelivered ValueUS user with Spanish languageUSSpanish≥ 3.0.03 (default value)US user with English languageUSEnglish (≠ Spanish)≥ 3.0.01 (segmented value)US user with French languageUSFrench (≠ Spanish)≥ 3.0.01 (segmented value)US user with any languageUSAny\u003C 3.0.03 (default value)Non-US user (e.g., CA, UK, DE) with any languageNot USAnyAny3 (default value)Creating A/B Test FeaturesTo assign different feature values to A/B test groups:First, create an A/B test in draft status—only tests in this status can be selected when configuring feature variations. For details, refer to the A/B Test article.Navigate to the feature you want to A/B test (Navigate to Remote Config → Configurations → Application Feature).Scroll to or open the A/B Test Application Feature section.Click +Add A/B Test Application Feature.Select the appropriate A/B test from the list — draft status tests are automatically populated in the dropdown — and assign the corresponding groups.Define the Value that the selected group(s) should receive.Repeat the process to define values for other groups in the same test.Click Save to apply changes.After completing these steps, the A/B test is ready to be launched.A/B tests have higher priority than segmentation. If a user is part of a test group, they will receive the value defined by the A/B test — even if they also match a segment.In features, A/B tests cannot be segmented — unlike in campaigns, there is no option to assign test values to specific segments. Feature A/B test values are delivered based solely on the test group assignment.",{"id":991,"title":990,"titles":10644,"content":10645,"level":1110},[],"This article explains how to create, configure, and manage Application Features in Magify to dynamically control app behavior based on default values, segmentation, or A/B testing.",{"id":10647,"title":4180,"titles":10648,"content":10649,"level":1104},"/application-feature#overview",[990],"An Application Feature (or simply feature) in Magify is a configurable container of parameters that control specific behaviors or settings in the application. These parameters are delivered via Magify and interpreted by the client-side logic of the app. Features enable flexible configuration of game or app functionality without requiring a new app version, as long as the logic for handling the feature is already implemented in the client. App features require advanced Magify SDK integration and proper service initialization. For detailed setup instructions, see the App Features article in the Unity SDK section. Key Properties of Features No App Update Required: Features can be created or updated server-side at any time. However, they will only take effect if client-side logic for handling the feature key is already implemented.Client-Side Logic Required: The app must be able to recognize and apply each feature key; otherwise, changes in Magify will have no effect.Flexible Usage: Features can be included in segmentation rules, remote configurations, and A/B testing experiments.",{"id":10651,"title":10652,"titles":10653,"content":10654,"level":1120},"/application-feature#feature-use-case-examples","Feature Use Case Examples",[990,4180],"The following are example use cases of how features can be applied. Enabling or disabling specific game modes. Example: new_year_mode_enabled = true — activates a seasonal game mode for New Year events. Managing In-Game Ad Banner Display. Example: banner_settings = { \"is_enabled_since_level_number\": true, \"is_enabled_prior_to_level_number\": false, \"level_number_of_switching_logic\": 7} — enables or disables ad banner display for the selected segment and defines the level at which banners should start or stop appearing. Customizing the color scheme or visual theme of specific sections. Example: theme_color = \"holiday\" — applies a festive visual theme to designated UI sections, such as menus or backgrounds. Configuring reward quantity and type in victory chests. Example: victory_chest_reward = {\"type\": \"coins\", \"amount\": 250} — defines that the player receives 250 coins upon opening a victory chest.",{"id":10656,"title":6417,"titles":10657,"content":10658,"level":1120},"/application-feature#default-features-optional",[990,4180],"Magify provides a set of default system features, available under the Default Features (Optional) section, that are used internally by the SDK. These features control specific logic and behaviors directly within the SDK. They do not require additional handling on the client side but are still included in the configuration and can be accessed by the application if needed. If you add any of these features to your application via Remote Config → Configurations → Application Feature, the SDK will automatically recognize and apply the corresponding behavior wherever it is supported — without requiring any additional client-side implementation.",{"id":10660,"title":10661,"titles":10662,"content":10663,"level":1120},"/application-feature#creating-a-new-application-feature","Creating a New Application Feature",[990,4180],"To create a new feature in Magify, follow these steps: Navigate to Remote Config → Configurations → Application Feature → Create NewSelect the appropriate application.Fill in the Key field. Important: The feature key (field key) cannot be changed after the feature is created. Once the feature is saved for the first time, the key becomes locked and read-only. Below is an example of how this appears in the interface::br:br:br:br:br:brFill in the Value field.Click Save to apply the changes. The Value field defines the default value of the feature. This value will be included in both the default and current configurations, unless it is overridden by segmentation rules or A/B test assignments. The screenshot below displays the default value of the feature along with the associated configuration fields:",{"id":10665,"title":10666,"titles":10667,"content":10668,"level":1120},"/application-feature#additional-fields-for-the-default-feature-value","Additional Fields for the Default Feature Value",[990,4180],"Description This field is visible only within the admin interface. We recommend using it to describe the feature’s functionality, purpose, and any additional notes for future reference.App Version From / ToThese fields define the range of app versions for which the default value of the feature should be delivered.\nApp Version From: the minimum version (inclusive).App Version To: the maximum version (inclusive). These version constraints apply only to the default value of the feature. If segmentation or A/B testing is used, version limits must be applied separately within those configurations.",{"id":10670,"title":10671,"titles":10672,"content":10673,"level":1120},"/application-feature#supported-data-types-for-feature-values","Supported Data Types for Feature Values",[990,4180],"The Value field in an Application Feature supports the following data types: object, string, integer, number, boolean, array, null. If the Value field is left empty when the form is saved, the system will automatically assign a default value of null. Below are examples and usage guidelines for each supported type:",{"id":10675,"title":10676,"titles":10677,"content":10678,"level":4579},"/application-feature#string","string",[990,4180,10671],"Use double quotes around the value. Example:Feature: menu_modes_orderValues: \"classic, dynamic, survival\" — defines the order of menu tiles.",{"id":10680,"title":10681,"titles":10682,"content":10683,"level":4579},"/application-feature#boolean-true-false","boolean (true / false)",[990,4180,10671],"Used to enable or disable a feature. Example:Feature: daily_bonuses_enabledValues: true, false — controls whether the daily bonus is displayed.",{"id":10685,"title":10686,"titles":10687,"content":10688,"level":4579},"/application-feature#number","number",[990,4180,10671],"Floating-point numbers representing decimal values. Example:Feature: units_speedValue: 5.5 — specifies the speed in units per second.",{"id":10690,"title":10691,"titles":10692,"content":10693,"level":4579},"/application-feature#integer","integer",[990,4180,10671],"Whole number values. Example:Feature: badge_new_hoursValue: 72 — sets the number of hours after content is added during which the \"new\" badge remains visible.",{"id":10695,"title":10696,"titles":10697,"content":10698,"level":4579},"/application-feature#object","object",[990,4180,10671],"The object type allows grouping multiple related parameters under one feature key. Example:Feature: daily_reward_config{\"daily_reward_config\": {\"enabled\": true,\"bonus_type\": \"coins\",\"amount\": 250}}The value is an object that includes:enabled — toggles the feature on or off.bonus_type — specifies the type of reward.amount — defines the reward amount.\n::arrayThe array type is used to define an ordered list of values.Example:Feature: active_modes{\"active_modes\": [\"classic\", \"dynamic\"]}The value is an array of game modes to be activated in the specified order.Note: When using object or array types, always verify integration on the client side to ensure correct parsing and application of the feature.Feature Value Distribution LogicEach Application Feature in Magify is structured into three blocks:Default ValueSegmented ValuesA/B Tests ValuesWhen the client requests a configuration, Magify evaluates applicable feature values in the following priority order:A/B Test assignment – If the user matches any active test group.Segmented value – If no A/B test is matched but the user fits a segment.Default value – Used if no other match is found.More details on how to create segmented features, the meaning of their configuration fields, and how to set up A/B test features can be found in Segmented and AB Test Features article.Within each configuration block — whether A/B Tests or Segments — values are evaluated from top to bottom, and their position in the interface determines priority. By default, entries are ordered by creation time, but this can be adjusted manually by dragging and rearranging them.Changing the order may directly affect which configuration value is delivered to the user.Recommendation: Always review the order of entries manually after making bulk changes, as priority is determined by their position in the list.Example: Feature Logic in ActionFeature key: level_with_giftDefault Value: 5Segmented Values (in order):\nUS → 3UK launched 01.03. → 7WW excl EN Lang → 4A/B Test Targeting: ESScenario – 5 Incoming Users:User DescriptionA/B Test MatchSegment MatchDelivered ValueES (EN)✅❌A/B Test ValueUS (ES)❌✅ US3UK launched 03.03.❌✅ UK launched 01.03.7✅ UK (ES Lang) launched 28.02.❌✅ WW excl EN4IR (EN)❌❌5 (default)Note: The segment evaluation is strictly top-to-bottom. Changing the segment order can lead to different values being returned for the same user. If the segment order were different (e.g., WW excl EN listed above US), the value for US (ES) could have been 4 instead of 3.Additional Feature Evaluation ScenariosBelow are typical scenarios for how feature values are resolved in the client context, based on combinations of default values, segments, and A/B tests:1. Only Default Value SpecifiedIf no segmentation or A/B testing is applied, the client will receive only the default value of the feature.2. Segments Specified (Without A/B Test)User matches a segment: → The feature value defined for that segment is delivered to the client.User does not match any segment: → The default feature value is delivered.Two segment entries with identical segmentation logic: → The client receives the value from the first segment listed in the configuration (order matters).Segment includes an Exclude rule (or the exclusion is defined inside an A/B test): → If the user matches the Exclude condition, they will receive either the default or an alternative segment value, depending on the exclusion setup.3. Both Segment and A/B Test SpecifiedSegment and A/B test share the same targeting logic: → The value from the A/B test takes priority and is delivered.Segment and A/B test have different targeting logic: → The user receives the value based on which segment or test they match, following the standard priority logic (A/B test > Segments > Default).These examples illustrate how Magify handles feature resolution in complex targeting environments. Understanding this logic ensures reliable behavior when configuring segmented or experimental feature flags.Deleting Application Feature Values for Segmentations or A/B TestsMagify allows the deletion of feature values defined for specific segments or A/B tests:Backend Behavior: When a segmented or A/B test value is deleted, it is removed from the configuration and will no longer be delivered to users.Client-Side Behavior:If the entire feature is deleted, the app will fall back to its hardcoded default behavior (as defined in the client logic).If a segmented or A/B-specific feature value is deleted, the system will evaluate the next applicable configuration block (e.g., another segment, A/B test, or the default value) and deliver that to the user.This may result in a situation where a user who previously received Feature Value A will now receive Feature Value B, depending on the current configuration logic.Retaining A/B Test Values After Test Completion: If you want to preserve A/B test values for users after the experiment ends, use segmentation based on A/B test assignment. This can be done by creating a new segment and applying the corresponding A/B test criteria to ensure users continue receiving the same values they had during the test:If a specific feature is no longer needed, it is recommended to restrict its distribution by setting the App Version To field for the default value. This ensures that the feature will no longer be delivered in the configuration for app versions above the specified one.",{"id":1001,"title":1000,"titles":10700,"content":10701,"level":1110},[],"This article explains how to configure and manage Custom Events and their keys in Magify, enabling accurate tracking, filtering, and analysis of user actions across reports, dashboards, and funnels.",{"id":10703,"title":4180,"titles":10704,"content":10705,"level":1104},"/custom-event#overview",[1000],"Custom Events are developer-defined events used to track specific user actions within an application. Unlike predefined system events, they are fully customizable to reflect the unique logic, features, and mechanics of a particular app or game. With Advanced Integration, you can submit your own custom analytics events in addition to the standard set of events. Use the TrackEvent method to send a custom event. See more in the Your custom events section of this SDK documentation.",{"id":10707,"title":10708,"titles":10709,"content":10710,"level":1120},"/custom-event#why-use-custom-events","Why Use Custom Events",[1000,4180],"Custom Events allow product and analytics teams to: Monitor key in-game actions such as level_open (Triggered when a user opens a level), booster_used (Tracks usage of an in-game booster), tutorial_step1_done(Marks completion of the first tutorial step)Track tutorial progress, user engagement, and churn pointsMeasure user behavior at any point in the product funnel",{"id":10712,"title":10713,"titles":10714,"content":10715,"level":1120},"/custom-event#event-registration-and-custom-event-key-configuration","Event Registration and Custom Event Key Configuration",[1000,4180],"Once custom events are implemented in the application and correctly transmitted via the SDK, they are automatically ingested by Magify and become available in the Custom Events section. These events can then be used across dashboards, reports, and funnels. If a custom event includes custom event keys, it is essential to explicitly assign a type (e.g., Dimension) to the relevant keys. This enables their values to be used for filtering, grouping, and selection in dropdown menus across Magify’s analytics tools. All custom event keys are sent alongside the event. Please note: New keys can be created manually via the Custom Event Management interface .Existing keys cannot be modified after creation. The Dimension type can be assigned: After the custom event keys appear in the system, orIn advance, if the key names are known during the integration stage. If a custom event is no longer needed, it can be archived by checking the “Is archived” box. This action will automatically archive all associated custom event keys. Both the custom event and its keys can be unarchived later if needed.",{"id":10717,"title":10718,"titles":10719,"content":10720,"level":1120},"/custom-event#identifying-unconfigured-custom-events","Identifying Unconfigured Custom Events",[1000,4180],"A common indicator of an unconfigured custom event is the absence of selectable values in funnels, dashboards, or reports. For example, if a custom event key appears in the UI but shows \"No data,\" it likely means the key type has not been correctly configured.",{"id":10722,"title":10723,"titles":10724,"content":10725,"level":1120},"/custom-event#how-to-locate-and-configure-a-custom-event","How to Locate and Configure a Custom Event",[1000,4180],"To properly configure a custom event: Navigate to Remote Config → Configurations → Custom Events.Apply a filter by application using the “+” icon in the top-left corner.Use the search bar in the top-right to locate the event by name.Sort the columns if needed to find the relevant event quickly.Click on the event name (not the app name) to open the configuration screen.",{"id":10727,"title":10728,"titles":10729,"content":10730,"level":1120},"/custom-event#setting-custom-event-key-types","Setting Custom Event Key Types",[1000,4180],"Within the event configuration screen: Locate the list of associated custom event keys.For any key that should be available for filtering or grouping, set its Type to Dimension.To stop a key from being processed or shown in the UI, check the “Is archived” box. To stop a key from being processed or shown in the UI, check the “Is archived” box — the key will be hidden from dashboards and filters but can be unarchived later if needed.",{"id":10732,"title":10733,"titles":10734,"content":10735,"level":1120},"/custom-event#important-notes","Important Notes",[1000,4180],"Once a parameter is set as Dimension, it may take up to 2 hours for values to appear in dropdownsOnly parameters with type Dimension are usable for filters or groupings in dashboards and funnels",{"id":10737,"title":10738,"titles":10739,"content":10740,"level":1120},"/custom-event#where-to-view-custom-event-statistics","Where to View Custom Event Statistics",[1000,4180],"You can view and analyze Custom Events data in the following sections: Custom Events Report and DashboardLevel Progress Report and DashboardA/B Tests Custom Events Report and DashboardFunnels",{"id":1007,"title":1006,"titles":10742,"content":10743,"level":1110},[],"Native Element Groups allow you to group products and use them in campaigns, segmentation, and limits to build flexible purchase-based logic.",{"id":10745,"title":10746,"titles":10747,"content":10748,"level":1120},"/native-element-group#what-is-a-native-element-group","What is a Native Element Group",[1006],"Native Element Group is a collection of Native elements (products) that allows you to work with sets of products instead of individual Product IDs when configuring campaigns, segmentation, and limits. A Native Element Group can include products of different types, such as: consumable;non-consumable;subscription;rewarded and others. Important:Native Element Group is used for campaign logic and segmentation and does not appear as a separate entity in analytics reports. Analytics is always calculated on the level of individual Product IDs included in the group.",{"id":10750,"title":10751,"titles":10752,"content":467,"level":1104},"/native-element-group#where-native-element-group-is-used","Where Native Element Group is used",[1006],{"id":10754,"title":10755,"titles":10756,"content":10757,"level":1120},"/native-element-group#_1-campaign-filters-parent-and-nested-campaigns","1. Campaign filters (parent and nested campaigns)",[1006,10751],"Native Element Group can be used in parent and nested campaign filters: Include group if any purchasedExclude group if any purchasedInclude group if all purchasedExclude group if all purchased Supported product types: Campaign filters support groups containing products of any type. ExampleGroup: holiday_productsContains:christmas_bundle_id (consumable)new_year_offer_id (subscription) Difference between any purchased and all purchasedany purchased — the user purchased at least one product from the group.all purchased — the user purchased all products in the group.",{"id":10759,"title":10760,"titles":10761,"content":10762,"level":1120},"/native-element-group#_2-segmentation-product","2. Segmentation (Product)",[1006,10751],"Native Element Group is used in Segmentation > Product. Product type limitation: Only groups containing: Consumable Product IDsNon-Consumable Product IDs are supported. Groups containing other product types are not supported in segmentation.",{"id":10764,"title":10765,"titles":10766,"content":10767,"level":1120},"/native-element-group#_3-temporary-limits-impression-limits","3. Temporary limits (Impression limits)",[1006,10751],"Native Element Group is used within the Temporary limits section in: Impression limitsA/B Test Impression limitsSegmented Impression limits The group is applied via: Include group if any purchased Supported product types: All product types are supported in impression limits.",{"id":10769,"title":10770,"titles":10771,"content":10772,"level":1120},"/native-element-group#_4-application-feature-segmented-ab-test","4. Application Feature (Segmented / A/B Test)",[1006,10751],"Native Element Group is used within Application Feature settings in: Segmented Application FeatureA/B Test Application Feature The group is applied in filters that evaluate product purchase conditions. Supported conditions: any purchasedall purchased Supported product types: All product types are supported in Application Feature filters.",{"id":10774,"title":10775,"titles":10776,"content":10777,"level":1104},"/native-element-group#end-to-end-example","End-to-end example",[1006],"Group: no_ads_products Contains: remove_ads_product_id (non-consumable)subscription_no_ads_id (subscription) Used in: campaign filters;impression limits;application feature filters Not supported in segmentation.",{"id":10779,"title":10780,"titles":10781,"content":10782,"level":1104},"/native-element-group#creating-a-native-element-group","Creating a Native Element Group",[1006],"Groups can be: created automatically (default groups);created manually. Manual creation: Go to Native Element Groups.Click Create New.Fill in Name, Application, and Native elements.Click Save.",{"id":10784,"title":10785,"titles":10786,"content":10787,"level":1104},"/native-element-group#cloning-a-native-element-group","Cloning a Native Element Group",[1006],"Any group can be cloned to quickly create a new editable group based on an existing one.",{"id":10789,"title":10790,"titles":10791,"content":10792,"level":1104},"/native-element-group#native-element-group-filtering-and-table-view","Native Element Group filtering and table view",[1006],"To simplify working with Native Element Groups, the system provides separate mechanisms for filtering and table display customization.",{"id":10794,"title":10795,"titles":10796,"content":10797,"level":1120},"/native-element-group#filtering","Filtering",[1006,10790],"In the Native Element Groups list, filtering is available only by Application. This allows you to: display groups related to a specific application;manage groups more efficiently in multi-application projects.",{"id":10799,"title":10800,"titles":10801,"content":10802,"level":1120},"/native-element-group#table-display-settings-edit-table","Table display settings (Edit table)",[1006,10790],"In addition, the interface provides table display customization via the Edit table menu. Using this menu, you can: show or hide the following columns:\nNameApplicationIs default groupActionsuse search to find values within the table. ImportantThe Edit table settings affect only how data is displayed in the table and do not apply any filtering logic to Native Element Groups.",{"id":10804,"title":4245,"titles":10805,"content":10806,"level":1104},"/native-element-group#summary",[1006],"Native Element Group is a core building block for scalable campaign logic. It allows you to: group products of different types;reuse logic across campaigns, segmentation, and limits;keep configurations clean and maintainable.",{"id":1013,"title":1012,"titles":10808,"content":10809,"level":1110},[],"Overview of Native elements — components for configuring monetization, promotional campaigns, and user-facing scenarios within the application, including element types and product-related workflows. Native elements are application components used to configure monetization, promotional campaigns, and other user-facing scenarios. They allow controlling campaign logic and presentation directly within the product, without requiring application updates. This section serves as the main entry point for Native elements documentation.",{"id":10811,"title":10812,"titles":10813,"content":10814,"level":1104},"/native-elements#purpose-of-native-elements","Purpose of Native elements",[1012],"Native elements are used to: configure monetization flows inside the application;manage in-game products and rewards;build promotional and cross-promo campaigns;trigger user-facing events;link system products with in-app products and external services;control placements and display logic within the application. Each Native element type fulfills a specific functional role within the system.",{"id":10816,"title":10817,"titles":10818,"content":10819,"level":1104},"/native-elements#native-element-types","Native element types",[1012],"The system supports the following Native element types: Banner PlacementBonus Product IDConsumable Product IDCross-Promo Product IDDeeplink Product IDEventExternal Product IDInfo Product IDNon-Consumable Product IDRewarded Product IDSpotSubscription Product ID Each type has its own purpose, configuration rules, and usage scenarios. Detailed documentation for every Native element type is available in the corresponding articles within this section.",{"id":10821,"title":10822,"titles":10823,"content":10824,"level":1104},"/native-elements#in-app-product-imports","In-App product imports",[1012],"Native elements work in conjunction with in-app products imported from application stores. This section also includes guides for importing products via official store APIs: Importing In-App Products from Google Play via APIImporting In-App Products from App Store via API Imported products are referenced by Product ID–based Native elements such as Consumable, Non-Consumable, and Subscription Product ID.",{"id":10826,"title":10827,"titles":10828,"content":10829,"level":1104},"/native-elements#documentation-structure","Documentation structure",[1012],"The documentation is organized into separate articles, each focused on a specific Native element type or related functionality, including: purpose and usage scenarios;configuration parameters;behavior and limitations.",{"id":1019,"title":1018,"titles":10831,"content":10832,"level":1110},[],"Info Product ID is used for informational in-app scenarios without purchases or user actions and is applied in Mixed campaigns to control logic and analytics.",{"id":10834,"title":10835,"titles":10836,"content":10837,"level":1104},"/native-elements/info-product-id#what-is-info-product-id","What is Info Product ID",[1018],"Info Product ID is a Native element designed for informational scenarios in the application where no purchase is involved and no user action is required. A typical example is an informational banner in the news feed or UI displaying messages like Coming soon or New mode available soon, without any button or navigation.",{"id":10839,"title":10840,"titles":10841,"content":10842,"level":1104},"/native-elements/info-product-id#key-characteristics","Key characteristics",[1018],"Info Product ID does not represent a purchase and contains no payment logic.Used for:\nMixed and Mixed LTO campaign logic;analytics and Product ID–based filtering.Does not need to be created in app stores.Created directly in the system and ready to use immediately.",{"id":10844,"title":10845,"titles":10846,"content":10847,"level":1104},"/native-elements/info-product-id#supported-campaigns","Supported campaigns",[1018],"Info Product ID can be used only in the following campaign types: Mixed campaignsMixed LTO campaignsA/B test campaigns for the listed types",{"id":10849,"title":10850,"titles":10851,"content":10852,"level":1104},"/native-elements/info-product-id#usage-example","Usage example",[1018],"Example Info Product ID:info_nf_christmas_mood_soon This product can be used to display an informational banner in the demo application’s news feed announcing an upcoming seasonal event. You can see an example of a created Info Product ID in the demo application here.",{"id":10854,"title":10855,"titles":10856,"content":10857,"level":1104},"/native-elements/info-product-id#how-to-create-an-info-product-id","How to create an Info Product ID",[1018],"Where to find it: Configuration > Remote Config > Native elements Creation steps: Click Create new.Fill in the creation form:",{"id":10859,"title":1328,"titles":10860,"content":10861,"level":1120},"/native-elements/info-product-id#application",[1018,10855],"Select the application the Info Product ID belongs to.",{"id":10863,"title":1304,"titles":10864,"content":10865,"level":1120},"/native-elements/info-product-id#name",[1018,10855],"A unique product identifier used in analytics and Product ID–based filtering. Recommended example:info_nf_christmas_mood_soon",{"id":10867,"title":10868,"titles":10869,"content":10870,"level":1120},"/native-elements/info-product-id#human-readable-name","Human-readable name",[1018,10855],"An internal name used only inside the system. Not included in analytics. It is recommended to use the same value as the Name or provide a clearer internal description if needed. Example:Name: info_nf_christmas_mood_soonHuman-readable name: Christmas mode coming soon",{"id":10872,"title":10873,"titles":10874,"content":10875,"level":1120},"/native-elements/info-product-id#native-element-type","Native element type",[1018,10855],"Select Info Product ID.",{"id":10877,"title":8764,"titles":10878,"content":10879,"level":1120},"/native-elements/info-product-id#context",[1018,10855],"Info Product ID must have an associated Info Product ID Context. The context is used in mixed campaign logic. A default context is not required and may be empty. More details will be available in the Product ID Context article (coming soon).",{"id":10881,"title":10882,"titles":10883,"content":10884,"level":1120},"/native-elements/info-product-id#default-image-optional","Default image (optional)",[1018,10855],"Optional. Used for reference or documentation purposes only.",{"id":10886,"title":10887,"titles":10888,"content":10889,"level":1120},"/native-elements/info-product-id#status","Status",[1018,10855],"Default value — Active. If the product is no longer needed: change its status to Archived;once archived, it cannot be used in campaigns or restored;to use it again, create a new Info Product ID with a unique name. Click Save.",{"id":10891,"title":4245,"titles":10892,"content":10893,"level":1104},"/native-elements/info-product-id#summary",[1018],"Info Product ID is designed for non-purchase informational scenarios and is used to control mixed campaign logic and analytics through Product IDs.",{"id":1023,"title":1022,"titles":10895,"content":10896,"level":1110},[],"Non-consumable Product ID is a Native element used for paid non-consumable in-app purchases and for running purchase-based campaigns with revenue tracking. Non-consumable Product ID is a Native element that represents a priced product identifier that can be purchased by a user only once. It is used for in-app purchases that grant a permanent entitlement or feature, for example: $3.99 to permanently disable ads;$3.99 for lifetime access to a specific game mode. Such purchases cannot be made multiple times, as they guarantee a permanent effect for the user, such as disabling ads forever or unlocking a feature permanently. This element represents a real in-app purchase and must correspond to a product created in the app stores. You can see an example of a created Non-consumable Product ID in the demo application here.",{"id":10898,"title":10840,"titles":10899,"content":10900,"level":1104},"/native-elements/non-sonsumable-product-id#key-characteristics",[1022],"Non-consumable Product ID has a price defined in the Cost section (in USD).The product can be purchased by a user only once.Non-consumable Product ID includes purchase and revenue tracking.Both Cost and Customs fields are required.Non-consumable Product ID must be linked to at least one In-app Product ID Context. Non-consumable Product ID can be used in the following campaign types: In-appIn-app LTOMixedMixed LTOA/B test campaigns for the campaign types listed above",{"id":10902,"title":10903,"titles":10904,"content":467,"level":1104},"/native-elements/non-sonsumable-product-id#required-fields","Required fields",[1022],{"id":10906,"title":1304,"titles":10907,"content":10908,"level":1120},"/native-elements/non-sonsumable-product-id#name",[1022,10903],"The Name field is defined by the person configuring campaigns and must exactly match the Product ID created in the app stores (App Store / Google Play). Used in analytics and reports as a Product ID filter.Must be identical to the store product identifier. Example: gp_no_ads_5",{"id":10910,"title":10868,"titles":10911,"content":10912,"level":1120},"/native-elements/non-sonsumable-product-id#human-readable-name",[1022,10903],"The Human-readable name is used only inside the system for convenience. Recommendation: use the same value as in Name.A more descriptive name may be used if additional clarification is needed.This field does not appear in analytics or reports. Examples:Name: gp_no_ads_5Human-readable name: gp_no_ads_5orName: gp_no_ads_5Human-readable name: No Ads (Lifetime)",{"id":10914,"title":10915,"titles":10916,"content":10917,"level":1120},"/native-elements/non-sonsumable-product-id#cost","Cost",[1022,10903],"The Cost field is required for Non-consumable Product ID. Defines the product price in USD.Must match the price configured for the product in the app stores.Used for purchase validation and revenue analytics. If the Cost field is not set, the product cannot be saved.",{"id":10919,"title":10920,"titles":10921,"content":10922,"level":1120},"/native-elements/non-sonsumable-product-id#customs","Customs",[1022,10903],"The Customs field is required for Non-consumable Product ID and defines the product’s default context. Specifies the permanent entitlement or feature granted to the user after purchase.Must be provided as a JSON object.The JSON structure must match the In-app Product ID Creative structure for the application.Only one default context is allowed per product. Example:{\n  \"items\": [\n    {\n      \"bonus\": \"noads\"\n    }\n  ]\n}",{"id":10924,"title":10925,"titles":10926,"content":10927,"level":1120},"/native-elements/non-sonsumable-product-id#customs-behavior","Customs behavior",[1022,10903],"The default context defined in Customs is used when: a purchase is completed using a promo code;a purchase is completed from the app store page and finalized inside the application;the purchase flow is interrupted or cannot be resolved via a campaign context. If, at the time of product creation, you do not yet know the final JSON structure, you may enable the Confirm empty option. In this case, the product will be saved with an empty JSON in the Customs field. Important: before releasing the product to real users, make sure to fill the Customs field with a valid JSON context. Using a Consumable or Non-consumable Product ID with an empty Customs field may lead to incorrect purchase behavior.",{"id":10929,"title":10930,"titles":10931,"content":10932,"level":1104},"/native-elements/non-sonsumable-product-id#in-app-product-id-context","In-app Product ID Context",[1022],"Each Non-consumable Product ID must be associated with at least one In-app Product ID Context. The context defines the permanent entitlement granted to the user upon purchase.A single Non-consumable Product ID may have multiple In-app Product ID Contexts.Contexts are used in creatives and campaign logic. More details are available in the Product ID Context article.",{"id":10934,"title":10935,"titles":10936,"content":10937,"level":1104},"/native-elements/non-sonsumable-product-id#final-step","Final step",[1022],"Click Save to create the Non-consumable Product ID. Once created, the Non-consumable Product ID can be used in In-app, In-app LTO, Mixed, and Mixed LTO campaigns, as well as A/B test campaigns for these campaign types, and will be available in analytics and reports as a Product ID filter. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":1027,"title":1026,"titles":10939,"content":10940,"level":1110},[],"Banner Placement is a Native element used to place banners at the top or bottom of the application screen and to run banner campaigns. Banner Placement represents a narrow third-party banner area displayed at the top or bottom of the application screen. It defines where a banner can be shown in the app and is used exclusively for banner-based campaigns. You can see an example of a banner placement in the demo application here.",{"id":10942,"title":10840,"titles":10943,"content":10944,"level":1104},"/native-elements/banner-placement#key-characteristics",[1026],"A Banner Placement does not have counters, limits, or configurable parameters. This is important to consider during setup.Banner Placements are compatible only with campaigns of type Banner and Banner A/B Test.",{"id":10946,"title":10947,"titles":10948,"content":10949,"level":1104},"/native-elements/banner-placement#how-to-create-a-banner-placement","How to create a Banner Placement",[1026],"Go to Configuration > Native elements > Create new.In the creation form:\nSelect the target Application.Enter Name.\nUse snake_case or another format supported by your project.The value must exactly match the identifier used in the application code so the placement is correctly triggered on user interaction.Enter Human-readable name.\nRecommendation: use the same value as in Name for consistency.Set Native element type to Banner Placement.",{"id":10951,"title":10952,"titles":10953,"content":10954,"level":1104},"/native-elements/banner-placement#optional-fields","Optional fields",[1026],"Default image You may upload an image showing how the banner placement looks inside the application. This is typically used for reference and historical context and is not required.StatusDefault value: ActiveIf the placement is no longer needed, you can change the status to Archived. If the placement is no longer needed, you can change the status to Archived. Once archived, the placement cannot be used in campaigns or restored. To use a banner placement again, you must create a new one with a unique name.",{"id":10956,"title":10935,"titles":10957,"content":10958,"level":1104},"/native-elements/banner-placement#final-step",[1026],"Click Save to create the Banner Placement. Once created, the placement can be used in a Banner campaign.",{"id":1031,"title":1030,"titles":10960,"content":10961,"level":1110},[],"Bonus Product ID is a Native element used for bonus rewards and for running Bonus and Mixed campaigns with bonus tracking. Bonus Product ID is a Native element used for bonus mechanics in campaigns where users receive a reward inside the application. Bonus Product ID does not represent an in-app purchase and does not include any purchase or payment logic. It is created directly in Magify, does not require setup in app stores or external systems, and is used for campaign configuration and analytics related to bonus rewards. You can see an example of a created Bonus Product ID in the demo application here.",{"id":10963,"title":10840,"titles":10964,"content":10965,"level":1104},"/native-elements/bonus-product-id#key-characteristics",[1030],"Bonus Product ID is used for bonus interactions.The element does not include pricing, payment, or purchase logic.Bonus Product ID must be linked to a Bonus Product ID Context.A default context is not required. Bonus Product ID can be used in the following campaign types: BonusBonus LTOMixedA/B test campaigns for the campaign types listed above",{"id":10967,"title":10968,"titles":10969,"content":467,"level":1104},"/native-elements/bonus-product-id#naming-rules","Naming rules",[1030],{"id":10971,"title":1304,"titles":10972,"content":10973,"level":1120},"/native-elements/bonus-product-id#name",[1030,10968],"The Name field is defined by the person configuring campaigns. The value does not affect application behavior.It is used only in analytics and reports as a Product ID filter.It is recommended to follow the same naming style as Consumable Product ID. Example: bonus_game_share_id",{"id":10975,"title":10868,"titles":10976,"content":10977,"level":1120},"/native-elements/bonus-product-id#human-readable-name",[1030,10968],"The Human-readable name is used only inside the system for convenience. Recommendation: use the same value as in Name.A more descriptive name may be used if additional clarification is needed.This field does not appear in analytics or reports. Examples:Name: bonus_game_share_idHuman-readable name: bonus_game_share_idorName: bonus_game_share_idHuman-readable name: Game share bonus ID",{"id":10979,"title":10980,"titles":10981,"content":10982,"level":1104},"/native-elements/bonus-product-id#product-id-context","Product ID Context",[1030],"Each Bonus Product ID must be associated with a Bonus Product ID Context. The context is used in creatives and campaign logic.It defines the bonus parameters and behavior.A default context is not required. More details about contexts and creatives will be available in the Product ID Context article.",{"id":10984,"title":10985,"titles":10986,"content":10987,"level":1104},"/native-elements/bonus-product-id#how-to-create-a-bonus-product-id","How to create a Bonus Product ID",[1030],"Go to Configuration > Native elements > Create new.In the creation form:\nSelect the target Application.Enter Name following the recommended naming rules.Enter Human-readable name.Set Native element type to Bonus Product ID.Configure the required Bonus Product ID Context.",{"id":10989,"title":10952,"titles":10990,"content":467,"level":1104},"/native-elements/bonus-product-id#optional-fields",[1030],{"id":10992,"title":10993,"titles":10994,"content":10995,"level":1120},"/native-elements/bonus-product-id#default-image","Default image",[1030,10952],"You may upload an image for reference or documentation purposes. This field is optional and does not affect campaign behavior.",{"id":10997,"title":10887,"titles":10998,"content":10999,"level":1120},"/native-elements/bonus-product-id#status",[1030,10952],"Default value: Active.If the Bonus Product ID is no longer needed, you can change the status to Archived.Once archived, it cannot be used in campaigns or restored. To use it again, you must create a new Bonus Product ID with a unique name.",{"id":11001,"title":10935,"titles":11002,"content":11003,"level":1104},"/native-elements/bonus-product-id#final-step",[1030],"Click Save to create the Bonus Product ID. Once created, the Bonus Product ID can be used in Bonus, Bonus LTO, Mixed, and A/B test campaigns for these campaign types, and will be available in analytics and reports as a Product ID filter.",{"id":1035,"title":1034,"titles":11005,"content":11006,"level":1110},[],"Consumable Product ID is a Native element used for paid consumable in-app purchases and for running purchase-based campaigns with revenue tracking. Consumable Product ID is a Native element that represents a priced product identifier that can be purchased by users multiple times. It is used for in-app purchases such as currency packs, boosters, or other consumable items (for example, $3.99 for a set of boosters). This element represents a real in-app purchase and must correspond to a product created in the app stores. You can see an example of a created Consumable Product ID in the demo application here.",{"id":11008,"title":10840,"titles":11009,"content":11010,"level":1104},"/native-elements/consumable-product-id#key-characteristics",[1034],"Consumable Product ID has a price defined in the Cost section (in USD).The product can be purchased multiple times by the same user.Consumable Product ID includes purchase and revenue tracking.Both Cost and Customs fields are required.Consumable Product ID must be linked to at least one In-app Product ID Context. Consumable Product ID can be used in the following campaign types: In-appIn-app LTOMixedMixed LTOA/B test campaigns for the campaign types listed above",{"id":11012,"title":10903,"titles":11013,"content":467,"level":1104},"/native-elements/consumable-product-id#required-fields",[1034],{"id":11015,"title":1304,"titles":11016,"content":11017,"level":1120},"/native-elements/consumable-product-id#name",[1034,10903],"The Name field is defined by the person configuring campaigns and must exactly match the Product ID created in the app stores (App Store / Google Play). Used in analytics and reports as a Product ID filter.Must be identical to the store product identifier. Example: gp_hint_single_1",{"id":11019,"title":10868,"titles":11020,"content":11021,"level":1120},"/native-elements/consumable-product-id#human-readable-name",[1034,10903],"The Human-readable name is used only inside the system for convenience. Recommendation: use the same value as in Name.A more descriptive name may be used if additional clarification is needed.This field does not appear in analytics or reports. Examples:Name: gp_hint_single_1Human-readable name: gp_hint_single_1orName: gp_hint_single_1Human-readable name: Single Hint Pack ($0.99)",{"id":11023,"title":10915,"titles":11024,"content":11025,"level":1120},"/native-elements/consumable-product-id#cost",[1034,10903],"The Cost field is required for Consumable Product ID. Defines the product price in USD.Must match the price configured for the product in the app stores.Used for purchase validation and revenue analytics. If the Cost field is not set, the product cannot be saved.",{"id":11027,"title":10920,"titles":11028,"content":11029,"level":1120},"/native-elements/consumable-product-id#customs",[1034,10903],"The Customs field is required for Consumable Product ID and defines the product’s default context. Specifies what and in what quantity is granted to the user after purchase.Must be provided as a JSON object.The JSON structure must match the In-app Product ID Creative structure for the application.Only one default context is allowed per product. Example:{\n\n\"items\": [\n\n{\n\n\"bonus\": \"hint\",\n\n\"count\": 5\n\n}\n\n]\n\n}",{"id":11031,"title":10925,"titles":11032,"content":11033,"level":1120},"/native-elements/consumable-product-id#customs-behavior",[1034,10903],"The default context defined in Customs is used when: a purchase is completed using a promo code;a purchase is completed directly inside the application;the purchase flow is interrupted or cannot be resolved via a campaign context. Consumable and Non-consumable Product IDs must not have empty Customs. If, at the time of product creation, you do not yet know the final JSON structure, you may enable the Confirm empty option. In this case, the product will be saved with an empty JSON in the Customs field. Important: before releasing the product to real users, make sure to fill the Customs field with a valid JSON context. Using a Consumable or Non-consumable Product ID with an empty Customs field may lead to incorrect purchase behavior.",{"id":11035,"title":10930,"titles":11036,"content":11037,"level":1104},"/native-elements/consumable-product-id#in-app-product-id-context",[1034],"Each Consumable Product ID must be associated with at least one In-app Product ID Context. Defines what and in what quantity is granted to the user for a purchase.A single Consumable Product ID may have multiple In-app Product ID Contexts.Contexts are used in campaign logic. More details are available in the Product ID Context article.",{"id":11039,"title":10935,"titles":11040,"content":11041,"level":1104},"/native-elements/consumable-product-id#final-step",[1034],"Click Save to create the Consumable Product ID. Once created, the Consumable Product ID can be used in In-app, In-app LTO, Mixed, and Mixed LTO campaigns, as well as A/B test campaigns for these campaign types, and will be available in analytics and reports as a Product ID filter. html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"id":1039,"title":1038,"titles":11043,"content":11044,"level":1110},[],"Cross-promo Product ID is a Native element used for cross-promotion and for running Mixed and Mixed A/B test campaigns with cross-promo tracking. Cross-promo Product ID is a Native element that represents a product identifier used for cross-promotion mechanics. It is applied in campaigns where users are redirected or promoted to another application or product within the ecosystem (cross-promotion), typically via creatives. This element does not represent an in-app purchase and does not include any purchase or payment logic. Cross-promo Product IDs are created directly in Magify and do not require setup in app stores or external systems. You can see an example of a created Cross-promo Product ID in the demo application here.",{"id":11046,"title":10840,"titles":11047,"content":11048,"level":1104},"/native-elements/cross-promo-product-id#key-characteristics",[1038],"Cross-promo Product ID is used for cross-promo interactions.The element does not include pricing or payment logic.Cross-promo Product ID must be linked to a Cross-promo Product ID Context.A default context is not required. Cross-promo Product ID can be used only in the following campaign types: MixedMixed A/B test campaigns",{"id":11050,"title":10968,"titles":11051,"content":467,"level":1104},"/native-elements/cross-promo-product-id#naming-rules",[1038],{"id":11053,"title":1304,"titles":11054,"content":11055,"level":1120},"/native-elements/cross-promo-product-id#name",[1038,10968],"Defined by the person configuring campaigns.Does not affect application behavior.Used only in analytics and reports as a Product ID filter.Recommended to follow a consistent Product ID naming style. Example: cp_demo_2_id",{"id":11057,"title":10868,"titles":11058,"content":11059,"level":1120},"/native-elements/cross-promo-product-id#human-readable-name",[1038,10968],"Used only inside the system for convenience.Recommendation: use the same value as in Name.A more descriptive name may be used if additional clarification is needed.Does not appear in analytics or reports. Examples:Name: cp_demo_idHuman-readable name: cp_demo_idorName: cp_demo_idHuman-readable name: Cross-promo Demo IDUsed to represent cross-promotion from your application to another application in the ecosystem.",{"id":11061,"title":10980,"titles":11062,"content":11063,"level":1104},"/native-elements/cross-promo-product-id#product-id-context",[1038],"Each Cross-promo Product ID must be associated with a Cross-promo Product ID Context. The context is used in creatives and campaign logic.It defines cross-promo behavior and the target application or destination.A default context is not required. More details about contexts and creatives will be available in the Product ID Context article.",{"id":11065,"title":11066,"titles":11067,"content":11068,"level":1104},"/native-elements/cross-promo-product-id#how-to-create-a-cross-promo-product-id","How to create a Cross-promo Product ID",[1038],"Go to Configuration > Native elements > Create new.In the creation form:\nSelect the target Application.Enter Name following the recommended naming rules.Enter Human-readable name.Set Native element type to Cross-promo Product ID.Configure the required Cross-promo Product ID Context.",{"id":11070,"title":10952,"titles":11071,"content":11072,"level":1104},"/native-elements/cross-promo-product-id#optional-fields",[1038],"Default image You may upload an image for reference or documentation purposes. This field is optional and does not affect campaign behavior.StatusDefault value: Active.If the Cross-promo Product ID is no longer needed, you can change the status to Archived. Once archived, it cannot be used in campaigns or restored. To use it again, you must create a new Cross-promo Product ID with a unique name.",{"id":11074,"title":10935,"titles":11075,"content":11076,"level":1104},"/native-elements/cross-promo-product-id#final-step",[1038],"Click Save to create the Cross-promo Product ID. Once created, the Cross-promo Product ID can be used in Mixed and Mixed A/B test campaigns and will be available in analytics and reports as a Product ID filter.",{"id":1043,"title":1042,"titles":11078,"content":11079,"level":1110},[],"Deeplink Product ID is a Native element that represents a product identifier used in Mixed campaigns and Mixed A/B test campaigns, where user interaction is handled via deeplinks. Deeplink Product ID is a Native element used in Mixed campaigns and Mixed A/B test campaigns to identify products and handle internal user navigation via deeplinks. Deeplinks allow navigating users inside the application, such as opening a specific screen, switching between modes, or navigating to a particular section. Deeplink Product ID does not represent an in-app purchase and does not include any purchase logic. It is created directly in Magify, does not require setup in app stores or external systems, and is used for campaign configuration and analytics. You can see an example of a created Deeplink Product ID in the demo application here.",{"id":11081,"title":10840,"titles":11082,"content":11083,"level":1104},"/native-elements/deeplink-product-id#key-characteristics",[1042],"Deeplink Product ID is used only in Mixed campaigns.It is also supported in Mixed A/B test campaigns.Deeplinks are used for internal user navigation within the application.The element does not include pricing or payment logic.Deeplink Product ID must be linked to a Deeplink Product ID Context.A default context is not required.",{"id":11085,"title":10968,"titles":11086,"content":467,"level":1104},"/native-elements/deeplink-product-id#naming-rules",[1042],{"id":11088,"title":1304,"titles":11089,"content":11090,"level":1120},"/native-elements/deeplink-product-id#name",[1042,10968],"The Name field is defined by the person configuring campaigns. The value does not affect application behavior.It is used only in analytics and reports as a Product ID filter.It is recommended to follow the same naming style as Consumable Product ID. Example: deeplink_christmas_mode_id",{"id":11092,"title":10868,"titles":11093,"content":11094,"level":1120},"/native-elements/deeplink-product-id#human-readable-name",[1042,10968],"The Human-readable name is used only inside the system for convenience. Recommendation: use the same value as in Name.A more descriptive name may be used if additional clarification is needed.This field does not appear in analytics or reports.",{"id":11096,"title":10980,"titles":11097,"content":11098,"level":1104},"/native-elements/deeplink-product-id#product-id-context",[1042],"Each Deeplink Product ID must be associated with a Deeplink Product ID Context. The context is used in creatives and Mixed campaign logic.It defines which screen, mode, or section of the application the deeplink opens.A default context is not required. More details about contexts and creatives will be available in the Product ID Context article.",{"id":11100,"title":11101,"titles":11102,"content":11103,"level":1104},"/native-elements/deeplink-product-id#how-to-create-a-deeplink-product-id","How to create a Deeplink Product ID",[1042],"Go to Configuration > Native elements > Create new.In the creation form:\nSelect the target Application.Enter Name following the recommended naming rules.Enter Human-readable name.Set Native element type to Deeplink Product ID.Configure the required Deeplink Product ID Context.",{"id":11105,"title":10952,"titles":11106,"content":11107,"level":1104},"/native-elements/deeplink-product-id#optional-fields",[1042],"Default image You may upload an image for reference or documentation purposes. This field is optional and does not affect campaign behavior.StatusDefault value: Active.If the Deeplink Product ID is no longer needed, you can change the status to Archived. Once archived, it cannot be used in campaigns or restored. To use it again, you must create a new Deeplink Product ID with a unique name.",{"id":11109,"title":10935,"titles":11110,"content":11111,"level":1104},"/native-elements/deeplink-product-id#final-step",[1042],"Click Save to create the Deeplink Product ID. Once created, the Deeplink Product ID can be used in Mixed campaigns and Mixed A/B test campaigns to navigate users within the application and will be available in analytics and reports as a Product ID filter.",{"id":1047,"title":1046,"titles":11113,"content":11114,"level":1110},[],"Event is a Native element representing an application event and used to trigger campaigns with configurable counters and parameters. Event represents any user event in the application, such as application launch, level completion, screen transitions, button clicks, and other interactions. An Event defines a point in the application where a campaign can be attached and triggered. Events can be used with any campaign type except Banner, and support configurable counters and parameters that control campaign behavior. You can see an example of an Event used in the demo application here.",{"id":11116,"title":10840,"titles":11117,"content":11118,"level":1104},"/native-elements/event#key-characteristics",[1046],"An Event represents a specific action or state change in the application.Events can be used with all campaign types except Banner.Events support counters and parameters, which define how often and under what conditions campaigns are triggered. Additional documentation: Event Counters — article will be available soonEvent Parameters — article will be available soon",{"id":11120,"title":11121,"titles":11122,"content":11123,"level":1104},"/native-elements/event#how-to-create-an-event","How to create an Event",[1046],"Go to Configuration > Native elements > Create new.In the creation form:\nSelect the target Application.Enter Name.\nUse snake_case or another format supported by your project.The value must exactly match the identifier used in the application code so the event is correctly triggered.Enter Human-readable name.\nRecommendation: use the same value as in Name for consistency.Set Native element type to Event.",{"id":11125,"title":10952,"titles":11126,"content":11127,"level":1104},"/native-elements/event#optional-fields",[1046],"Parameters You can define parameters that will be passed together with the event and used in campaign logic. Supported parameter types include:\nStringBooleanDateTimeDateIntegerFloatChoiceArrayInt Counter\nParameters allow campaigns to react to event context and user state in a flexible way.Default image You may upload an image for reference or documentation purposes. This field is optional and does not affect event behavior.StatusDefault value: Active.If the event is no longer needed, you can change the status to Archived. Once archived, the event cannot be used in campaigns or restored. To use the event again, you must create a new one with a unique name.",{"id":11129,"title":10935,"titles":11130,"content":11131,"level":1104},"/native-elements/event#final-step",[1046],"Click Save to create the Event. Once created, the Event can be used to attach and trigger campaigns according to its configured counters and parameters.",{"id":1051,"title":1050,"titles":11133,"content":11134,"level":1110},[],"External Product ID is a Native element used for external links and for running Mixed and Mixed A/B test campaigns with link tracking. External Product ID is a Native element used for external links in campaigns where users are redirected outside the application, such as to a store, website, or third-party service. External Product ID does not represent an in-app purchase and does not include any purchase logic. It is created directly in Magify, does not require setup in app stores or external systems, and is used for campaign configuration, analytics, and tracking external link redirects. You can see an example of a created External Product ID in the demo application here.",{"id":11136,"title":10840,"titles":11137,"content":11138,"level":1104},"/native-elements/external-product-id#key-characteristics",[1050],"External Product ID is used for external link interactions.The element does not include pricing or payment logic.External Product ID must be linked to an External Product ID Context.A default context is not required. External Product ID can be used in the following campaign types: MixedA/B test campaigns for the campaign types listed above",{"id":11140,"title":10968,"titles":11141,"content":467,"level":1104},"/native-elements/external-product-id#naming-rules",[1050],{"id":11143,"title":1304,"titles":11144,"content":11145,"level":1120},"/native-elements/external-product-id#name",[1050,10968],"The Name field is defined by the person configuring campaigns. The value does not affect application behavior.It is used only in analytics and reports as a Product ID filter.It is recommended to follow the same naming style as Consumable Product ID. Example: external_store_link_id",{"id":11147,"title":10868,"titles":11148,"content":11149,"level":1120},"/native-elements/external-product-id#human-readable-name",[1050,10968],"The Human-readable name is used only inside the system for convenience. Recommendation: use the same value as in Name.A more descriptive name may be used if additional clarification is needed.This field does not appear in analytics or reports. Examples:Name: external_store_link_idHuman-readable name: external_store_link_idorName: external_store_link_idHuman-readable name: Store Page Link",{"id":11151,"title":10980,"titles":11152,"content":11153,"level":1104},"/native-elements/external-product-id#product-id-context",[1050],"Each External Product ID must be associated with an External Product ID Context. The context is used in creatives and campaign logic.It defines which external destination the link leads to.A default context is not required. More details about contexts and creatives will be available in the Product ID Context article.",{"id":11155,"title":11156,"titles":11157,"content":11158,"level":1104},"/native-elements/external-product-id#how-to-create-an-external-product-id","How to create an External Product ID",[1050],"Go to Configuration > Native elements > Create new.In the creation form:\nSelect the target Application.Enter Name following the recommended naming rules.Enter Human-readable name.Set Native element type to External Product ID.Configure the required External Product ID Context.",{"id":11160,"title":10952,"titles":11161,"content":11162,"level":1104},"/native-elements/external-product-id#optional-fields",[1050],"Default image You may upload an image for reference or documentation purposes. This field is optional and does not affect campaign behavior.StatusDefault value: Active.If the External Product ID is no longer needed, you can change the status to Archived. Once archived, it cannot be used in campaigns or restored. To use it again, you must create a new External Product ID with a unique name.",{"id":11164,"title":10935,"titles":11165,"content":11166,"level":1104},"/native-elements/external-product-id#final-step",[1050],"Click Save to create the External Product ID. Once created, the External Product ID can be used in Mixed and Mixed A/B test campaigns and will be available in analytics and reports as a Product ID filter.",{"id":1055,"title":1054,"titles":11168,"content":11169,"level":1110},[],"A step-by-step guide to automatically importing in-app products (SKUs) from Google Play into Magify using the inappproducts.list API method, including service account setup, permissions, and context configuration.",{"id":11171,"title":4180,"titles":11172,"content":11173,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#overview",[1054],"To effectively manage in-app monetization, subscriptions, and promotional campaigns for Android apps, it's essential to maintain an up-to-date list of all in-app products (SKUs) published in Google Play Console. These may include in-app products (one-time purchases) and subscriptions (recurring payments). While it's possible to manually enter products into Magify, this quickly becomes inefficient when: The number of products is largeProducts are frequently updatedAccuracy and time savings are important To streamline the process, Magify supports automated product import using two Google Play Developer API methods: inappproducts.list — for in-app productsmonetization.subscriptions.list — for subscriptions Note: Automatic synchronization of price or metadata changes is not yet implemented and will be introduced in future versions.",{"id":11175,"title":11176,"titles":11177,"content":11178,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#key-benefits","Key Benefits",[1054,4180],"Full coverage of all active and inactive in-app products and subscriptionsNo manual entry — the entire product catalog is imported automaticallyReduced workload for marketing, product, and configuration teams Once imported, you can: Define reward parameters (Customs)Configure product usage context, visuals, and campaign logic",{"id":11180,"title":11181,"titles":11182,"content":11183,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#before-you-start-complete-your-organization-address-one-time-setup","Before You Start: Complete Your Organization Address (One-Time Setup)",[1054],"Before importing in-app products from Google Play or the App Store for the first time, you must complete your organization address once. This is required for correct validation of the JSON received from the store. If any mandatory field is missing, the import process will fail.",{"id":11185,"title":11186,"titles":11187,"content":11188,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#step-1-open-organization-settings","Step 1. Open Organization Settings",[1054,11181],"In the top-right corner of the Magify dashboard, click the user menu icon.Select Setting.Go to Organization address.Click Edit.",{"id":11190,"title":11191,"titles":11192,"content":11193,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#step-2-fill-in-all-required-fields","Step 2. Fill in All Required Fields",[1054,11181],"Make sure to fill in all fields marked with a red asterisk (*), including: Street addressCountryCityZip or postal code Optional fields may be filled in as needed.",{"id":11195,"title":11196,"titles":11197,"content":11198,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#step-3-save-your-changes","Step 3. Save Your Changes",[1054,11181],"After completing all required fields, click Save. This step needs to be done only once. You do not need to repeat it before each import (unless you want to update your address later).",{"id":11200,"title":6054,"titles":11201,"content":467,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#requirements",[1054],{"id":11203,"title":11204,"titles":11205,"content":11206,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#google-play-console-access","Google Play Console Access",[1054,6054],"You must have Admin access to Google Play ConsoleYour app must already contain products under: Google Play Console > Your App > Monetize with Play > Products > In-app Products and Subscriptions These products will be fetched via API.",{"id":11208,"title":11209,"titles":11210,"content":11211,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#google-cloud-project-access","Google Cloud Project Access",[1054,6054],"A project in Google Cloud must be availableYou must have permissions to:\nEnable APIsCreate and manage service accountsGenerate authentication keys",{"id":11213,"title":11214,"titles":11215,"content":11216,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#app-bundle-id-must-be-correct","App Bundle ID Must Be Correct",[1054,6054],"Important: Ensure that the correct Bundle ID (also known as package name) is specified for your Android app in Magify. The Google Play Developer API retrieves in-app products based on this identifier. If the Bundle ID does not match the app registered in Google Play Console, product import will fail, and the list may be empty or return errors. Magify also uses the Bundle ID to correctly associate imported products with in-app creatives, contexts, and campaign logic.",{"id":11218,"title":11219,"titles":11220,"content":11221,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#setting-up-the-google-cloud-project","Setting Up the Google Cloud Project",[1054],"Go to Google Cloud Console.In the top navigation bar, either select an existing project or click New project. If creating a new project, enter a name and click Create. Make sure the correct project is selected before continuing with API setup. In the left-hand sidebar, navigate to APIs & Services > Enabled APIs & services. In the top bar, click + Enable APIs and services. In the API Library, search for Google Play Android Developer API.Select the API and click Enable.",{"id":11223,"title":11224,"titles":11225,"content":11226,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#creating-a-service-account","Creating a Service Account",[1054],"Go to IAM & Admin > Service Accounts Click Create Service Account.Enter a name (e.g., iap-sync-bot) and optional description.Click Create and Continue.Assign the Editor role.Click Done.",{"id":11228,"title":11229,"titles":11230,"content":11231,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#generating-the-json-key","Generating the JSON Key",[1054],"Go to IAM & Admin > Service AccountsFind the service account you just createdClick the menu icon (⋮) and select Manage Keys Under the Keys tab, click Add key > Create new key. Select JSON formatClick Create — a .json key file will be downloaded Send this .json file to the Magify team. It’s required for API authentication and product import.",{"id":11233,"title":11234,"titles":11235,"content":11236,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#granting-access-in-google-play-console","Granting Access in Google Play Console",[1054],"After creating the service account and generating the key, you need to grant it access through the Google Play Console and assign the appropriate permissions. Go to Google Play Console and sign in with an account that has admin rights.Navigate to Users and Permissions.Click Invite new user. Paste the client_email from the .json file. Under Permissions, assign the Store Presence role. In the App access section, select specific apps the service account should access, or grant access to all apps.Click Invite user to send the invitation and complete the setup.",{"id":11238,"title":11239,"titles":11240,"content":11241,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#how-magify-uses-the-api","How Magify Uses the API",[1054],"Magify uses two official Google Play Developer API methods to import product data: inappproducts.list — for in-app productsmonetization.subscriptions.list — for subscriptions The system calls both endpoints every 300 seconds (5 minutes) to retrieve product data. Imported fields include: productId — unique SKU, used as both key and product namedefaultPrice — price for the US region (always returned in USD) All in-app products are currently imported as consumable, and subscriptions are imported as subscriptions. To add non-consumable products, you must enter them manually in the Magify interface.Support for automatic import of other product types will be added in future updates.Reminder: This integration does not yet support syncing price or status changes from Google Play. Changes must be updated manually in Magify if needed.",{"id":11243,"title":11244,"titles":11245,"content":467,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#next-steps-in-magify","Next Steps in Magify",[1054],{"id":11247,"title":11248,"titles":11249,"content":11250,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#step-1-define-customs","Step 1: Define Customs",[1054,11244],"Path: Magify > Configuration > Remote Config > Native Elements In the list of imported products, fill in the Customs field — define what the user receives after purchase (e.g., 500 coins, resource pack)Each product must have a default context configured inside the Native Element The default context is used when: The product is purchased via a promo codeThe user purchases from the store page and completes the transaction in-appThe purchase process is interrupted or incomplete The default context must follow the same JSON structure as the Product ID Context for the same app.Only one default context is allowed per product.",{"id":11252,"title":11253,"titles":11254,"content":11255,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api#step-2-set-up-product-id-context","Step 2: Set Up Product ID Context",[1054,11244],"Path: Magify > Configuration > Remote Config > Product ID Context > Create New For each product: Select the Product ID — choose the appropriate product from the dropdown list.Choose the Type:\nIn-App Product ID Context for consumables and non-consumablesSubscription Product ID Context for subscriptionsDefine Customs — visuals, discounts, and reward logic This configuration controls how the product is displayed to users, integrated into promotions, and interpreted by Magify's campaign logic.",{"id":11257,"title":11258,"titles":11259,"content":11260,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api#using-imported-products-in-campaigns","Using Imported Products in Campaigns",[1054],"Once products and contexts are configured in Remote Config, they’re available throughout the system — including in campaign setup and delivery. You can now: Reference imported products when building offer logicUse contexts to control targeting and visualsDynamically apply pricing, visuals, and reward parameters This setup ensures your campaigns are always connected to accurate and validated product data from Google Play, with full automation and minimal manual effort. Your integration is complete. Your product catalog is now ready to power scalable monetization and promotional campaigns across Magify.",{"id":1058,"title":1054,"titles":11262,"content":11169,"level":1110},[],{"id":11264,"title":4180,"titles":11265,"content":11173,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#overview",[1054],{"id":11267,"title":11176,"titles":11268,"content":11178,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#key-benefits",[1054,4180],{"id":11270,"title":11181,"titles":11271,"content":11183,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#before-you-start-complete-your-organization-address-one-time-setup",[1054],{"id":11273,"title":11186,"titles":11274,"content":11188,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#step-1-open-organization-settings",[1054,11181],{"id":11276,"title":11191,"titles":11277,"content":11193,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#step-2-fill-in-all-required-fields",[1054,11181],{"id":11279,"title":11196,"titles":11280,"content":11198,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#step-3-save-your-changes",[1054,11181],{"id":11282,"title":6054,"titles":11283,"content":467,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#requirements",[1054],{"id":11285,"title":11204,"titles":11286,"content":11206,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#google-play-console-access",[1054,6054],{"id":11288,"title":11209,"titles":11289,"content":11211,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#google-cloud-project-access",[1054,6054],{"id":11291,"title":11214,"titles":11292,"content":11216,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#app-bundle-id-must-be-correct",[1054,6054],{"id":11294,"title":11219,"titles":11295,"content":11221,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#setting-up-the-google-cloud-project",[1054],{"id":11297,"title":11224,"titles":11298,"content":11226,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#creating-a-service-account",[1054],{"id":11300,"title":11229,"titles":11301,"content":11231,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#generating-the-json-key",[1054],{"id":11303,"title":11234,"titles":11304,"content":11236,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#granting-access-in-google-play-console",[1054],{"id":11306,"title":11239,"titles":11307,"content":11308,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#how-magify-uses-the-api",[1054],"Magify uses two official Google Play Developer API methods to import product data: inappproducts.list — for in-app productsmonetization.subscriptions.list — for subscriptions The system calls both endpoints every 300 seconds (5 minutes) to retrieve product data. Imported fields include: productId — unique SKU, used as both key and product namedefaultPrice — price for the US region (always returned in USD) All in-app products are currently imported as consumable, and subscriptions are imported as subscriptions. To add non-consumable products, you must enter them manually in the Magify interface.If you need to change the product type from consumable to non-consumable, please contact our support team and specify which products should be updated.Support for automatic import of other product types will be added in future updates.Reminder: This integration does not yet support syncing price or status changes from Google Play. Changes must be updated manually in Magify if needed.",{"id":11310,"title":11244,"titles":11311,"content":467,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#next-steps-in-magify",[1054],{"id":11313,"title":11248,"titles":11314,"content":11250,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#step-1-define-customs",[1054,11244],{"id":11316,"title":11253,"titles":11317,"content":11255,"level":1120},"/native-elements/importing-in-app-products-from-google-play-via-api-new#step-2-set-up-product-id-context",[1054,11244],{"id":11319,"title":11258,"titles":11320,"content":11260,"level":1104},"/native-elements/importing-in-app-products-from-google-play-via-api-new#using-imported-products-in-campaigns",[1054],{"id":1062,"title":1061,"titles":11322,"content":11323,"level":1110},[],"A step-by-step guide to automatically importing in-app products (SKUs) from the App Store into Magify using Apple’s App Store Connect API, including key generation, permission setup, and context configuration.",{"id":11325,"title":4180,"titles":11326,"content":11327,"level":1104},"/native-elements/importing-in-app-products-from-the-app-store-via-api#overview",[1061],"To effectively manage monetization, subscriptions, and promotional campaigns in iOS apps, it’s important to maintain an up-to-date list of all in-app products (SKUs) published in App Store Connect. These may include consumable and non-consumable purchases, as well as subscriptions. Although products can be entered manually into Magify, this approach quickly becomes inefficient when: There are many productsProducts are frequently updatedReducing manual effort and improving accuracy is important To streamline the process, Magify supports automated product import using the App Store Connect API, specifically the /v1/inAppPurchases endpoint and related methods.",{"id":11329,"title":11330,"titles":11331,"content":11332,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#key-benefits","Key benefits",[1061,4180],"Full import of all active App Store in-app productsAutomatic syncing of new and updated SKUsReduced workload for marketing, product, and configuration teamsData is refreshed regularly through API polling After import, you can: Define custom reward parameters the user receives after purchaseConfigure how each product is displayed and used in campaigns",{"id":11334,"title":11181,"titles":11335,"content":11183,"level":1104},"/native-elements/importing-in-app-products-from-the-app-store-via-api#before-you-start-complete-your-organization-address-one-time-setup",[1061],{"id":11337,"title":11186,"titles":11338,"content":11188,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#step-1-open-organization-settings",[1061,11181],{"id":11340,"title":11191,"titles":11341,"content":11193,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#step-2-fill-in-all-required-fields",[1061,11181],{"id":11343,"title":11196,"titles":11344,"content":11198,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#step-3-save-your-changes",[1061,11181],{"id":11346,"title":6054,"titles":11347,"content":11348,"level":1104},"/native-elements/importing-in-app-products-from-the-app-store-via-api#requirements",[1061],"To proceed with importing products, ensure that you have the following:",{"id":11350,"title":11351,"titles":11352,"content":11353,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#access-to-app-store-connect","Access to App Store Connect",[1061,6054],"Admin or App Manager role in App Store ConnectProducts already created in the app with status Ready for Sale or In Review (Drafts will be skipped if required metadata, such as price or localization, is missing)",{"id":11355,"title":11356,"titles":11357,"content":11358,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#app-store-connect-api-key","App Store Connect API Key",[1061,6054],"You’ll need: Issuer IDKey IDPrivate key (.p8 file) Create a key under: Users and Access > Keys > App Store Connect API > Generate API Key",{"id":11360,"title":11361,"titles":11362,"content":11363,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#app-store-app-id-must-be-correct","App Store App ID Must Be Correct",[1061,6054],"Important: Ensure that the correct App Store App ID (associated with your app in App Store Connect) is specified in Magify. The App Store Connect API retrieves in-app purchases based on this application ID. If the ID is incorrect or does not match the app linked to your API key, the import will fail or return incomplete results. This ID is also used in Magify to map imported products to remote configuration, creatives, and campaign logic.",{"id":11365,"title":11366,"titles":11367,"content":11368,"level":1104},"/native-elements/importing-in-app-products-from-the-app-store-via-api#how-to-generate-and-manage-api-keys","How to Generate and Manage API Keys",[1061],"Log into App Store Connect.In the top menu, go to the Users and Access section. Open the Integrations tab.In the sidebar, select Keys > App Store Connect API.Click the + icon under the Active section. Enter a name (e.g., iap-sync-key), select the appropriate role (App Manager or Developer), and click Generate. Download the .p8 private key — it can only be downloaded once. Use the Issuer ID, Key ID, and private key to generate a JWT for authenticating with the API. Contact the Magify team and provide the following credentials:Issuer IDKey IDThe downloaded .p8 private key file\nThese credentials are required to authenticate requests to the App Store Connect API and enable automated syncing of your in-app product catalog.",{"id":11370,"title":11239,"titles":11371,"content":11372,"level":1104},"/native-elements/importing-in-app-products-from-the-app-store-via-api#how-magify-uses-the-api",[1061],"Once connected, Magify polls the App Store Connect API every 300 seconds (5 minutes) to: Detect newly added productsUpdate pricing and metadata For each product, Magify imports: productId — the unique product identifier (SKU), used as both product key and display nameinAppPurchaseType — the product type: CONSUMABLE, NON_CONSUMABLE, or AUTO_RENEWABLE_SUBSCRIPTIONprice — the default price for the U.S. region (returned in USD) Only products with statuses In Review and Ready for Sale are imported. Drafts will be skipped if required metadata is missing. Unlike Google Play, the App Store Connect API explicitly provides inAppPurchaseType, allowing for accurate classification. Magify uses this field to accurately classify products as consumable, non-consumable, or subscription.",{"id":11374,"title":11375,"titles":11376,"content":11377,"level":1104},"/native-elements/importing-in-app-products-from-the-app-store-via-api#configuring-products-in-magify","Configuring Products in Magify",[1061],"After import, additional configuration is required to enable product usage in campaigns:",{"id":11379,"title":11248,"titles":11380,"content":11381,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#step-1-define-customs",[1061,11375],"Path: Magify > Configuration > Remote Config > Native Elements In the list of imported products, fill in the Customs field — specify what the user receives after purchase (e.g., 500 coins)Each consumable or non-consumable product must have a default context set directly within the Native ElementMagify uses this default context when:\nA promo code is redeemedAn offer is launched from the store pageThe purchase flow is interrupted or completed outside the standard in-app flow The default context must follow the same JSON structure as the Product ID Context used for the same app. Each product can have only one default context.",{"id":11383,"title":11384,"titles":11385,"content":11255,"level":1120},"/native-elements/importing-in-app-products-from-the-app-store-via-api#step-2-set-up-product-usage-context","Step 2: Set Up Product Usage Context",[1061,11375],{"id":11387,"title":11258,"titles":11388,"content":11389,"level":1104},"/native-elements/importing-in-app-products-from-the-app-store-via-api#using-imported-products-in-campaigns",[1061],"Once products and contexts are configured, they become available across the system. You can: Reference imported products directly in campaign logicControl how products appear in offersDynamically manage visuals, pricing, and rewards This setup ensures your campaigns stay linked to up-to-date, validated product data from App Store Connect — with full automation and minimal manual work. Your integration is now complete. Products are automatically synced and ready to support scalable monetization and promotions in Magify.",{"id":1066,"title":1065,"titles":11391,"content":11392,"level":1110},[],"Rewarded Product ID is a Native element used to configure rewards for ad views and to run Rewarded and Mixed campaigns.",{"id":11394,"title":11395,"titles":11396,"content":11397,"level":1104},"/native-elements/rewarded-product-id#what-is-rewarded-product-id","What is Rewarded Product ID",[1065],"Rewarded Product ID is a Native element that represents a reward product identifier granted to users after watching a rewarded advertisement. It is used in scenarios where users receive a reward (such as hints, currency, or bonuses) upon successful completion of a rewarded ad.",{"id":11399,"title":10840,"titles":11400,"content":11401,"level":1104},"/native-elements/rewarded-product-id#key-characteristics",[1065],"Rewarded Product ID does not represent an in-app purchase and contains no payment logic.It does not include pricing.Used for:\nrewarded campaign logic;reward granting mechanics;analytics and Product ID–based filtering.Does not need to be created in app stores.Rewarded Product ID must be linked to a Rewarded Product ID Context.A default context is not required for the Rewarded Product ID itself.A default context is required for the Rewarded Product ID Context, as it defines the reward.",{"id":11403,"title":10845,"titles":11404,"content":11405,"level":1104},"/native-elements/rewarded-product-id#supported-campaigns",[1065],"Rewarded Product ID can be used only in the following campaign types: RewardedRewarded LTOMixedMixed LTOA/B test campaigns for the listed types",{"id":11407,"title":10850,"titles":11408,"content":11409,"level":1104},"/native-elements/rewarded-product-id#usage-example",[1065],"Example Rewarded Product ID:reward_hint_id This product can be used to grant a hint to the user after watching a rewarded ad. You can see an example of a created Rewarded Product ID in the demo application here.",{"id":11411,"title":11412,"titles":11413,"content":11414,"level":1104},"/native-elements/rewarded-product-id#how-to-create-a-rewarded-product-id","How to create a Rewarded Product ID",[1065],"How to find it: Configuration > Remote Config > Native elements Creation steps Click Create new.Fill in the creation form:",{"id":11416,"title":1328,"titles":11417,"content":11418,"level":1120},"/native-elements/rewarded-product-id#application",[1065,11412],"Select the application the Rewarded Product ID belongs to.",{"id":11420,"title":1304,"titles":11421,"content":11422,"level":1120},"/native-elements/rewarded-product-id#name",[1065,11412],"A unique product identifier used only in analytics and reports as a Product ID filter. Recommended example:reward_hint_id",{"id":11424,"title":10868,"titles":11425,"content":11426,"level":1120},"/native-elements/rewarded-product-id#human-readable-name",[1065,11412],"An internal name used only inside the system. Not included in analytics. Recommended to use the same value as Name or provide a clearer internal description if needed. Examples:Name: reward_hint_idHuman-readable name: reward_hint_idorName: reward_hint_idHuman-readable name: RW 1 HINT ID",{"id":11428,"title":10873,"titles":11429,"content":11430,"level":1120},"/native-elements/rewarded-product-id#native-element-type",[1065,11412],"Select Rewarded Product ID.",{"id":11432,"title":10920,"titles":11433,"content":11434,"level":1120},"/native-elements/rewarded-product-id#customs",[1065,11412],"The Customs field does not need to be filled for Rewarded Product ID. The reward is defined in the Rewarded Product ID Context, which is used to grant the reward to the user. Therefore, for Rewarded Product ID, you should enable the Confirm empty option in the Customs field and save the product with an empty value.",{"id":11436,"title":11437,"titles":11438,"content":11439,"level":1120},"/native-elements/rewarded-product-id#rewarded-product-id-context","Rewarded Product ID Context",[1065,11412],"Each Rewarded Product ID must be associated with a Rewarded Product ID Context. The Rewarded Product ID Context is not selected on the Rewarded Product ID creation page. Contexts are configured separately and are used in campaigns, where they are applied together with the Rewarded Product ID. The context defines what reward the user receives in rewarded campaign logic. A default context is required for the Rewarded Product ID Context. More details will be available in the Product ID Context article (coming soon).",{"id":11441,"title":10952,"titles":11442,"content":11443,"level":1120},"/native-elements/rewarded-product-id#optional-fields",[1065,11412],"Default image Optional. Used for reference or documentation purposes only. Status Default value — Active.If the product is no longer needed, it can be set to Archived.Once archived, it cannot be used in campaigns or restored.To use it again, create a new Rewarded Product ID with a unique name.",{"id":11445,"title":4245,"titles":11446,"content":11447,"level":1104},"/native-elements/rewarded-product-id#summary",[1065],"Rewarded Product ID is designed for rewarded ad scenarios and allows you to configure reward logic and analytics in Rewarded, Mixed, and LTO campaigns without involving purchase flows.",{"id":1070,"title":1069,"titles":11449,"content":11450,"level":1110},[],"Spot is a Native element that defines a placement in the application UI for displaying LTO badges and running LTO campaigns. Spot represents a dedicated place in the application interface used to display an LTO (Limited-Time Offer) badge. A Spot defines where an LTO badge can appear in the app and serves as an attachment point for LTO campaigns. A single LTO campaign can be configured to use multiple Spots, and at the same time multiple campaigns can be assigned to a single Spot. You can see an example of a created Spot in the demo application here.",{"id":11452,"title":10840,"titles":11453,"content":11454,"level":1104},"/native-elements/spot#key-characteristics",[1069],"A Spot represents a placement for displaying an LTO badge in the application UI.One LTO campaign can be associated with multiple Spots.One Spot can be associated with multiple LTO campaigns.Spot is compatible with all types of LTO campaigns.Spot does not contain display logic itself and is used as a binding point for campaigns.",{"id":11456,"title":11457,"titles":11458,"content":11459,"level":1104},"/native-elements/spot#how-to-create-a-spot","How to create a Spot",[1069],"Go to Configuration > Native elements > Create new.In the creation form:\nSelect the target Application.Enter Name.\nUse snake_case or another format supported by your project.The value must exactly match the identifier used in the application code so the Spot is correctly triggered.Enter Human-readable name.\nRecommendation: use the same value as in Name for consistency.Set Native element type to Spot.",{"id":11461,"title":10952,"titles":11462,"content":11463,"level":1104},"/native-elements/spot#optional-fields",[1069],"Default image You may upload an image showing how the Spot or LTO badge appears in the application UI. This is typically used for reference and visual context. The field is optional.StatusDefault value: Active.If the Spot is no longer needed, you can change the status to Archived. Once archived, the Spot cannot be used in campaigns or restored. To use a Spot again, you must create a new one with a unique name.",{"id":11465,"title":10935,"titles":11466,"content":11467,"level":1104},"/native-elements/spot#final-step",[1069],"Click Save to create the Spot. Once created, the Spot can be used in LTO campaigns to display an LTO badge in the corresponding areas of the application.",{"id":1074,"title":1073,"titles":11469,"content":11470,"level":1110},[],"Subscription Product ID is a Native element that represents a priced product identifier used to offer subscriptions in the application.",{"id":11472,"title":11473,"titles":11474,"content":11475,"level":1120},"/native-elements/subscription-product-id#what-is-subscription-product-id","What is Subscription Product ID",[1073],"Subscription Product ID is a Native element that represents a priced product identifier used to offer subscriptions in the application. A subscription grants users access to features or content for a specific period of time and may automatically renew based on the app store configuration. You can see an example of a created Subscription Product ID in the demo application here.",{"id":11477,"title":10840,"titles":11478,"content":11479,"level":1120},"/native-elements/subscription-product-id#key-characteristics",[1073],"Subscription Product ID represents a paid product.A price is required.Used for subscription-based products with recurring access.Does not need to be created manually in the system only — it must correspond to a product configured in app stores.Subscription Product ID must be linked to a Subscription Product ID Context.The default context (Customs) is optional and may be left empty.In some cases (by agreement with development or SDK logic), values such as trial / non-trial may be required in the default context.",{"id":11481,"title":10845,"titles":11482,"content":11483,"level":1120},"/native-elements/subscription-product-id#supported-campaigns",[1073],"Subscription Product ID can be used only in the following campaign types: SubscriptionSubscription LTOMixedMixed LTOA/B test campaigns for the listed types",{"id":11485,"title":10850,"titles":11486,"content":11487,"level":1120},"/native-elements/subscription-product-id#usage-example",[1073],"Example Subscription Product ID:subscription_premium_monthly_id This product can be used to offer a monthly premium subscription with recurring access to paid features.",{"id":11489,"title":11490,"titles":11491,"content":11492,"level":1104},"/native-elements/subscription-product-id#how-to-create-a-subscription-product-id","How to create a Subscription Product ID",[1073],"How to find it: Configuration > Remote Config > Native elements Creation steps Click Create new.Fill in the product creation form:",{"id":11494,"title":1328,"titles":11495,"content":11496,"level":1120},"/native-elements/subscription-product-id#application",[1073,11490],"Select the application the Subscription Product ID belongs to.",{"id":11498,"title":1304,"titles":11499,"content":11500,"level":1120},"/native-elements/subscription-product-id#name",[1073,11490],"A unique product identifier. Used in analytics and reports as a Product ID filter. It is recommended to follow the same naming style as other Product IDs (for example, Consumable Product ID). Example:subscription_premium_monthly_id",{"id":11502,"title":10868,"titles":11503,"content":11504,"level":1120},"/native-elements/subscription-product-id#human-readable-name",[1073,11490],"An internal name used only inside the system for convenience. Not included in analytics. Recommended to use the same value as Name or provide a clearer internal description if needed.",{"id":11506,"title":10873,"titles":11507,"content":11508,"level":1120},"/native-elements/subscription-product-id#native-element-type",[1073,11490],"Select Subscription Product ID.",{"id":11510,"title":10915,"titles":11511,"content":11512,"level":1120},"/native-elements/subscription-product-id#cost",[1073,11490],"The Cost field is required for Subscription Product ID. Defines the subscription price in USD.Must match the price configured in the app stores.Used for:\ndisplaying the price in campaigns;subscription validation;revenue analytics. If the Cost field is not set, the product cannot be saved.",{"id":11514,"title":10920,"titles":11515,"content":11516,"level":1120},"/native-elements/subscription-product-id#customs",[1073,11490],"The Customs field defines the default context for the Subscription Product ID. The field is required, but it may be saved empty by enabling the Confirm empty option.Used when:\na subscription is activated using a promo code;a subscription is activated directly inside the application;the subscription flow cannot be resolved via a campaign context.The value must be provided as a JSON object.The JSON structure must match the Subscription Product ID Context. If the final JSON structure is not yet known, you may enable Confirm empty and save the product with an empty Customs value. Important:If your subscription logic relies on default parameters (for example, trial / non-trial), make sure to define a valid JSON context in the Customs field before releasing the product to real users.Using a Subscription Product ID with an empty or incorrect Customs context may lead to incorrect subscription behavior or analytics.",{"id":11518,"title":11519,"titles":11520,"content":11521,"level":1120},"/native-elements/subscription-product-id#subscription-product-id-context","Subscription Product ID Context",[1073,11490],"Each Subscription Product ID must be associated with a Subscription Product ID Context. Subscription Product ID Context is not selected on the product creation page. Contexts are configured separately and are used in campaigns together with the Subscription Product ID. The context is used in subscription campaign logic and defines subscription-related behavior and parameters. A default context may be left empty, unless required by application or SDK logic. More details will be available in the Product ID Context article (coming soon).",{"id":11523,"title":10952,"titles":11524,"content":11525,"level":1120},"/native-elements/subscription-product-id#optional-fields",[1073,11490],"Default image Optional. Used for reference or documentation purposes only and does not affect campaign behavior. Status Default value — Active.If the product is no longer needed, it can be set to Archived.Once archived, it cannot be used in campaigns or restored. To use it again, create a new Subscription Product ID with a unique name.",{"id":11527,"title":10935,"titles":11528,"content":11529,"level":1104},"/native-elements/subscription-product-id#final-step",[1073],"Click Save to create the Subscription Product ID. Once created, the Subscription Product ID can be used in Subscription, Subscription LTO, Mixed, and Mixed LTO campaigns, including their A/B test variants, and will be available in analytics as a Product ID filter.",{"id":1078,"title":1077,"titles":11531,"content":11532,"level":1110},[],"Learn how Magify Segmentation works and how to create user segments for Remote Config",{"id":11534,"title":4180,"titles":11535,"content":11536,"level":1104},"/segmentation#overview",[1077],"Segmentation is a mechanism for dividing application users into groups (segments) based on specific characteristics. Segments are used to control user behavior and deliver relevant configurations within Remote Config entities, including: campaigns (parent and nested);features;impression limits;A/B tests. Segmentation allows you to: deliver different configurations to different audiences;control campaign and feature reach;run A/B tests;configure and validate setups for specific user groups (for example, QA).",{"id":11538,"title":11539,"titles":11540,"content":11541,"level":1104},"/segmentation#where-to-find-segmentation","Where to Find Segmentation",[1077],"The Segmentation section is available at: Magify > Configurations > Remote Config > Segmentation This section displays the list of all segments created for the selected application.",{"id":11543,"title":11544,"titles":11545,"content":11546,"level":1104},"/segmentation#default-segment-all","Default Segment (ALL)",[1077],"When a new application is added to the system, a system segment named ALL is created automatically. The ALL segment is created for: the application in production;the application in sandbox. The ALL segment includes all users of the application. You can view an example of the ALL segment for a Demo application by following this link.",{"id":11548,"title":11549,"titles":11550,"content":11551,"level":1120},"/segmentation#all-segment-details","ALL Segment Details",[1077,11544],"created automatically when an application is added;includes 100% of application users;does not contain any segmentation criteria;available in all Remote Config entities;can be archived;can be edited, however it is recommended to keep the ALL segment unchanged and create separate segments for custom scenarios.",{"id":11553,"title":11554,"titles":11555,"content":11556,"level":1104},"/segmentation#creating-a-segment","Creating a Segment",[1077],"To create a new segment, navigate to: Magify > Configurations > Remote Config > Segmentation > Create New When creating a segment, you need to: Select the application for which the segment is created;Specify a segment name;Configure segmentation criteria. After saving, the segment becomes available for further use.",{"id":11558,"title":11559,"titles":11560,"content":11561,"level":1104},"/segmentation#how-segmentation-works","How Segmentation Works",[1077],"Segmentation in Magify is dynamic. This means: user–segment matching is recalculated on every configuration request;a user can automatically:\nenter a segment;stop matching a segment;match the segment again. Segments do not store users and do not form permanent audiences.",{"id":11563,"title":11564,"titles":11565,"content":11566,"level":1104},"/segmentation#segment-lifecycle","Segment Lifecycle",[1077],"a segment becomes active immediately after saving;no additional activation or publishing is required;segment changes are applied automatically;a segment can be edited or archived at any time;archived segments cannot be restored;if needed, an archived segment can be cloned by assigning it a unique name and using it as a new segment. If a segment is used in active entities, changes are applied on the next user configuration requests. Next, the documentation covers available segmentation criteria, their logic, and usage examples.",{"id":11568,"title":1304,"titles":11569,"content":11570,"level":1104},"/segmentation#name",[1077],"The Name field defines the segment name.",{"id":11572,"title":11573,"titles":11574,"content":11575,"level":1120},"/segmentation#rules","Rules",[1077,1304],"the segment name must be unique within the application;the name can be specified in any language;using English is recommended for consistency and easier navigation.",{"id":11577,"title":11578,"titles":11579,"content":11580,"level":1120},"/segmentation#language-usage","Language Usage",[1077,1304],"Campaign and A/B test names are part of attribution data and are stored in ClickHouse, where using Latin characters ensures proper indexing, filtering, and aggregation. Segment names belong to configuration metadata and are not involved in high-load event processing. Because of this, segment names can safely use any language, including non-Latin scripts.",{"id":11582,"title":11583,"titles":11584,"content":11585,"level":1120},"/segmentation#segment-naming-recommendations","Segment Naming Recommendations",[1077,1304],"It is recommended to include key segmentation parameters in the segment name. A segment name should be short, descriptive, and easy to scan. Only parameters that are actually used in the segment should be reflected in the name. Unused criteria should not be included. Segment names can be changed after saving. Naming Examples1.0.0+ — users on version 1.0.0 and higher1.0.0 only — users strictly on version 1.0.01.1.0 initial — users whose first installed version was 1.1.0WW — worldwide usersUS — users from the United StatesEN / EN lang — users with English as the device languageWW excl CH — worldwide users excluding Chinalaunch 01.01.26 — users who installed the app starting from the specified dateAB — segment created specifically for an A/B testClient ID Alex — segment targeting a specific user (for example, QA)",{"id":11587,"title":1328,"titles":11588,"content":11589,"level":1104},"/segmentation#application",[1077],"The Application field defines the application for which the segment is created. Select the required application from the dropdown list. The segment will be available only within the selected application and cannot be used for other applications. You can view an example of using Auditory in a segment for the Demo application by following this link.",{"id":11591,"title":11592,"titles":11593,"content":11594,"level":1104},"/segmentation#auditory","Auditory",[1077],"The Auditory block defines which portion of the application audience and which user type is included in the segment. It consists of two parts: percentage-based audience split;filtering by new / existing user status.",{"id":11596,"title":11597,"titles":11598,"content":11599,"level":1120},"/segmentation#default-behavior","Default Behavior",[1077,11592],"If the Audience from / Audience to and Is new user fields are not modified, the segment includes 100% of the application audience by default.",{"id":11601,"title":11602,"titles":11603,"content":11604,"level":1120},"/segmentation#audience-from-audience-to","Audience from / Audience to",[1077,11592],"Defines the percentage of users included in the segment. The audience is specified as a range using: Audience fromAudience to",{"id":11606,"title":11607,"titles":11608,"content":11609,"level":1120},"/segmentation#how-it-works","How It Works",[1077,11592],"range 0–100 — 100% of users;range 0–50 — the first 50% of users;range 51–100 — the second 50% of users, non-overlapping with the first half. This allows you to deterministically split the audience into non-overlapping groups. Examples0–100 — all application users;0–50 — first half of the audience;51–100 — second half of the audience;0–25 — first 25% of users;75–100 — last 25% of users.",{"id":11611,"title":11612,"titles":11613,"content":11614,"level":1120},"/segmentation#is-new-user","Is new user",[1077,11592],"The Is new user field allows you to further segment the audience by new vs existing users. This flag is sent by the client.",{"id":11616,"title":11617,"titles":11618,"content":11619,"level":1120},"/segmentation#available-values","Available Values",[1077,11592],"All — all users, regardless of status;New — new users;Old — existing users.",{"id":11621,"title":11622,"titles":11623,"content":11624,"level":1120},"/segmentation#logic","Logic",[1077,11592],"As a general rule: New user — a user who has never updated the application. Their Initial App Version is equal to the current app version.Old user — a user who has updated the application at least once. Important notes: when a new app version is released, a user who was previously considered New becomes Old after updating;a user is considered New only if their first installed version matches the current app version. The New / Old status is dynamic and changes with each application update. Auditory is commonly used for: A/B testing;gradual feature rollouts;validating configurations on a subset of users. You can view an example of an Auditory-based segment for the Demo application by following this link.",{"id":11626,"title":11627,"titles":11628,"content":11629,"level":1104},"/segmentation#country","Country",[1077],"The Country criterion allows you to segment users based on their country of location. The country is determined based on the user’s IP address.",{"id":11631,"title":11632,"titles":11633,"content":11634,"level":1120},"/segmentation#countries","Countries",[1077,11627],"In the Countries field, select one or multiple countries from the dropdown list. if one country is selected, the segment applies only to users from that country;if multiple countries are selected, the segment applies to users from any of the selected countries. Selected countries within the Countries field are combined using OR logic.",{"id":11636,"title":11637,"titles":11638,"content":11639,"level":1120},"/segmentation#exclude","Exclude",[1077,11627],"The Exclude checkbox changes the criterion logic: Exclude disabled — the segment applies only to users from the selected countries;Exclude enabled — the segment applies to all users except those from the selected countries. ExamplesCountries: USUsers located in the United States.Countries: US, CA, AUUsers located in the United States, Canada, or Australia.Countries: CH + ExcludeUsers from all countries except China.",{"id":11641,"title":6955,"titles":11642,"content":11643,"level":1120},"/segmentation#notes",[1077,11627],"the country is determined dynamically on each configuration request;if a user’s IP-based location changes, they may enter or leave the segment;Country is commonly used together with Language, App Version, and Auditory criteria. You can view an example of a Country-based segment for the Demo application by following this link.",{"id":11645,"title":11646,"titles":11647,"content":11648,"level":1104},"/segmentation#language","Language",[1077],"The Language criterion allows you to segment users based on their device language. The language is determined from the system language settings of the user’s device.",{"id":11650,"title":11651,"titles":11652,"content":11653,"level":1120},"/segmentation#languages","Languages",[1077,11646],"In the Languages field, select one or multiple languages from the dropdown list. if one language is selected, the segment applies only to users with that device language;if multiple languages are selected, the segment applies to users with any of the selected languages. Selected languages within the Languages field are combined using OR logic.",{"id":11655,"title":11637,"titles":11656,"content":11657,"level":1120},"/segmentation#exclude-1",[1077,11646],"The Exclude checkbox changes the criterion logic: Exclude disabled — the segment applies only to users with the selected device languages;Exclude enabled — the segment applies to all users except those with the selected device languages. ExamplesLanguages: ENUsers with English as the device language.Languages: EN, ESUsers with English or Spanish as the device language.Languages: RU + ExcludeUsers with any device language except Russian.",{"id":11659,"title":6955,"titles":11660,"content":11661,"level":1120},"/segmentation#notes-1",[1077,11646],"the language is taken from the device system settings, not from the in-app language selector;changing the device language may cause a user to enter or leave the segment;Language is commonly used together with Country and Auditory criteria. You can view an example of a Language-based segment for the Demo application by following this link.",{"id":11663,"title":980,"titles":11664,"content":11665,"level":1104},"/segmentation#app-version",[1077],"The App Version block allows you to segment users by application version. It includes: current app version;initial app version;build numbers.",{"id":11667,"title":11668,"titles":11669,"content":11670,"level":1120},"/segmentation#app-version-1","App version",[1077,980],"The App version field defines the current application version used by the user. You can specify the version using: a range — from / to;a lower bound — from only;an upper bound — to only.",{"id":11672,"title":11607,"titles":11673,"content":11674,"level":1120},"/segmentation#how-it-works-1",[1077,980],"App version from — minimum version (inclusive);App version to — maximum version (inclusive);if only one field is set, the other is treated as unbounded.",{"id":11676,"title":11677,"titles":11678,"content":11679,"level":1120},"/segmentation#initial-app-version","Initial app version",[1077,980],"The Initial app version field defines the version with which the user first installed the application. Example: a user is currently on 2.3.0, but initially installed the app on 1.8.0. In this case, Initial app version = 1.8.0. This field supports: ranges (from / to);lower or upper bounds.",{"id":11681,"title":11637,"titles":11682,"content":11683,"level":1120},"/segmentation#exclude-2",[1077,980],"The Exclude checkbox is available for both App version and Initial app version. Exclude disabled — the segment applies to the specified versions;Exclude enabled — the segment applies to all versions except the specified ones.",{"id":11685,"title":11686,"titles":11687,"content":11688,"level":1120},"/segmentation#build-numbers","Build Numbers",[1077,980],"The Build Numbers field allows segmentation by specific application build numbers. build numbers are added manually using + New item;Exclude mode is supported. Build Numbers are primarily intended for: QA (testing specific builds);configurators (delivering configs to test builds);targeted hotfixes and temporary technical restrictions. This is a utility feature and is typically not used for broad product segmentation.",{"id":11690,"title":11691,"titles":11692,"content":11693,"level":1120},"/segmentation#exclude-build-numbers","Exclude (Build Numbers)",[1077,980],"The Exclude checkbox changes the logic of the Build Numbers field: Exclude disabled — the segment applies only to users with the specified build numbers;Exclude enabled — the segment applies to all users except those with the specified build numbers.",{"id":11695,"title":11696,"titles":11697,"content":11698,"level":1120},"/segmentation#adding-values","Adding values",[1077,980],"Each version value is added as a separate item, not as a comma-separated list. You can add a version in two ways: Click + New item;Enter the required version in the input field and press Enter. After that: you can immediately enter the next version;the input field remains active until you click outside of it (for example, the Save button or any other area of the interface). You can view an example of an App Version–based segment for the Demo application by following this link.",{"id":11700,"title":10412,"titles":11701,"content":11702,"level":1104},"/segmentation#device",[1077],"The Device block allows you to segment users based on device characteristics. It includes: Device groups — predefined device groups;Device type — device form factor;OS versions — operating system versions. All parameters inside the Device block are combined using AND logic.",{"id":11704,"title":11705,"titles":11706,"content":11707,"level":1104},"/segmentation#device-groups","Device groups",[1077],"The Device groups field allows segmentation using predefined device groups. These groups are defined on the platform side and represent aggregated technical device categories. Multiple groups can be selected — selected groups are combined using OR logic.",{"id":11709,"title":11710,"titles":11711,"content":11712,"level":1120},"/segmentation#android-device-groups","Android device groups",[1077,11705],"all-phones-android — all Android devices classified by the system as phones, including edge-case and non-standard models. Recommended for QA and technical rollouts.Android Phone — a logical group of Android devices with Phone type. Recommended for product segmentation.android-tablet — android tablets. Used for tablet-specific scenarios.xhdpi / xxhdpi / xxxhdpi — groups based on screen density (DPI). Primarily used for QA and UI validation.",{"id":11714,"title":11715,"titles":11716,"content":11717,"level":1120},"/segmentation#ios-device-groups","iOS device groups",[1077,11705],"iPhone — all iPhone devices.iPhone6–8 — iPhone 6 / 6s / 7 / 8iPhone6–8 plus — Plus models 6–8iPhone7Seg — iPhone 7 generation and similar devicesiPhoneX plus — X-series devices with larger form factorsplus_phones — All iPhones with a Plus-sized screen. Useful when screen size matters more than the exact device generation.iPad — all iPad devices",{"id":11719,"title":11720,"titles":11721,"content":11722,"level":1120},"/segmentation#exclude-device-groups","Exclude (Device groups)",[1077,11705],"Exclude disabled — applies only to selected groups;Exclude enabled — applies to all devices except the selected groups.",{"id":11724,"title":11725,"titles":11726,"content":11727,"level":1104},"/segmentation#device-type","Device type",[1077],"Allows segmentation by device form factor: PhoneTablet",{"id":11729,"title":11730,"titles":11731,"content":11732,"level":1120},"/segmentation#exclude-device-type","Exclude (Device type)",[1077,11725],"Exclude disabled — applies to selected device types;Exclude enabled — applies to all device types except the selected ones.",{"id":11734,"title":11735,"titles":11736,"content":11737,"level":1104},"/segmentation#os-versions","OS versions",[1077],"Allows segmentation by device operating system version. One or multiple OS versions can be selected. Selected values are combined using OR logic.",{"id":11739,"title":11740,"titles":11741,"content":11742,"level":1120},"/segmentation#exclude-os-versions","Exclude (OS versions)",[1077,11735],"Exclude disabled — applies to selected OS versions;Exclude enabled — applies to all OS versions except the selected ones.",{"id":11744,"title":6955,"titles":11745,"content":11746,"level":1120},"/segmentation#notes-2",[1077,11735],"device and OS information is provided by the client;changing device or OS version may affect segment matching;the Device block is commonly used together with App Version and Auditory. You can view an example of a Device-based segment for the Demo application by following this link.",{"id":11748,"title":11749,"titles":11750,"content":11751,"level":1104},"/segmentation#launch-date","Launch Date",[1077],"The Launch Date criterion allows you to segment users based on the date of the first application launch. The first launch is defined as the first actual app start after installation. Important: The first launch date is reset after the application is reinstalled.",{"id":11753,"title":11754,"titles":11755,"content":11756,"level":1104},"/segmentation#launch-date-from-launch-date-to","Launch date from / Launch date to",[1077],"The Launch date from and Launch date to fields define a calendar date and time range for the first app launch. only from — users who launched the app starting from the specified date;only to — users who launched the app before the specified date;from + to — users whose first launch falls within the specified range (inclusive). Dates and time are specified in UTC.",{"id":11758,"title":11759,"titles":11760,"content":11761,"level":1120},"/segmentation#exclude-launch-date","Exclude (Launch date)",[1077,11754],"Exclude disabled — applies to users whose first launch is within the range;Exclude enabled — applies to users whose first launch is outside the specified range.",{"id":11763,"title":11764,"titles":11765,"content":11766,"level":1104},"/segmentation#day-after-launch-from-day-after-launch-to","Day after launch from / Day after launch to",[1077],"The Day after launch fields allow segmentation based on the number of days since the first app launch. counting starts from the first launch date;days are counted as calendar days, not by actual time spent in the app;0 — installation and first launch day;1 — the next calendar day;2 — the second day after launch, and so on. Examplesfrom = 0, to = 0 — installation day only;from = 0, to = 2 — installation day plus the next two calendar days;from = 3 — users who have been in the app for at least 3 days.",{"id":11768,"title":11769,"titles":11770,"content":11771,"level":1120},"/segmentation#exclude-day-after-launch","Exclude (Day after launch)",[1077,11764],"Exclude disabled — applies to users within the specified day range;Exclude enabled — applies to all users except those within the range.",{"id":11773,"title":11774,"titles":11775,"content":467,"level":1104},"/segmentation#platform-specifics","Platform specifics",[1077],{"id":11777,"title":10417,"titles":11778,"content":11779,"level":1120},"/segmentation#android",[1077,11774],"On Android, device time changes may affect Day after launch segmentation. In practice, this is rare and usually not a concern.",{"id":11781,"title":10422,"titles":11782,"content":11783,"level":1120},"/segmentation#ios",[1077,11774],"On iOS, changing the device time does not affect Day after launch. Users will match the segment only after the actual number of days has passed.",{"id":11785,"title":11786,"titles":11787,"content":11788,"level":1120},"/segmentation#recommendations","Recommendations",[1077,11774],"use Launch date when a specific install date matters;use Day after launch when the user’s age in the app matters;combine Day after launch with other criteria to target fresh users accurately. You can view an example of a Launch Date–based segment for the Demo application by following this link.",{"id":11790,"title":11791,"titles":11792,"content":11793,"level":1104},"/segmentation#days-of-week","Days of Week",[1077],"The Days of Week criterion defines on which days of the week a segment is active. The segment is applied to users only on the selected days.",{"id":11795,"title":11796,"titles":11797,"content":11798,"level":1120},"/segmentation#how-days-of-week-works","How Days of Week works",[1077,11791],"you can select all days or only specific days;selected days are combined using OR logic;the segment is active when the user’s current day of the week matches one of the selected days.",{"id":11800,"title":11801,"titles":11802,"content":11803,"level":1120},"/segmentation#how-the-day-of-the-week-is-calculated","How the day of the week is calculated",[1077,11791],"The day of the week is calculated on the server side. the server uses its own time as a baseline;if the client provides the user’s timezone, the server applies the client timezone and determines the user’s local day of the week;if the timezone is not provided by the client (SDK versions below 4.5.4), UTC is used. As a result: if a user opens the app at 00:00 in their local timezone on Saturday, a segment configured for Saturday will be applied;changing the device time does not affect segment matching. ExampleOnly Saturday and Sunday are selected.In this case, the segment will apply:to all users;only when it is Saturday and/or Sunday in the user’s local time. You can view this segment example in the Demo application using this link.",{"id":11805,"title":11806,"titles":11807,"content":11808,"level":1120},"/segmentation#default-behavior-1","Default behavior",[1077,11791],"When a new segment is created, all days of the week are selected by default. If no day-based restriction is required, simply leave all days enabled.",{"id":11810,"title":11786,"titles":11811,"content":11812,"level":1120},"/segmentation#recommendations-1",[1077,11791],"use Days of Weekfor:\nweekend-only features;temporary events;day-based configuration limits;always consider the SDK version during QA, especially for versions below 4.5.4.",{"id":11814,"title":11815,"titles":11816,"content":11817,"level":1104},"/segmentation#days-of-month","Days of Month",[1077],"The Days of Month criterion defines on which days of the month a segment is active. The segment is applied to users only on the selected calendar days of the month.",{"id":11819,"title":11820,"titles":11821,"content":11822,"level":1120},"/segmentation#how-days-of-month-works","How Days of Month works",[1077,11815],"you can select any set of days from 1 to 31;selected days are combined using OR logic;the segment is active when the user’s current day of the month matches one of the selected values.",{"id":11824,"title":11825,"titles":11826,"content":11827,"level":1120},"/segmentation#how-the-day-of-the-month-is-calculated","How the day of the month is calculated",[1077,11815],"The day of the month is calculated on the server side. the server uses its own time as a baseline;if the client provides the user’s timezone, the server applies the client timezone to determine the user’s local day of the month;if the timezone is not provided by the client (SDK versions below 4.5.4), UTC is used. As a result: if a user opens the app at 00:00 in their local timezone on the 15th, a segment configured for day 15 will be applied;changing the device time does not affect segment matching.",{"id":11829,"title":11830,"titles":11831,"content":11832,"level":1120},"/segmentation#months-with-fewer-days","Months with fewer days",[1077,11815],"If a month has fewer than 31 days, days that do not exist in that month are ignored. Examples: if 31 is selected, the segment will not be active in months with 30 days or in February;if 29is selected, the segment will be active:\nin months with 29 or more days;only in leap-year February. ExampleSelected days: 1, 15, 30.In this case, the segment will be applied:to all users;only on the 1st, 15th, and 30th day of the month based on the user’s local time (if those days exist in the current month).You can view this segment example in the Demo application using this link.",{"id":11834,"title":11806,"titles":11835,"content":11836,"level":1120},"/segmentation#default-behavior-2",[1077,11815],"When a new segment is created, all days of the month (1–31) are selected by default. If the days are not modified, the segment is not restricted by this criterion.",{"id":11838,"title":11786,"titles":11839,"content":11840,"level":1120},"/segmentation#recommendations-2",[1077,11815],"use Days of Monthfor:\nmonthly events;bonus and payment cycles;date-specific feature activation;always consider the length of the current month when configuring segments.",{"id":11842,"title":11843,"titles":11844,"content":11845,"level":1104},"/segmentation#idfa","IDFA",[1077],"The IDFA criterion allows you to segment users based on the availability of the advertising identifier (IDFA) (Identifier for Advertisers) on the user’s device. IDFA is commonly used by attribution and analytics systems to: link installs to ad campaigns;analyze advertising performance;support user attribution.",{"id":11847,"title":11848,"titles":11849,"content":11850,"level":1120},"/segmentation#is-idfa-available","Is IDFA available",[1077,11843],"The Is IDFA available field defines whether IDFA is available for a user. Three values are available:",{"id":11852,"title":11853,"titles":11854,"content":11855,"level":1120},"/segmentation#unknown","Unknown",[1077,11843],"Default state. Means that: the segment is not restricted by IDFA availability;all users are included, regardless of whether IDFA is available or not. Recommended when: IDFA is not relevant for the segment logic;no IDFA-based filtering is required.",{"id":11857,"title":11858,"titles":11859,"content":11860,"level":1120},"/segmentation#yes","Yes",[1077,11843],"IDFA is available. The segment will include users who: have granted permission to share IDFA;have an accessible advertising identifier on their device. Commonly used for: UA and advertising scenarios;segments requiring full attribution data.",{"id":11862,"title":11863,"titles":11864,"content":11865,"level":1120},"/segmentation#no","No",[1077,11843],"IDFA is not available. The segment will include users who: did not grant permission to share IDFA;have IDFA disabled or unavailable. Used for: non-IDFA audiences;analysis of users without advertising attribution;privacy-focused scenarios. ExampleIs IDFA available = Yes The segment applies only to users with available IDFA.Is IDFA available = No The segment applies only to users without available IDFA.Is IDFA available = Unknown The segment applies to all users, without IDFA-based filtering.",{"id":11867,"title":11806,"titles":11868,"content":11869,"level":1120},"/segmentation#default-behavior-3",[1077,11843],"When a new segment is created, Unknown is selected by default. If the field is not modified, the segment does not filter users by IDFA.",{"id":11871,"title":11786,"titles":11872,"content":11873,"level":1120},"/segmentation#recommendations-3",[1077,11843],"use Yes / No only when IDFA availability is critical for the segment;for most product and UI scenarios, Unknown is sufficient;for UA and analytics use cases, explicitly set Yes or No. You can view an example of an IDFA-based segment for the Demo application by following this link.",{"id":11875,"title":10427,"titles":11876,"content":11877,"level":1104},"/segmentation#generated-in-app-purchases",[1077],"The Generated In-App Purchases block allows you to segment users based on their in-app purchase activity. Only in-app purchases are considered. Subscriptions are not included. All amounts are specified in USD.",{"id":11879,"title":10432,"titles":11880,"content":11881,"level":1120},"/segmentation#generated-in-app-purchases-revenue",[1077,10427],"The Generated In-App Purchases Revenue field defines the minimum revenue generated by a user from in-app purchases. the value is specified in USD;the condition is checked as “spent at least this amount”;the value 0 means all users, regardless of spending.",{"id":11883,"title":11637,"titles":11884,"content":11885,"level":1120},"/segmentation#exclude-3",[1077,10427],"If Exclude is enabled, the condition is inverted: the segment will include users who spent less than the specified amount. ExamplesRevenue = 10, Exclude = off > users who spent $10 or moreRevenue = 10, Exclude = on > users who spent less than $10Revenue = 0 > all users",{"id":11887,"title":11888,"titles":11889,"content":11890,"level":1120},"/segmentation#bought-in-app-purchases","Bought In-App Purchases",[1077,10427],"The Bought In-App Purchases field defines the minimum number of in-app purchases made by a user. the condition is checked as “made at least N purchases”;the value 0 means all users, regardless of purchase count.",{"id":11892,"title":11637,"titles":11893,"content":11894,"level":1120},"/segmentation#exclude-4",[1077,10427],"If Exclude is enabled, the condition is inverted: the segment will include users who made fewer purchases than specified. ExamplesBought = 1, Exclude = off > users with at least one purchaseBought = 3, Exclude = off > users with 3 or more purchasesBought = 1, Exclude = on > users with no purchasesBought = 0 > all users",{"id":11896,"title":11897,"titles":11898,"content":11899,"level":1120},"/segmentation#block-logic","Block logic",[1077,10427],"both fields work independently;if both are set, conditions are combined using AND logic;the Exclude flag applies per field, not globally. Example segmentConfiguration:Generated In-App Purchases Revenue = 5Bought In-App Purchases = 2Exclude = offResult: The segment will include users who:spent $5 or more;made at least 2 in-app purchases.",{"id":11901,"title":11786,"titles":11902,"content":11903,"level":1120},"/segmentation#recommendations-4",[1077,10427],"use this block to:\nseparate paying and non-paying users;identify low and mid spenders;build payment-based product logic;for advanced scenarios (ranges, time windows, specific products), use Payment Activity or Product blocks. You can view an example of a Generated In-App Purchases–based segment for the Demo application by following this link.",{"id":11905,"title":11906,"titles":11907,"content":11908,"level":1104},"/segmentation#payment-activity","Payment Activity",[1077],"The Payment Activity block allows you to segment users based on their payment activity within a specific time window. Only in-app purchases are considered. Subscriptions are not included. All amounts are specified in USD. All conditions inside this block are combined using AND logic.",{"id":11910,"title":11911,"titles":11912,"content":11913,"level":1120},"/segmentation#in-app-purchases-revenue-from-to","In-App Purchases Revenue From / To",[1077,11906],"The From and To fields define a revenue range generated by the user from in-app purchases. From — minimum amount (≥);To — maximum amount (≤).",{"id":11915,"title":11637,"titles":11916,"content":11917,"level":1120},"/segmentation#exclude-5",[1077,11906],"If Exclude is enabled, the specified range is excluded.",{"id":11919,"title":11920,"titles":11921,"content":11922,"level":1120},"/segmentation#bought-in-app-purchases-from-to","Bought In-App Purchases From / To",[1077,11906],"Defines a range for the number of in-app purchases made by the user. From — minimum number (≥);To — maximum number (≤).",{"id":11924,"title":11637,"titles":11925,"content":11917,"level":1120},"/segmentation#exclude-6",[1077,11906],{"id":11927,"title":11928,"titles":11929,"content":11930,"level":1120},"/segmentation#include-purchased-day-idx-from-to","Include Purchased Day IDX From / To",[1077,11906],"Defines the time window (in days) during which purchases are counted. 0 — today;1 — yesterday;up to 180 days. Both fields are required when using Payment Activity. ExampleConfiguration:In-App Purchases Revenue From: 1In-App Purchases Revenue To: 10Include Purchased Day IDX From: 0Include Purchased Day IDX To: 6Result: The segment will include users who spent $1–10 in in-app purchases during the last 7 days. You can view this segment example in the Demo application using this link.",{"id":11932,"title":11933,"titles":11934,"content":11935,"level":1104},"/segmentation#rewarded-video-impressions","Rewarded Video Impressions",[1077],"The Rewarded Video Impressions block allows you to segment users based on the number of rewarded videos they have watched at a fixed day in the user’s app lifetime. Important: this block does not determine how long the user has currently been in the app. It evaluates the accumulated number of rewarded video impressions by a specific lifetime day.",{"id":11937,"title":11938,"titles":11939,"content":11940,"level":1120},"/segmentation#day-after-launch-fixed-value","Day after launch (fixed value)",[1077,11933],"The Day after launch (fixed value) field defines a fixed point on the user’s lifetime timeline at which rewarded video impressions are evaluated. Available values: D0 — install day (first app launch);D1 — 1 day after install;D4D7D14D30 Selecting D7 means: the system checks how many rewarded videos the user had watched by their 7th day in the app, regardless of when this happened (even if it was months ago).",{"id":11942,"title":11943,"titles":11944,"content":11945,"level":1120},"/segmentation#rewarded-videos-showed-from-to","Rewarded videos showed from / to",[1077,11933],"The Rewarded videos showed from and Rewarded videos showed to fields define a range of rewarded video impressions accumulated by the user by the selected lifetime day. from — minimum number of impressions (≥);to — maximum number of impressions (≤).",{"id":11947,"title":11637,"titles":11948,"content":11949,"level":1120},"/segmentation#exclude-7",[1077,11933],"If the Exclude flag is enabled, the specified range is excluded from the segment.",{"id":11951,"title":11952,"titles":11953,"content":11954,"level":1120},"/segmentation#key-logic-important","Key logic (important)",[1077,11933],"The Rewarded Video Impressions block does not restrict users by their current lifetime day. This means: a user may have been using the app for months or even years;if the user met the rewarded video condition by the selected day (for example, D7), the user will still match the segment. If you need to target users who are currently on a specific day after launch, you must combine this block with the Day after launch (from / to) criterion.",{"id":11956,"title":11957,"titles":11958,"content":11959,"level":1120},"/segmentation#timeline-example","Timeline example",[1077,11933],"Assume D7 is selected. User timeline: D0 — watched 1 rewarded videoD5 — watched 1 more rewarded videoD10 — watched 1 more rewarded video Result: at D7, the user has 2 rewarded video impressions;at D14, the user has 3 rewarded video impressions. Example segmentConfiguration:Day after launch (fixed value): D7Rewarded videos showed from: 2Rewarded videos showed to: 5Result: The segment will include users who watched from 2 to 5 rewarded videos by their 7th day in the app.",{"id":11961,"title":11962,"titles":11963,"content":11964,"level":1120},"/segmentation#when-to-use-this-block","When to use this block",[1077,11933],"Use Rewarded Video Impressions when you need to: segment users based on early engagement behavior;identify users who actively watch rewarded ads;control rewarded ad pressure;configure monetization logic for non-paying users.",{"id":11966,"title":11786,"titles":11967,"content":11968,"level":1120},"/segmentation#recommendations-5",[1077,11933],"always explicitly set Day after launch (fixed value);do not use this block as a replacement for Day after launch from / to;when targeting “fresh” users only, always combine this block with Day after launch criteria. You can view an example of a Rewarded Video Impressions–based segment for the Demo application by following this link.",{"id":11970,"title":10442,"titles":11971,"content":11972,"level":1104},"/segmentation#ua-user-acquisition",[1077],"The UA block allows you to segment users based on user acquisition data received from the MMP (media source, campaign name, and ad group). This block is used to: separate paid and organic traffic;apply different configurations for specific ad networks;work with specific campaigns or ad groups;roll out features and experiments for selected traffic sources.",{"id":11974,"title":11975,"titles":11976,"content":11977,"level":1120},"/segmentation#media-sources","Media sources",[1077,10442],"The Media sources field allows you to select one or more media sources from which users were acquired. Examples of media sources: Facebook AdsGoogle AdsTikTok AdsUnityAdsIronSourceOrganic",{"id":11979,"title":11980,"titles":11981,"content":11982,"level":1120},"/segmentation#is-exclude-media-sources","Is exclude media sources",[1077,10442],"If Is exclude media sources is enabled, users acquired from the selected media sources will be excluded from the segment.",{"id":11984,"title":11985,"titles":11986,"content":11987,"level":1120},"/segmentation#acquisition-campaigns","Acquisition campaigns",[1077,10442],"The Acquisition campaigns field is used to specify campaign names received from the MMP. Each campaign name is added as a separate item via + New item;Campaign names are matched exactly;Multiple campaigns are combined using logical OR.",{"id":11989,"title":11990,"titles":11991,"content":11992,"level":1120},"/segmentation#exclude-acquisition-campaigns","Exclude acquisition campaigns",[1077,10442],"If Exclude acquisition campaigns is enabled, users from the specified campaigns will be excluded from the segment.",{"id":11994,"title":11995,"titles":11996,"content":11997,"level":1120},"/segmentation#acquisition-ad-groups","Acquisition ad groups",[1077,10442],"The Acquisition ad groups field allows you to segment users by ad group names reported by the MMP. Ad groups are rarely used for segmentation. Their structure and meaning depend on the advertising platform (for example, targeting groups in Facebook Ads or publishers in other ad networks). In most cases, campaign-level segmentation is more stable and preferred. Each value is added via + New item;Multiple ad groups are combined using logical OR.",{"id":11999,"title":12000,"titles":12001,"content":12002,"level":1120},"/segmentation#is-exclude-acquisition-ad-group-names","Is exclude acquisition ad group names",[1077,10442],"When enabled, users belonging to the specified ad groups will be excluded from the segment.",{"id":12004,"title":12005,"titles":12006,"content":12007,"level":1120},"/segmentation#logical-behavior","Logical behavior",[1077,10442],"Within the UA block: values inside the same field are combined using OR;different fields are combined using AND. Example: Media source = Facebook AdsCampaign = Launch_US > users acquired via Facebook Ads AND campaign “Launch_US”. Example segmentConfiguration:Media sources: Facebook AdsAcquisition campaigns: Launch_US, Launch_CAResult: The segment will include users acquired via Facebook Ads from the Launch_US or Launch_CA campaigns.",{"id":12009,"title":12010,"titles":12011,"content":12012,"level":1120},"/segmentation#ua-segmentation-is-commonly-combined-with","UA segmentation is commonly combined with",[1077,10442],"UA segmentation is most commonly combined with: Country / Language — to split traffic by region and locale;App Version — to control rollouts and version-specific behavior;Launch Date — to target specific user cohorts. You can view an example of a UA-based segment for the Demo application by following this link.",{"id":1084,"title":1083,"titles":12014,"content":12015,"level":1110},[],"Overview of tools and configurations for managing User Acquisition. The UA Configurations section brings together the key tools for setting up and managing User Acquisition (UA) within the system. It defines the structure, relationships, and parameters required to organize campaigns and analyze acquisition performance. All data configured within this section is used in Magify analytical reports and dashboards, allowing you to track UA performance at both the campaign and creative levels.",{"id":12017,"title":12018,"titles":12019,"content":12020,"level":1120},"/ua-configurations#subsections","Subsections",[1083],"UA Campaign — configuration of campaign parameters, traffic sources, and analytical connections.UA Creative — management of ad creatives and their associations with campaigns for subsequent performance analysis.UA Tag — systematization and classification of creatives using tags.",{"id":12022,"title":6455,"titles":12023,"content":12024,"level":1120},"/ua-configurations#usage",[1083],"The UA Configurations section serves as the foundation for organizing the overall User Acquisition structure in the system. It defines the entities that are later displayed in analytics and used to build reports on traffic acquisition performance. It is recommended to start with the UA Campaign subsection to define the basic campaign parameters and link them with other configuration elements.",{"id":1090,"title":1089,"titles":12026,"content":12027,"level":1110},[],"Overview and management of UA campaigns imported from MMP grabbers (e.g., Adjust, AppsFlyer) to ensure accurate analytics and predictive reporting.",{"id":12029,"title":4180,"titles":12030,"content":12031,"level":1104},"/ua-configurations/ua-campaign#overview",[1089],"The UA Campaign section is designed for managing advertising campaigns imported into the system from MMP grabbers such as Adjust and AppsFlyer. UA Campaign acts as a configuration and normalization layer between raw MMP data and the system’s analytical reports. The UA Campaign list is available in: Magify > Configuration > UA Configurations > UA Campaign In this section, you can: review imported campaigns;configure and validate key campaign parameters;ensure correct campaign participation in analytics and reports. Proper configuration of UA Campaign directly affects: accuracy of spend and revenue attribution;correct aggregation by traffic sources and ad networks;data consistency across all analytical reports.",{"id":12033,"title":12034,"titles":12035,"content":12036,"level":1104},"/ua-configurations/ua-campaign#role-of-ua-campaign-in-analytics","Role of UA Campaign in Analytics",[1089],"Each campaign in the UA Campaign section represents a link between MMP data and all analytical layers of the system, including: performance reports;ad network and traffic source analytics;aggregated analytical reports. If key campaign parameters (especially Type) are missing or incorrect, the campaign may: be partially excluded from analytics;be excluded from certain analytical reports.",{"id":12038,"title":12039,"titles":12040,"content":12041,"level":1104},"/ua-configurations/ua-campaign#data-synchronization","Data Synchronization",[1089],"Campaigns are imported from MMPs automatically. Campaign names, Media Source, and technical identifiers are received directly from the MMP.Data synchronization runs automatically.Fields received from the MMP must not be edited manually unless explicitly allowed. In the campaign details view, it is visually indicated which fields are editable and which are locked.",{"id":12043,"title":12044,"titles":12045,"content":467,"level":1104},"/ua-configurations/ua-campaign#main-fields","Main Fields",[1089],{"id":12047,"title":1328,"titles":12048,"content":12049,"level":1120},"/ua-configurations/ua-campaign#application",[1089,12044],"The application to which the campaign belongs. Automatically filled during MMP import.Not editable manually.Always matches the data received from Adjust or AppsFlyer. Used to ensure correct aggregation of analytics by application.",{"id":12051,"title":1304,"titles":12052,"content":12053,"level":1120},"/ua-configurations/ua-campaign#name",[1089,12044],"The campaign name imported from the MMP. Used to identify campaigns in analytics and reports.Changes made to the campaign name in the MMP are not synchronized automatically.",{"id":12055,"title":10447,"titles":12056,"content":12057,"level":1120},"/ua-configurations/ua-campaign#media-source",[1089,12044],"The traffic source as defined by the MMP (Adjust or AppsFlyer). Imported automatically if provided by the MMP.Not editable if the value was received from the MMP.Used for technical mapping and report consistency. AppsFlyer specifics For campaigns imported from AppsFlyer: Media Source may not be set automatically;in such cases, Media Source must be set manually. For AppsFlyer campaigns, the following must be set manually:Media SourceCampaign Type If Media Source: is set correctly — analytics and reports work as expected;is set incorrectly — the campaign receives the status Just Created Campaign and may be excluded from analytics. If Media Source was received from the MMP: the field becomes disabled;manual changes are not allowed.",{"id":12059,"title":12060,"titles":12061,"content":12062,"level":1120},"/ua-configurations/ua-campaign#ad-network","Ad Network",[1089,12044],"The advertising network through which traffic is purchased (e.g. Unity Ads, AppLovin, IronSource, Mintegral). Represents the actual buying partner.Used for ad network–level performance analysis. Ad Network: is usually imported from the MMP (primarily Adjust);can be set manually only in exceptional cases if no value was received from the MMP.",{"id":12064,"title":12065,"titles":12066,"content":12067,"level":1120},"/ua-configurations/ua-campaign#ad-network-vs-media-source","Ad Network vs Media Source",[1089,12044],"UA Campaign uses two related but different parameters: Ad Network and Media Source. Ad Network answers the question:“Which advertising network performs better overall?” It represents the platform or network that sells and manages ad inventory. Media Source answers the question:“Which source or inventory within this network performs better?” It reflects a specific channel or identifier defined by the MMP. Using both parameters allows performance analysis at different levels: network-level (Ad Network);source-level within a network (Media Source).",{"id":12069,"title":12070,"titles":12071,"content":12072,"level":1120},"/ua-configurations/ua-campaign#original-network-name","Original Network Name",[1089,12044],"The original campaign or source name exactly as received from the MMP, without normalization. Purpose of the field: used as a technical service field for internal mapping;helps match different naming variations to a single Media Source. Example:fb, face book, facebook_ads → mapped to the same Media Source. This field: is not used for filtering or reporting;is not intended for analytical analysis.",{"id":12074,"title":12075,"titles":12076,"content":12077,"level":1120},"/ua-configurations/ua-campaign#type-campaign-type","Type (Campaign Type)",[1089,12044],"Defines the traffic acquisition model and determines campaign participation in analytics and reports. Campaign Type must always be set manually. If Type is not defined: the campaign receives the status Just Created Campaign;the campaign may be excluded from analytics.",{"id":12079,"title":10887,"titles":12080,"content":12081,"level":1120},"/ua-configurations/ua-campaign#status",[1089,12044],"The current campaign state: Running — active campaign.Archived — campaign manually marked as inactive by the user. Status is never changed automatically.A campaign can be moved to Archived only manually from the campaign details view.Archived campaigns: remain available for historical reference;do not participate in active analytics.",{"id":12083,"title":5916,"titles":12084,"content":467,"level":1104},"/ua-configurations/ua-campaign#campaign-types",[1089],{"id":12086,"title":12087,"titles":12088,"content":12089,"level":1120},"/ua-configurations/ua-campaign#ad-roas-campaign","Ad ROAS Campaign",[1089,5916],"Campaigns optimized for return on ad spend. Example: a campaign focused on ad spend efficiency.",{"id":12091,"title":12092,"titles":12093,"content":12094,"level":1120},"/ua-configurations/ua-campaign#cpi-campaign","CPI Campaign",[1089,5916],"Paid per install. Example: you pay for each app installation.",{"id":12096,"title":12097,"titles":12098,"content":12099,"level":1120},"/ua-configurations/ua-campaign#cpe-campaign","CPE Campaign",[1089,5916],"Paid per in-app event. Example: payment for registration or first app launch.",{"id":12101,"title":12102,"titles":12103,"content":12104,"level":1120},"/ua-configurations/ua-campaign#cpp-campaign","CPP Campaign",[1089,5916],"Paid per purchase. Example: payment for the first user transaction.",{"id":12106,"title":12107,"titles":12108,"content":12109,"level":1120},"/ua-configurations/ua-campaign#cpc-campaign","CPC Campaign",[1089,5916],"Paid per click. Example: payment for each ad click.",{"id":12111,"title":12112,"titles":12113,"content":12114,"level":1120},"/ua-configurations/ua-campaign#cpm-campaign","CPM Campaign",[1089,5916],"Paid per 1,000 impressions. Example: branding or awareness campaigns.",{"id":12116,"title":12117,"titles":12118,"content":12119,"level":1120},"/ua-configurations/ua-campaign#cpa-campaign","CPA Campaign",[1089,5916],"Paid per action. Example: payment for registration or form submission.",{"id":12121,"title":12122,"titles":12123,"content":12124,"level":1120},"/ua-configurations/ua-campaign#retargeting-campaign","Retargeting Campaign",[1089,5916],"Re-engagement of existing users. Example: campaigns targeting inactive users.",{"id":12126,"title":12127,"titles":12128,"content":12129,"level":1120},"/ua-configurations/ua-campaign#cross-promo-campaign","Cross-Promo Campaign",[1089,5916],"Promotion of your own apps. Example: advertising one app inside another.",{"id":12131,"title":12132,"titles":12133,"content":12134,"level":1120},"/ua-configurations/ua-campaign#branding-campaign","Branding Campaign",[1089,5916],"Awareness-focused campaigns. Example: video campaigns without conversion goals.",{"id":12136,"title":12137,"titles":12138,"content":12139,"level":1120},"/ua-configurations/ua-campaign#other","Other",[1089,5916],"Temporary classification. Use until the correct acquisition model is known.",{"id":12141,"title":12142,"titles":12143,"content":12144,"level":1104},"/ua-configurations/ua-campaign#campaigns-without-type-system-notifications","Campaigns Without Type: System Notifications",[1089],"After campaign import, the system checks whether all campaigns have a defined Type. If at least one campaign has no Type, a system notification is shown.",{"id":12146,"title":12147,"titles":12148,"content":12149,"level":1120},"/ua-configurations/ua-campaign#where-notifications-appear","Where notifications appear",[1089,12142],"In the notification center on the main screen.In the UA Campaign list, where campaigns without a Type are marked with a warning indicator. The notification remains visible as long as at least one campaign has no Type assigned. Once all campaigns have a Type, the notification disappears automatically.",{"id":12151,"title":12152,"titles":12153,"content":467,"level":1104},"/ua-configurations/ua-campaign#campaign-list-filtering-and-table-settings","Campaign List Filtering and Table Settings",[1089],{"id":12155,"title":4431,"titles":12156,"content":12157,"level":1120},"/ua-configurations/ua-campaign#filters",[1089,12152],"The UA Campaign list can be filtered by: ApplicationTypeMedia Source Filters help quickly locate incorrectly configured or unclassified campaigns.",{"id":12159,"title":12160,"titles":12161,"content":12162,"level":1120},"/ua-configurations/ua-campaign#edit-table","Edit Table",[1089,12152],"Using Edit table, you can customize which columns are displayed in the campaign list. Available columns: NameApplicationTypeStatusAd Network Selected columns are saved per user and help adapt the table to different workflows.",{"id":12164,"title":12165,"titles":12166,"content":12167,"level":1104},"/ua-configurations/ua-campaign#campaigns-imported-from-mmps","Campaigns Imported from MMPs",[1089],"The system may receive the following campaign types from MMPs: user acquisition campaigns;cross-promo campaigns;search campaigns (may appear as organic depending on MMP logic). Campaign Type in UA Campaign reflects the acquisition model, not the marketing naming used in the MMP.",{"id":12169,"title":12170,"titles":12171,"content":12172,"level":1104},"/ua-configurations/ua-campaign#best-practices","Best Practices",[1089],"Assign Campaign Type immediately after import.For AppsFlyer campaigns, always verify and set Media Source and Type manually.Do not edit MMP-imported fields if they are locked.Use filters and table settings to monitor campaign configuration.Archive campaigns only when they are truly finished.",{"id":12174,"title":4245,"titles":12175,"content":12176,"level":1104},"/ua-configurations/ua-campaign#summary",[1089],"UA Campaign is a core configuration section for user acquisition analytics. Correctly configured campaigns ensure: clean and consistent analytics;correct source and network attribution;reliable data across all analytical reports. Misconfigured campaigns directly impact data quality and should be corrected as early as possible.",{"id":1094,"title":1093,"titles":12178,"content":467,"level":1110},[],{"id":12180,"title":443,"body":12181,"date":12187,"description":5405,"extension":12188,"meta":12189,"navigation":12187,"path":444,"popular":12190,"seo":12191,"sitemap":12193,"stem":445,"timeToRead":12187,"__hash__":12194},"allArticles/07.Reports and Dashboards/Daily Report/UA Report.md",{"type":1098,"value":12182,"toc":12185},[12183],[1101,12184],{"id":467},{"title":467,"searchDepth":1104,"depth":1104,"links":12186},[],null,"md",{},false,{"title":12192,"description":5405},"UA Report file",{"loc":444},"sSmtroZ5MbkJuFPppqboy6VUFMb1b_2S-s2_KfHj100",[12196,12198,12200,12202,12204,12206],{"id":12197,"path":459,"title":458,"description":5763,"popular":12190,"timeToRead":12187,"date":12187},"allArticles/07.Reports and Dashboards/daily-and-monthly-product-overview.md",{"id":12199,"path":370,"title":369,"description":4365,"popular":12190,"timeToRead":12187,"date":12187},"allArticles/07.Reports and Dashboards/04.Active Users Report.md",{"id":12201,"path":428,"title":427,"description":5005,"popular":12190,"timeToRead":12187,"date":12187},"allArticles/07.Reports and Dashboards/Daily Report/Game Analytics.md",{"id":12203,"path":432,"title":431,"description":5042,"popular":12190,"timeToRead":12187,"date":12187},"allArticles/07.Reports and Dashboards/Daily Report/In-App Purchases & Subscriptions.md",{"id":12205,"path":424,"title":423,"description":4958,"popular":12190,"timeToRead":12187,"date":12187},"allArticles/07.Reports and Dashboards/Daily Report/Campaign Analysis.md",{"id":12207,"path":436,"title":435,"description":5074,"popular":12190,"timeToRead":12187,"date":12187},"allArticles/07.Reports and Dashboards/Daily Report/Methodology and FAQ.md",[12209,12211],{"title":439,"path":440,"stem":441,"id":12210,"children":-1},"allArticles/07.Reports and Dashboards/Daily Report/Metrics and Dimensions.md",{"title":447,"path":448,"stem":449,"id":12212,"children":-1},"allArticles/07.Reports and Dashboards/Daily Report/User Activity.md",[12214,12215,12216],{"path":354,"title":358},{"path":414,"title":413},{"path":444,"title":443},1775657612685]