From 91c57c2eeb00c5c2bacf1a4771b1c10eb4a253eb Mon Sep 17 00:00:00 2001 From: Jeehut Date: Tue, 22 Oct 2024 13:22:46 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20FlineDev?= =?UTF-8?q?/FreemiumKit-Docs@e010fa6648fa8d93d7b57ed6ebcccc0bb38ca654=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/documentation/freemiumkit.json | 2 +- data/documentation/freemiumkit/appreviewchecklist.json | 2 +- data/documentation/freemiumkit/faq-fixcrashonstart.json | 2 +- data/documentation/freemiumkit/faq-howitworks.json | 2 +- data/documentation/freemiumkit/faq-legacyproducts.json | 2 +- data/documentation/freemiumkit/faq-migratefrompaidupfront.json | 2 +- data/documentation/freemiumkit/faq-migratefromrevenuecat.json | 2 +- data/documentation/freemiumkit/faq-parentalgate.json | 2 +- data/documentation/freemiumkit/faq-pricing.json | 2 +- data/documentation/freemiumkit/faq-privacy.json | 2 +- data/documentation/freemiumkit/faq-serverlimits.json | 2 +- data/documentation/freemiumkit/faq-validation.json | 2 +- data/documentation/freemiumkit/faqs.json | 2 +- data/documentation/freemiumkit/migratefrompaid.json | 2 +- data/documentation/freemiumkit/setupguide.json | 2 +- data/documentation/index.json | 2 +- metadata.json | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/data/documentation/freemiumkit.json b/data/documentation/freemiumkit.json index 5d2821b..256ea5a 100644 --- a/data/documentation/freemiumkit.json +++ b/data/documentation/freemiumkit.json @@ -1 +1 @@ -{"hierarchy":{"paths":[[]]},"metadata":{"symbolKind":"module","role":"collection","title":"FreemiumKit","externalID":"FreemiumKit","modules":[{"name":"FreemiumKit"}],"roleHeading":"Framework"},"schemaVersion":{"minor":3,"patch":0,"major":0},"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit"},"kind":"symbol","variants":[{"paths":["\/documentation\/freemiumkit"],"traits":[{"interfaceLanguage":"swift"}]}],"references":{"doc://FreemiumKit/documentation/FreemiumKit":{"url":"\/documentation\/freemiumkit","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit","title":"FreemiumKit","kind":"symbol","role":"collection","abstract":[],"type":"topic"}}} \ No newline at end of file +{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit"},"kind":"symbol","sections":[],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/freemiumkit"]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"metadata":{"symbolKind":"module","modules":[{"name":"FreemiumKit"}],"role":"collection","title":"FreemiumKit","roleHeading":"Framework","externalID":"FreemiumKit"},"hierarchy":{"paths":[[]]},"references":{"doc://FreemiumKit/documentation/FreemiumKit":{"type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit","kind":"symbol","role":"collection","url":"\/documentation\/freemiumkit","title":"FreemiumKit","abstract":[]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/appreviewchecklist.json b/data/documentation/freemiumkit/appreviewchecklist.json index b21acfd..44255af 100644 --- a/data/documentation/freemiumkit/appreviewchecklist.json +++ b/data/documentation/freemiumkit/appreviewchecklist.json @@ -1 +1 @@ -{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist"},"abstract":[{"text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs).","type":"text"}],"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]}],"sections":[],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"schemaVersion":{"patch":0,"major":0,"minor":3},"kind":"article","metadata":{"roleHeading":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"title":"Checklist to Pass App Review","role":"article"},"primaryContentSections":[{"content":[{"text":"Before Submission","level":2,"type":"heading","anchor":"Before-Submission"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"text":"Set App Price to Free","type":"text"}],"type":"strong"},{"type":"text","text":" (new apps only)"}]},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"Navigate to “Pricing and Availability” in App Store Connect"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Set app price to “0.00” \/ Free (assuming your app is new & Freemium)","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Ensure availability for all desired countries","type":"text"}]}]}]}]},{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Link IAPs\/Subscriptions to Your Build"}]}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"In App Store Connect, go to your in-progress build"}]}]},{"content":[{"inlineContent":[{"text":"Find ‘In-App Purchases and Subscriptions’ section","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Click ‘Select In-App Purchases or Subscriptions’"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"Associate relevant products with your build","type":"text"}],"type":"paragraph"}]}]},{"inlineContent":[{"type":"image","identifier":"SelectPurchases"}],"type":"paragraph"},{"style":"note","name":"Note","type":"aside","content":[{"inlineContent":[{"type":"text","text":"In-App Purchases are reviewed together with your submitted app."}],"type":"paragraph"}]}]}],"type":"orderedList"},{"text":"Legal Compliance","level":2,"type":"heading","anchor":"Legal-Compliance"},{"items":[{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"text":"Accept Latest ‘Paid Apps Agreement’","type":"text"}]}],"type":"paragraph"},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Go to ‘Business’ tab in "},{"type":"reference","identifier":"https:\/\/appstoreconnect.apple.com\/business","isActive":true}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Accept the latest agreement"}],"type":"paragraph"}]}],"type":"unorderedList"}]},{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"text":"Add Privacy Policy Link","type":"text"}]}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"In App Store Connect:"}],"type":"paragraph"},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Go to your app’s page > ‘App Privacy’"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"Add Privacy Policy URL","type":"text"}],"type":"paragraph"}]}],"type":"unorderedList"}]}]}]},{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Set Up Privacy Labels in App Store Connect"}],"type":"strong"}]},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"text":"Go to your app’s page > ‘App Privacy’","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Select “Purchases” for data types","type":"text"}]}]},{"content":[{"inlineContent":[{"text":"Choose “Analytics” and “App Functionality” within “Purchases”","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Answer subsequent questions with ‘No’ (we don’t collect user-identifiable data)"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"image","identifier":"AppPrivacy-Purchases"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Include Apple’s EULA in App Description"}],"type":"strong"}]},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Add this to your App Store description (all locales):"}],"type":"paragraph"},{"code":["----- Legal Notice ----- ","Terms of Use (EULA): https:\/\/www.apple.com\/legal\/internet-services\/itunes\/dev\/stdeula\/"],"syntax":null,"type":"codeListing"}]}],"type":"unorderedList"}]},{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Link to Privacy & Terms in your App"}],"type":"strong"}]},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Within Your App:"}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"text":"Add a link for Privacy and Terms in settings menu or Help menu (Mac)","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"For iOS, example code:","type":"text"}],"type":"paragraph"},{"code":["import SwiftUI","","struct SettingsView: View {"," @Environment(\\.openURL) private var openURL",""," var body: some View {"," Form {"," \/\/ ..."," #if !os(macOS)"," Section {"," Button(\"Terms and Conditions\", systemImage: \"text.book.closed\") {"," self.openURL(URL(string: \"https:\/\/www.apple.com\/legal\/internet-services\/itunes\/dev\/stdeula\/\")!)"," }"," Button(\"Privacy\", systemImage: \"lock\") {"," self.openURL(URL(string: \"https:\/\/www.fline.dev\/app-privacy-analytics-en\/\")!)"," }"," }"," #endif"," }"," }","}"],"type":"codeListing","syntax":"swift"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"For macOS, example code:"}]},{"type":"codeListing","syntax":"swift","code":["import SwiftUI","","@main","struct YourApp: App {"," @Environment(\\.openURL) private var openURL",""," var body: some Scene {"," WindowGroup {"," \/\/ ..."," }"," #if os(macOS)"," .commands {"," CommandGroup(replacing: .help) {"," Button(\"Terms and Conditions\") {"," self.openURL(URL(string: \"https:\/\/www.apple.com\/legal\/internet-services\/itunes\/dev\/stdeula\/\")!)"," }"," Button(\"Privacy\") {"," self.openURL(URL(string: \"https:\/\/www.fline.dev\/app-privacy-analytics-en\/\")!)"," }"," }"," }"," #endif"," }","}"]}]}]},{"type":"aside","style":"note","name":"Note","content":[{"type":"paragraph","inlineContent":[{"text":"You can optionally add these links to your paywall using “Auxiliary Buttons” in the FreemiumKit paywall editor, but it’s not a requirement. They are only required directly within your app to ensure users can access them even without\/before\/after making a purchase.","type":"text"}]}]}]}],"type":"unorderedList"}]}],"type":"orderedList"},{"text":"Transparent Communication","level":2,"type":"heading","anchor":"Transparent-Communication"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Label Paid Features in App Description"}]}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"If you mention features that require payment, clearly indicate that in your description"}]}]}]}]},{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Label Paid Features in Screenshots and Previews"}],"type":"strong"}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"If featuring premium content, add a label like “Premium Feature” \/ “Requires Subscription”"}]}]},{"content":[{"inlineContent":[{"type":"text","text":"For app preview videos, add a text overlay when showing premium features"}],"type":"paragraph"}]}]}]}],"type":"orderedList"},{"style":"tip","name":"Tip","type":"aside","content":[{"inlineContent":[{"text":"Apps offering limited free features (e.g., one free project) might pass review without mentioning in-app purchases. However, for transparency and user trust, it’s better to disclose free limits in your description.","type":"text"}],"type":"paragraph"}]},{"text":"Conclusion","level":2,"type":"heading","anchor":"Conclusion"},{"inlineContent":[{"type":"text","text":"Following this checklist will help ensure a smoother app review process when using FreemiumKit for in-app purchases. Remember to thoroughly test your app before submission and stay updated with Apple’s latest guidelines."}],"type":"paragraph"},{"inlineContent":[{"type":"reference","identifier":"https:\/\/freemiumkit.app","isActive":true}],"type":"paragraph"},{"text":"Support","level":2,"type":"heading","anchor":"Support"},{"inlineContent":[{"text":"For questions or support, contact: ","type":"text"},{"isActive":true,"identifier":"mailto:freemiumkit@fline.dev","type":"reference"}],"type":"paragraph"},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true,"type":"reference"}],"type":"small"}],"kind":"content"}],"references":{"https://freemiumkit.app":{"type":"link","identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","url":"https:\/\/freemiumkit.app","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}]},"https://appstoreconnect.apple.com/business":{"type":"link","identifier":"https:\/\/appstoreconnect.apple.com\/business","title":"App Store Connect","url":"https:\/\/appstoreconnect.apple.com\/business","titleInlineContent":[{"type":"text","text":"App Store Connect"}]},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","type":"topic","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"url":"\/documentation\/freemiumkit\/migratefrompaid","title":"Paid to Freemium Migration Guide","kind":"article"},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"kind":"article","url":"\/documentation\/freemiumkit\/setupguide","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","title":"SDK Setup Guide","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}]},"AppPrivacy-Purchases":{"type":"image","identifier":"AppPrivacy-Purchases","variants":[{"traits":["1x","light"],"url":"\/images\/AppPrivacy-Purchases.png"}],"alt":"Purchase History Setup"},"SelectPurchases":{"type":"image","identifier":"SelectPurchases","variants":[{"traits":["1x","light"],"url":"\/images\/SelectPurchases.png"}],"alt":"Select Purchases"},"mailto:freemiumkit@fline.dev":{"type":"link","identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}]},"https://www.fline.dev/imprint/":{"type":"link","identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","url":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"type":"text","text":"Imprint"}]},"FreemiumKit.png":{"type":"image","identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"alt":null},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]}}} \ No newline at end of file +{"sections":[],"primaryContentSections":[{"kind":"content","content":[{"level":2,"anchor":"Before-Submission","text":"Before Submission","type":"heading"},{"items":[{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Set App Price to Free"}]},{"type":"text","text":" (new apps only)"}],"type":"paragraph"},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Navigate to “Pricing and Availability” in App Store Connect"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Set app price to “0.00” \/ Free (assuming your app is new & Freemium)"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Ensure availability for all desired countries","type":"text"}]}]}],"type":"unorderedList"}]},{"content":[{"inlineContent":[{"inlineContent":[{"text":"Link IAPs\/Subscriptions to Your Build","type":"text"}],"type":"strong"}],"type":"paragraph"},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"In App Store Connect, go to your in-progress build"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"Find ‘In-App Purchases and Subscriptions’ section","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Click ‘Select In-App Purchases or Subscriptions’"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Associate relevant products with your build"}]}]}],"type":"unorderedList"},{"inlineContent":[{"type":"image","identifier":"SelectPurchases"}],"type":"paragraph"},{"name":"Note","style":"note","content":[{"inlineContent":[{"text":"In-App Purchases are reviewed together with your submitted app.","type":"text"}],"type":"paragraph"}],"type":"aside"}]}],"type":"orderedList"},{"level":2,"anchor":"Legal-Compliance","text":"Legal Compliance","type":"heading"},{"items":[{"content":[{"inlineContent":[{"inlineContent":[{"text":"Accept Latest ‘Paid Apps Agreement’","type":"text"}],"type":"strong"}],"type":"paragraph"},{"items":[{"content":[{"inlineContent":[{"text":"Go to ‘Business’ tab in ","type":"text"},{"identifier":"https:\/\/appstoreconnect.apple.com\/business","isActive":true,"type":"reference"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Accept the latest agreement"}]}]}],"type":"unorderedList"}]},{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"text":"Add Privacy Policy Link","type":"text"}]}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"In App Store Connect:"}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Go to your app’s page > ‘App Privacy’"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Add Privacy Policy URL"}]}]}]}]}]}]},{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"text":"Set Up Privacy Labels in App Store Connect","type":"text"}],"type":"strong"}]},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"text":"Go to your app’s page > ‘App Privacy’","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Select “Purchases” for data types"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Choose “Analytics” and “App Functionality” within “Purchases”"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Answer subsequent questions with ‘No’ (we don’t collect user-identifiable data)"}]}]}]},{"inlineContent":[{"type":"image","identifier":"AppPrivacy-Purchases"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"text":"Include Apple’s EULA in App Description","type":"text"}]}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"text":"Add this to your App Store description (all locales):","type":"text"}],"type":"paragraph"},{"syntax":null,"code":["----- Legal Notice ----- ","Terms of Use (EULA): https:\/\/www.apple.com\/legal\/internet-services\/itunes\/dev\/stdeula\/"],"type":"codeListing"}]}]}]},{"content":[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Link to Privacy & Terms in your App"}],"type":"strong"}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"Within Your App:"}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Add a link for Privacy and Terms in settings menu or Help menu (Mac)","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"For iOS, example code:","type":"text"}]},{"syntax":"swift","code":["import SwiftUI","","struct SettingsView: View {"," @Environment(\\.openURL) private var openURL",""," var body: some View {"," Form {"," \/\/ ..."," #if !os(macOS)"," Section {"," Button(\"Terms and Conditions\", systemImage: \"text.book.closed\") {"," self.openURL(URL(string: \"https:\/\/www.apple.com\/legal\/internet-services\/itunes\/dev\/stdeula\/\")!)"," }"," Button(\"Privacy\", systemImage: \"lock\") {"," self.openURL(URL(string: \"https:\/\/www.fline.dev\/app-privacy-analytics-en\/\")!)"," }"," }"," #endif"," }"," }","}"],"type":"codeListing"}]},{"content":[{"inlineContent":[{"type":"text","text":"For macOS, example code:"}],"type":"paragraph"},{"type":"codeListing","syntax":"swift","code":["import SwiftUI","","@main","struct YourApp: App {"," @Environment(\\.openURL) private var openURL",""," var body: some Scene {"," WindowGroup {"," \/\/ ..."," }"," #if os(macOS)"," .commands {"," CommandGroup(replacing: .help) {"," Button(\"Terms and Conditions\") {"," self.openURL(URL(string: \"https:\/\/www.apple.com\/legal\/internet-services\/itunes\/dev\/stdeula\/\")!)"," }"," Button(\"Privacy\") {"," self.openURL(URL(string: \"https:\/\/www.fline.dev\/app-privacy-analytics-en\/\")!)"," }"," }"," }"," #endif"," }","}"]}]}]},{"style":"note","content":[{"type":"paragraph","inlineContent":[{"text":"You can optionally add these links to your paywall using “Auxiliary Buttons” in the FreemiumKit paywall editor, but it’s not a requirement. They are only required directly within your app to ensure users can access them even without\/before\/after making a purchase.","type":"text"}]}],"name":"Note","type":"aside"}]}]}]}],"type":"orderedList"},{"level":2,"anchor":"Transparent-Communication","text":"Transparent Communication","type":"heading"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Label Paid Features in App Description"}],"type":"strong"}]},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"If you mention features that require payment, clearly indicate that in your description"}],"type":"paragraph"}]}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Label Paid Features in Screenshots and Previews","type":"text"}]}]},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"If featuring premium content, add a label like “Premium Feature” \/ “Requires Subscription”"}]}]},{"content":[{"inlineContent":[{"text":"For app preview videos, add a text overlay when showing premium features","type":"text"}],"type":"paragraph"}]}]}]}],"type":"orderedList"},{"style":"tip","name":"Tip","type":"aside","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Apps offering limited free features (e.g., one free project) might pass review without mentioning in-app purchases. However, for transparency and user trust, it’s better to disclose free limits in your description."}]}]},{"level":2,"anchor":"Conclusion","text":"Conclusion","type":"heading"},{"type":"paragraph","inlineContent":[{"text":"Following this checklist will help ensure a smoother app review process when using FreemiumKit for in-app purchases. Remember to thoroughly test your app before submission and stay updated with Apple’s latest guidelines.","type":"text"}]},{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/freemiumkit.app","isActive":true,"type":"reference"}]},{"level":2,"anchor":"Support","text":"Support","type":"heading"},{"type":"paragraph","inlineContent":[{"type":"text","text":"For questions or support, contact: "},{"type":"reference","identifier":"mailto:freemiumkit@fline.dev","isActive":true}]},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}]}]}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"schemaVersion":{"patch":0,"major":0,"minor":3},"kind":"article","abstract":[{"text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs).","type":"text"}],"metadata":{"roleHeading":"FreemiumKit","role":"article","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"Checklist to Pass App Review"},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist"},"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]}],"references":{"https://www.fline.dev/imprint/":{"titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link","url":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","identifier":"https:\/\/www.fline.dev\/imprint\/"},"FreemiumKit.png":{"alt":null,"type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"identifier":"FreemiumKit.png"},"https://appstoreconnect.apple.com/business":{"titleInlineContent":[{"text":"App Store Connect","type":"text"}],"type":"link","url":"https:\/\/appstoreconnect.apple.com\/business","title":"App Store Connect","identifier":"https:\/\/appstoreconnect.apple.com\/business"},"https://freemiumkit.app":{"titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"type":"link","url":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","identifier":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}],"title":"SDK Setup Guide","type":"topic","url":"\/documentation\/freemiumkit\/setupguide","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"},"mailto:freemiumkit@fline.dev":{"titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"type":"link","url":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev"},"SelectPurchases":{"alt":"Select Purchases","type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/SelectPurchases.png"}],"identifier":"SelectPurchases"},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","title":"Paid to Freemium Migration Guide","url":"\/documentation\/freemiumkit\/migratefrompaid","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","kind":"article"},"AppPrivacy-Purchases":{"alt":"Purchase History Setup","type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/AppPrivacy-Purchases.png"}],"identifier":"AppPrivacy-Purchases"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-fixcrashonstart.json b/data/documentation/freemiumkit/faq-fixcrashonstart.json index 9cd8178..20ec51c 100644 --- a/data/documentation/freemiumkit/faq-fixcrashonstart.json +++ b/data/documentation/freemiumkit/faq-fixcrashonstart.json @@ -1 +1 @@ -{"sections":[],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"kind":"article","seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"primaryContentSections":[{"kind":"content","content":[{"type":"heading","anchor":"Short-Answer","level":2,"text":"Short Answer"},{"type":"paragraph","inlineContent":[{"text":"Make sure that your ","type":"text"},{"type":"codeVoice","code":"Runpath Search Paths"},{"text":" build setting in Xcode has both ","type":"text"},{"type":"codeVoice","code":"@executable_path\/Frameworks"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"@executable_path\/..\/Frameworks"},{"text":" in it. If one is missing, the SDK binary won’t be found.","type":"text"}]},{"type":"heading","anchor":"Full-Answer","level":2,"text":"Full Answer"},{"type":"paragraph","inlineContent":[{"type":"text","text":"FreemiumKit ships with an SDK binary that is automatically copied & handled by Xcode. While everything should work out of the box for most users, in some cases (depending on which version of Xcode created your project) your build settings might not be set up correctly. You might not notice an issue during DEBUG builds, but when you archive your project and upload it to TestFlight or to the App Store, the build settings need to be correct."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The fix is very easy:"}]},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"Select your app target in Xcode"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"Navigate to the “Build Settings” tab","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"In the top right ‘Filter’ search field, enter "},{"code":"runpath","type":"codeVoice"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Double-click the ","type":"text"},{"code":"Runpath Search Paths","type":"codeVoice"},{"text":" setting to reveal the list","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Make sure both ","type":"text"},{"code":"@executable_path\/Frameworks","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"@executable_path\/..\/Frameworks","type":"codeVoice"},{"text":" are in the list","type":"text"}]}]},{"content":[{"inlineContent":[{"text":"If one of them is missing, add it by using the plus button in the bottom left corner of the modal","type":"text"}],"type":"paragraph"}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"And that’s it, this should ensure that your app searches for the FreemiumKit SDK on the right paths and fix any app start issues. You can archive and upload a new build and everything should work on TestFlight \/ App Store."}]},{"type":"paragraph","inlineContent":[{"isActive":true,"identifier":"https:\/\/freemiumkit.app","type":"reference"}]},{"type":"heading","anchor":"Contact","level":2,"text":"Contact"},{"inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"type":"reference","isActive":true,"identifier":"mailto:freemiumkit@fline.dev"},{"type":"text","text":"."}],"type":"paragraph"},{"anchor":"Legal","type":"heading","level":2,"text":"Legal"},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"isActive":true,"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference"}],"type":"small"}]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings.","type":"text"}],"metadata":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","roleHeading":"FAQs","role":"sampleCode"},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","interfaceLanguage":"swift"},"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"https://www.fline.dev/imprint/":{"type":"link","title":"Imprint","titleInlineContent":[{"text":"Imprint","type":"text"}],"url":"https:\/\/www.fline.dev\/imprint\/","identifier":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"FreemiumKit.png":{"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"type":"image","alt":null},"mailto:freemiumkit@fline.dev":{"titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"identifier":"mailto:freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev","type":"link","title":"freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"https://freemiumkit.app":{"titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"identifier":"https:\/\/freemiumkit.app","url":"https:\/\/freemiumkit.app","type":"link","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"}}} \ No newline at end of file +{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"primaryContentSections":[{"kind":"content","content":[{"level":2,"text":"Short Answer","anchor":"Short-Answer","type":"heading"},{"inlineContent":[{"type":"text","text":"Make sure that your "},{"type":"codeVoice","code":"Runpath Search Paths"},{"type":"text","text":" build setting in Xcode has both "},{"type":"codeVoice","code":"@executable_path\/Frameworks"},{"type":"text","text":" and "},{"type":"codeVoice","code":"@executable_path\/..\/Frameworks"},{"type":"text","text":" in it. If one is missing, the SDK binary won’t be found."}],"type":"paragraph"},{"level":2,"text":"Full Answer","anchor":"Full-Answer","type":"heading"},{"inlineContent":[{"type":"text","text":"FreemiumKit ships with an SDK binary that is automatically copied & handled by Xcode. While everything should work out of the box for most users, in some cases (depending on which version of Xcode created your project) your build settings might not be set up correctly. You might not notice an issue during DEBUG builds, but when you archive your project and upload it to TestFlight or to the App Store, the build settings need to be correct."}],"type":"paragraph"},{"inlineContent":[{"text":"The fix is very easy:","type":"text"}],"type":"paragraph"},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Select your app target in Xcode"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Navigate to the “Build Settings” tab"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"In the top right ‘Filter’ search field, enter "},{"type":"codeVoice","code":"runpath"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Double-click the "},{"type":"codeVoice","code":"Runpath Search Paths"},{"type":"text","text":" setting to reveal the list"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Make sure both ","type":"text"},{"code":"@executable_path\/Frameworks","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"@executable_path\/..\/Frameworks","type":"codeVoice"},{"text":" are in the list","type":"text"}]}]},{"content":[{"inlineContent":[{"text":"If one of them is missing, add it by using the plus button in the bottom left corner of the modal","type":"text"}],"type":"paragraph"}]}],"type":"orderedList"},{"inlineContent":[{"text":"And that’s it, this should ensure that your app searches for the FreemiumKit SDK on the right paths and fix any app start issues. You can archive and upload a new build and everything should work on TestFlight \/ App Store.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/freemiumkit.app"}],"type":"paragraph"},{"level":2,"text":"Contact","anchor":"Contact","type":"heading"},{"inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","isActive":true,"type":"reference"},{"text":".","type":"text"}],"type":"paragraph"},{"level":2,"text":"Legal","anchor":"Legal","type":"heading"},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true,"type":"reference"}],"type":"small"}]}],"schemaVersion":{"minor":3,"major":0,"patch":0},"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"sections":[],"abstract":[{"text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings.","type":"text"}],"metadata":{"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","roleHeading":"FAQs"},"kind":"article","references":{"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"text":"Imprint","type":"text"}],"url":"https:\/\/www.fline.dev\/imprint\/","type":"link","title":"Imprint"},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"FreemiumKit.png":{"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"alt":null,"type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"https://freemiumkit.app":{"identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"url":"https:\/\/freemiumkit.app","type":"link","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev","type":"link","title":"freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-howitworks.json b/data/documentation/freemiumkit/faq-howitworks.json index 095fcc2..57c0281 100644 --- a/data/documentation/freemiumkit/faq-howitworks.json +++ b/data/documentation/freemiumkit/faq-howitworks.json @@ -1 +1 @@ -{"abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"metadata":{"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","roleHeading":"FAQs"},"schemaVersion":{"patch":0,"minor":3,"major":0},"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"primaryContentSections":[{"kind":"content","content":[{"anchor":"Short-Answer","type":"heading","level":2,"text":"Short Answer"},{"type":"paragraph","inlineContent":[{"type":"text","text":"FreemiumKit is built on top of StoreKit 2 and official App Store Connect APIs. Therefore, most of what FreemiumKit does is following modern Apple best practices, without being dependent on our servers. For the paywall remote configuration, we use a Content Delivery Network (CDN) for fast global distribution – but there’s also a local fallback in your project, in case of downtimes."}]},{"anchor":"Full-Answer","type":"heading","level":2,"text":"Full Answer"},{"type":"paragraph","inlineContent":[{"text":"FreemiumKit is here to automate the cumbersome and fiddly steps in setting up and maintaining purchases for your app. Our goal is not to cover every possible pricing model, neither is it to support all technological stacks. For example, we will probably never support Android. Instead, we keep the scope focused on the most modern Apple technologies and pricing concepts.","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"We will always try to support all Apple platforms you can choose as a destination for your target in Xcode and keep up with the latest OS releases. We will always prefer official APIs over private APIs and keep every dependency out that is not absolutely needed. This means, we stick to official Apple APIs wherever possible.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This is the resulting current tech stack:"}]},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Native apps for iOS, macOS, and visionOS (tvOS has no biometric authentication)"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"App connects to official "},{"identifier":"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/","isActive":true,"type":"reference"},{"type":"text","text":" endpoints to handle purchases"}]}]},{"content":[{"inlineContent":[{"identifier":"https:\/\/developer.apple.com\/xcode\/swiftui\/","type":"reference","isActive":true},{"type":"text","text":" SDK targeting iOS, macOS, visionOS, and tvOS (coming soon)"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"SDK is built on top of ","type":"text"},{"identifier":"https:\/\/developer.apple.com\/storekit\/","isActive":true,"type":"reference"},{"text":" and SwiftUI 3 (supporting iOS\/tvOS 15+, macOS 12+, visionOS 1+)","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/vapor.codes","isActive":true,"type":"reference"},{"type":"text","text":"-based server for push notifications when purchases are made (reported by SDK)"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/supabase.com"},{"text":"-based Content Delivery Network (CDN) for remote configuration of paywalls","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/developer.apple.com\/icloud\/cloudkit\/","type":"reference","isActive":true},{"type":"text","text":"-based persistence of purchase history in your Apple Account for backup & sync"}]}]}],"type":"unorderedList"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The only non-Apple technologies here are our server and CDN. We included these dependencies in a thoughtful manner – let’s suppose the worst case happens and both are offline, then:"}]},{"items":[{"content":[{"inlineContent":[{"text":"❌ You would no longer receive ","type":"text"},{"inlineContent":[{"text":"live push notifications","type":"text"}],"type":"strong"},{"text":" when users make purchases (not mission-critical)","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"❌ You would no longer be able to ","type":"text"},{"inlineContent":[{"type":"text","text":"remotely configure"}],"type":"strong"},{"text":" your paywall or A\/B test (not mission-critical)","type":"text"}]}]},{"content":[{"inlineContent":[{"type":"text","text":"✅ The "},{"inlineContent":[{"text":"Paywall","type":"text"}],"type":"strong"},{"type":"text","text":" UI would continue to work, using the local “fallback” configuration"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"✅ Users can continue to ","type":"text"},{"inlineContent":[{"text":"make purchases","type":"text"}],"type":"strong"},{"text":", as the SDK only needs StoreKit 2 for that","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"✅ Even paying users will continue to "},{"type":"strong","inlineContent":[{"text":"have access to paid features","type":"text"}]},{"type":"text","text":" (via StoreKit 2)"}],"type":"paragraph"}]}],"type":"unorderedList"},{"type":"paragraph","inlineContent":[{"text":"Of course, we don’t expect our servers to be down any significant amount of time. This was just to show you that we have considered all cases when designing FreemiumKit conceptually. And because all the purchases are directly configured on App Store Connect, you could even decide to move away from FreemiumKit entirely if you find our feature set does not fulfill your needs. There are no lock-in features. But beware, you will miss all our built-in conveniences! 😉","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/freemiumkit.app"}]},{"text":"Contact","level":2,"anchor":"Contact","type":"heading"},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"isActive":true,"type":"reference","identifier":"mailto:freemiumkit@fline.dev"},{"text":".","type":"text"}]},{"text":"Legal","level":2,"anchor":"Legal","type":"heading"},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}]}]}],"kind":"article","seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"https://www.fline.dev/imprint/":{"url":"https:\/\/www.fline.dev\/imprint\/","identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link","title":"Imprint"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"https://developer.apple.com/xcode/swiftui/":{"url":"https:\/\/developer.apple.com\/xcode\/swiftui\/","identifier":"https:\/\/developer.apple.com\/xcode\/swiftui\/","titleInlineContent":[{"text":"SwiftUI","type":"text"}],"type":"link","title":"SwiftUI"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"https://freemiumkit.app":{"url":"https:\/\/freemiumkit.app","identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"type":"link","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"https://vapor.codes":{"url":"https:\/\/vapor.codes","identifier":"https:\/\/vapor.codes","titleInlineContent":[{"text":"Vapor","type":"text"}],"type":"link","title":"Vapor"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"https://supabase.com":{"url":"https:\/\/supabase.com","identifier":"https:\/\/supabase.com","titleInlineContent":[{"text":"Supabase","type":"text"}],"type":"link","title":"Supabase"},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}]},"https://developer.apple.com/icloud/cloudkit/":{"url":"https:\/\/developer.apple.com\/icloud\/cloudkit\/","identifier":"https:\/\/developer.apple.com\/icloud\/cloudkit\/","titleInlineContent":[{"text":"CloudKit","type":"text"}],"type":"link","title":"CloudKit"},"https://developer.apple.com/storekit/":{"url":"https:\/\/developer.apple.com\/storekit\/","identifier":"https:\/\/developer.apple.com\/storekit\/","titleInlineContent":[{"text":"StoreKit 2","type":"text"}],"type":"link","title":"StoreKit 2"},"https://developer.apple.com/documentation/appstoreconnectapi/":{"url":"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/","identifier":"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/","titleInlineContent":[{"text":"App Store Connect API","type":"text"}],"type":"link","title":"App Store Connect API"},"mailto:freemiumkit@fline.dev":{"url":"mailto:freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"type":"link","title":"freemiumkit@fline.dev"}}} \ No newline at end of file +{"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"kind":"article","seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"primaryContentSections":[{"kind":"content","content":[{"text":"Short Answer","type":"heading","level":2,"anchor":"Short-Answer"},{"type":"paragraph","inlineContent":[{"type":"text","text":"FreemiumKit is built on top of StoreKit 2 and official App Store Connect APIs. Therefore, most of what FreemiumKit does is following modern Apple best practices, without being dependent on our servers. For the paywall remote configuration, we use a Content Delivery Network (CDN) for fast global distribution – but there’s also a local fallback in your project, in case of downtimes."}]},{"text":"Full Answer","type":"heading","level":2,"anchor":"Full-Answer"},{"type":"paragraph","inlineContent":[{"text":"FreemiumKit is here to automate the cumbersome and fiddly steps in setting up and maintaining purchases for your app. Our goal is not to cover every possible pricing model, neither is it to support all technological stacks. For example, we will probably never support Android. Instead, we keep the scope focused on the most modern Apple technologies and pricing concepts.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"We will always try to support all Apple platforms you can choose as a destination for your target in Xcode and keep up with the latest OS releases. We will always prefer official APIs over private APIs and keep every dependency out that is not absolutely needed. This means, we stick to official Apple APIs wherever possible."}]},{"type":"paragraph","inlineContent":[{"text":"This is the resulting current tech stack:","type":"text"}]},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Native apps for iOS, macOS, and visionOS (tvOS has no biometric authentication)","type":"text"}]}]},{"content":[{"inlineContent":[{"type":"text","text":"App connects to official "},{"isActive":true,"identifier":"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/","type":"reference"},{"text":" endpoints to handle purchases","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"reference","identifier":"https:\/\/developer.apple.com\/xcode\/swiftui\/","isActive":true},{"type":"text","text":" SDK targeting iOS, macOS, visionOS, and tvOS (coming soon)"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"SDK is built on top of "},{"type":"reference","isActive":true,"identifier":"https:\/\/developer.apple.com\/storekit\/"},{"type":"text","text":" and SwiftUI 3 (supporting iOS\/tvOS 15+, macOS 12+, visionOS 1+)"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"isActive":true,"identifier":"https:\/\/vapor.codes","type":"reference"},{"text":"-based server for push notifications when purchases are made (reported by SDK)","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"isActive":true,"identifier":"https:\/\/supabase.com","type":"reference"},{"text":"-based Content Delivery Network (CDN) for remote configuration of paywalls","type":"text"}]}]},{"content":[{"inlineContent":[{"isActive":true,"identifier":"https:\/\/developer.apple.com\/icloud\/cloudkit\/","type":"reference"},{"text":"-based persistence of purchase history in your Apple Account for backup & sync","type":"text"}],"type":"paragraph"}]}],"type":"unorderedList"},{"type":"paragraph","inlineContent":[{"text":"The only non-Apple technologies here are our server and CDN. We included these dependencies in a thoughtful manner – let’s suppose the worst case happens and both are offline, then:","type":"text"}]},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"❌ You would no longer receive "},{"type":"strong","inlineContent":[{"text":"live push notifications","type":"text"}]},{"type":"text","text":" when users make purchases (not mission-critical)"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"❌ You would no longer be able to ","type":"text"},{"inlineContent":[{"type":"text","text":"remotely configure"}],"type":"strong"},{"text":" your paywall or A\/B test (not mission-critical)","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ The "},{"inlineContent":[{"text":"Paywall","type":"text"}],"type":"strong"},{"type":"text","text":" UI would continue to work, using the local “fallback” configuration"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"✅ Users can continue to ","type":"text"},{"type":"strong","inlineContent":[{"text":"make purchases","type":"text"}]},{"text":", as the SDK only needs StoreKit 2 for that","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ Even paying users will continue to "},{"type":"strong","inlineContent":[{"type":"text","text":"have access to paid features"}]},{"type":"text","text":" (via StoreKit 2)"}]}]}],"type":"unorderedList"},{"type":"paragraph","inlineContent":[{"text":"Of course, we don’t expect our servers to be down any significant amount of time. This was just to show you that we have considered all cases when designing FreemiumKit conceptually. And because all the purchases are directly configured on App Store Connect, you could even decide to move away from FreemiumKit entirely if you find our feature set does not fulfill your needs. There are no lock-in features. But beware, you will miss all our built-in conveniences! 😉","type":"text"}]},{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/freemiumkit.app","type":"reference","isActive":true}]},{"text":"Contact","type":"heading","level":2,"anchor":"Contact"},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"isActive":true,"identifier":"mailto:freemiumkit@fline.dev","type":"reference"},{"text":".","type":"text"}]},{"text":"Legal","type":"heading","level":2,"anchor":"Legal"},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}]}]}],"metadata":{"title":"How does FreemiumKit work? Can I trust it?","role":"sampleCode","roleHeading":"FAQs"},"sections":[],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"schemaVersion":{"major":0,"patch":0,"minor":3},"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"mailto:freemiumkit@fline.dev":{"title":"freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev","type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"https://developer.apple.com/icloud/cloudkit/":{"title":"CloudKit","identifier":"https:\/\/developer.apple.com\/icloud\/cloudkit\/","titleInlineContent":[{"text":"CloudKit","type":"text"}],"url":"https:\/\/developer.apple.com\/icloud\/cloudkit\/","type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"https://developer.apple.com/storekit/":{"identifier":"https:\/\/developer.apple.com\/storekit\/","titleInlineContent":[{"text":"StoreKit 2","type":"text"}],"url":"https:\/\/developer.apple.com\/storekit\/","title":"StoreKit 2","type":"link"},"https://supabase.com":{"title":"Supabase","identifier":"https:\/\/supabase.com","titleInlineContent":[{"text":"Supabase","type":"text"}],"url":"https:\/\/supabase.com","type":"link"},"https://vapor.codes":{"identifier":"https:\/\/vapor.codes","titleInlineContent":[{"text":"Vapor","type":"text"}],"url":"https:\/\/vapor.codes","title":"Vapor","type":"link"},"FreemiumKit.png":{"identifier":"FreemiumKit.png","alt":null,"type":"image","variants":[{"url":"\/images\/FreemiumKit.png","traits":["1x","light"]}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]},"https://freemiumkit.app":{"title":"🏠 Back to Home","identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"url":"https:\/\/freemiumkit.app","type":"link"},"https://developer.apple.com/xcode/swiftui/":{"title":"SwiftUI","identifier":"https:\/\/developer.apple.com\/xcode\/swiftui\/","titleInlineContent":[{"type":"text","text":"SwiftUI"}],"url":"https:\/\/developer.apple.com\/xcode\/swiftui\/","type":"link"},"https://developer.apple.com/documentation/appstoreconnectapi/":{"title":"App Store Connect API","identifier":"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/","titleInlineContent":[{"type":"text","text":"App Store Connect API"}],"url":"https:\/\/developer.apple.com\/documentation\/appstoreconnectapi\/","type":"link"},"https://www.fline.dev/imprint/":{"title":"Imprint","identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"type":"text","text":"Imprint"}],"url":"https:\/\/www.fline.dev\/imprint\/","type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-legacyproducts.json b/data/documentation/freemiumkit/faq-legacyproducts.json index 9cb7dba..8065272 100644 --- a/data/documentation/freemiumkit/faq-legacyproducts.json +++ b/data/documentation/freemiumkit/faq-legacyproducts.json @@ -1 +1 @@ -{"schemaVersion":{"patch":0,"minor":3,"major":0},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"]}],"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","interfaceLanguage":"swift"},"sections":[],"primaryContentSections":[{"content":[{"anchor":"Short-Answer","type":"heading","text":"Short Answer","level":2},{"type":"paragraph","inlineContent":[{"text":"Disabling products without users losing access involves three steps:","type":"text"}]},{"type":"orderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Disable the checkmark for your legacy product in the “Products” tab within FreemiumKit.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Press on “Save Changes to Remote” on the “Paywalls” tab within FreemiumKit to save the changes.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Upon your apps’ start, call "},{"type":"codeVoice","code":"FreemiumKit.shared.legacyProductsIDsByTier"},{"type":"text","text":" on the SDK to mark products as legacy while specifying their access level."}]}]}]},{"anchor":"Full-Answer","type":"heading","text":"Full Answer","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"Once purchases are created, submitted, and approved on the App Store, you no longer can rename their product ID or safely delete them without losing paying customers. So if you want to “clean up” your products for whatever reasons, it’s a good idea to keep the existing products on App Store Connect."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"With FreemiumKit, it’s easy to mark products you had created in the past as “legacy”. First, you need to do some setup within the FreemiumKit app:"}]},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"For each products you want to mark as “legacy”, uncheck the checkbox in front of the product in the “Products” tab."}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"Press on “Save Changes to Remote” on the “Paywalls” tab.","type":"text"}],"type":"paragraph"}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"This makes sure that your legacy products are no longer shown in the paywall. But it doesn’t give your users access to the features they already paid for."}]},{"type":"paragraph","inlineContent":[{"text":"For that, you need to additionally make a call on app start using the FreemiumKit SDK like so:","type":"text"}]},{"type":"codeListing","code":["@main","struct YourApp: App {"," init() {"," FreemiumKit.shared.legacyProductsIDsByTier = ["," 1: ["," \"Premium.Weekly\","," \"Premium.Weekly.Alternative\","," \"Premium.Monthly.Alternative\","," \"Premium.Yearly.Alternative\","," \"Premium.Lifetime.Alternative\","," ]"," ]"," }",""," \/\/ ...","}"],"syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"This makes sure any existing customers who purchased the no longer sold ","type":"text"},{"code":"Premium.Weekly","type":"codeVoice"},{"text":" product still have access to the features of tier 1.","type":"text"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"The App Store Review team may get confused when you submit new products with an app update but your paywall doesn’t include your old products. Make sure to explain in your review notes that you are no longer selling the old products (you might even rename them by adding the suffix “- Legacy” on Connect) but existing customers will continue to have access.","type":"text"}]}],"type":"aside","style":"tip","name":"Tip"},{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/freemiumkit.app"}]},{"text":"Contact","level":2,"type":"heading","anchor":"Contact"},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","isActive":true,"type":"reference"},{"text":".","type":"text"}]},{"text":"Legal","level":2,"type":"heading","anchor":"Legal"},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}]}],"kind":"content"}],"metadata":{"roleHeading":"FAQs","role":"sampleCode","title":"How can I disable old products without customers losing access?"},"kind":"article","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"https://www.fline.dev/imprint/":{"type":"link","titleInlineContent":[{"type":"text","text":"Imprint"}],"url":"https:\/\/www.fline.dev\/imprint\/","identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"https://freemiumkit.app":{"type":"link","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"url":"https:\/\/freemiumkit.app","identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"FreemiumKit.png":{"type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"identifier":"FreemiumKit.png","alt":null},"mailto:freemiumkit@fline.dev":{"type":"link","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"url":"mailto:freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev"}}} \ No newline at end of file +{"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"]}],"schemaVersion":{"minor":3,"major":0,"patch":0},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"kind":"article","metadata":{"role":"sampleCode","roleHeading":"FAQs","title":"How can I disable old products without customers losing access?"},"abstract":[{"text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected.","type":"text"}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"sections":[],"primaryContentSections":[{"kind":"content","content":[{"text":"Short Answer","level":2,"type":"heading","anchor":"Short-Answer"},{"inlineContent":[{"type":"text","text":"Disabling products without users losing access involves three steps:"}],"type":"paragraph"},{"type":"orderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Disable the checkmark for your legacy product in the “Products” tab within FreemiumKit.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Press on “Save Changes to Remote” on the “Paywalls” tab within FreemiumKit to save the changes.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Upon your apps’ start, call ","type":"text"},{"code":"FreemiumKit.shared.legacyProductsIDsByTier","type":"codeVoice"},{"text":" on the SDK to mark products as legacy while specifying their access level.","type":"text"}]}]}]},{"text":"Full Answer","level":2,"type":"heading","anchor":"Full-Answer"},{"inlineContent":[{"type":"text","text":"Once purchases are created, submitted, and approved on the App Store, you no longer can rename their product ID or safely delete them without losing paying customers. So if you want to “clean up” your products for whatever reasons, it’s a good idea to keep the existing products on App Store Connect."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"With FreemiumKit, it’s easy to mark products you had created in the past as “legacy”. First, you need to do some setup within the FreemiumKit app:"}],"type":"paragraph"},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"text":"For each products you want to mark as “legacy”, uncheck the checkbox in front of the product in the “Products” tab.","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Press on “Save Changes to Remote” on the “Paywalls” tab."}],"type":"paragraph"}]}]},{"inlineContent":[{"type":"text","text":"This makes sure that your legacy products are no longer shown in the paywall. But it doesn’t give your users access to the features they already paid for."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"For that, you need to additionally make a call on app start using the FreemiumKit SDK like so:"}],"type":"paragraph"},{"code":["@main","struct YourApp: App {"," init() {"," FreemiumKit.shared.legacyProductsIDsByTier = ["," 1: ["," \"Premium.Weekly\","," \"Premium.Weekly.Alternative\","," \"Premium.Monthly.Alternative\","," \"Premium.Yearly.Alternative\","," \"Premium.Lifetime.Alternative\","," ]"," ]"," }",""," \/\/ ...","}"],"type":"codeListing","syntax":"swift"},{"inlineContent":[{"text":"This makes sure any existing customers who purchased the no longer sold ","type":"text"},{"type":"codeVoice","code":"Premium.Weekly"},{"text":" product still have access to the features of tier 1.","type":"text"}],"type":"paragraph"},{"name":"Tip","type":"aside","style":"tip","content":[{"inlineContent":[{"text":"The App Store Review team may get confused when you submit new products with an app update but your paywall doesn’t include your old products. Make sure to explain in your review notes that you are no longer selling the old products (you might even rename them by adding the suffix “- Legacy” on Connect) but existing customers will continue to have access.","type":"text"}],"type":"paragraph"}]},{"inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/freemiumkit.app"}],"type":"paragraph"},{"text":"Contact","level":2,"type":"heading","anchor":"Contact"},{"inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","isActive":true,"type":"reference"},{"text":".","type":"text"}],"type":"paragraph"},{"text":"Legal","level":2,"type":"heading","anchor":"Legal"},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true,"type":"reference"}],"type":"small"}]}],"references":{"https://www.fline.dev/imprint/":{"titleInlineContent":[{"text":"Imprint","type":"text"}],"identifier":"https:\/\/www.fline.dev\/imprint\/","url":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","type":"link"},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"FreemiumKit.png":{"identifier":"FreemiumKit.png","alt":null,"type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"https://freemiumkit.app":{"titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"identifier":"https:\/\/freemiumkit.app","url":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"mailto:freemiumkit@fline.dev":{"titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"identifier":"mailto:freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-migratefrompaidupfront.json b/data/documentation/freemiumkit/faq-migratefrompaidupfront.json index 5e1e9bf..f57e932 100644 --- a/data/documentation/freemiumkit/faq-migratefrompaidupfront.json +++ b/data/documentation/freemiumkit/faq-migratefrompaidupfront.json @@ -1 +1 @@ -{"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"primaryContentSections":[{"content":[{"type":"heading","text":"Short Answer","level":2,"anchor":"Short-Answer"},{"inlineContent":[{"type":"text","text":"Our SDK uses Apples "},{"type":"reference","isActive":true,"identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction"},{"type":"text","text":" in StoreKit to determine users who purchased your paid app before you migrated it to the Freemium model. And for new users, it works normally. You just need to tell our SDK which was the last paid version and build number like this:"}],"type":"paragraph"},{"syntax":"swift","code":["FreemiumKit.shared.lastPaidRelease(version: \"1.5.1\", build: 25)"],"type":"codeListing"},{"type":"heading","text":"Full Answer","level":2,"anchor":"Full-Answer"},{"inlineContent":[{"type":"text","text":"Read our full guide here:"}],"type":"paragraph"},{"style":"list","type":"links","items":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid"]},{"inlineContent":[{"type":"reference","identifier":"https:\/\/freemiumkit.app","isActive":true}],"type":"paragraph"},{"type":"heading","text":"Contact","level":2,"anchor":"Contact"},{"inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"isActive":true,"type":"reference","identifier":"mailto:freemiumkit@fline.dev"},{"type":"text","text":"."}],"type":"paragraph"},{"type":"heading","text":"Legal","level":2,"anchor":"Legal"},{"inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}],"type":"small"}],"kind":"content"}],"kind":"article","metadata":{"roleHeading":"FAQs","title":"My app is paid-up-front. How can I make it Freemium?","role":"sampleCode"},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront"},"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"https://www.fline.dev/imprint/":{"url":"https:\/\/www.fline.dev\/imprint\/","type":"link","titleInlineContent":[{"type":"text","text":"Imprint"}],"title":"Imprint","identifier":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"https://freemiumkit.app":{"url":"https:\/\/freemiumkit.app","type":"link","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"title":"🏠 Back to Home","identifier":"https:\/\/freemiumkit.app"},"https://developer.apple.com/documentation/storekit/supporting_business_model_changes_by_using_the_app_transaction":{"url":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","type":"link","titleInlineContent":[{"type":"text","text":"built-in solution"}],"title":"built-in solution","identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","type":"topic","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"url":"\/documentation\/freemiumkit\/migratefrompaid","title":"Paid to Freemium Migration Guide","kind":"article"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"FreemiumKit.png":{"alt":null,"type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"identifier":"FreemiumKit.png"},"mailto:freemiumkit@fline.dev":{"type":"link","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev"}}} \ No newline at end of file +{"primaryContentSections":[{"content":[{"level":2,"text":"Short Answer","type":"heading","anchor":"Short-Answer"},{"inlineContent":[{"text":"Our SDK uses Apples ","type":"text"},{"identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","isActive":true,"type":"reference"},{"text":" in StoreKit to determine users who purchased your paid app before you migrated it to the Freemium model. And for new users, it works normally. You just need to tell our SDK which was the last paid version and build number like this:","type":"text"}],"type":"paragraph"},{"syntax":"swift","type":"codeListing","code":["FreemiumKit.shared.lastPaidRelease(version: \"1.5.1\", build: 25)"]},{"level":2,"text":"Full Answer","type":"heading","anchor":"Full-Answer"},{"inlineContent":[{"text":"Read our full guide here:","type":"text"}],"type":"paragraph"},{"style":"list","type":"links","items":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid"]},{"inlineContent":[{"identifier":"https:\/\/freemiumkit.app","type":"reference","isActive":true}],"type":"paragraph"},{"anchor":"Contact","text":"Contact","type":"heading","level":2},{"inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","type":"reference","isActive":true},{"text":".","type":"text"}],"type":"paragraph"},{"anchor":"Legal","text":"Legal","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}],"type":"small"}],"kind":"content"}],"sections":[],"kind":"article","schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}],"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"metadata":{"role":"sampleCode","title":"My app is paid-up-front. How can I make it Freemium?","roleHeading":"FAQs"},"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev","type":"link","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","title":"Paid to Freemium Migration Guide","url":"\/documentation\/freemiumkit\/migratefrompaid","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","kind":"article"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]},"https://developer.apple.com/documentation/storekit/supporting_business_model_changes_by_using_the_app_transaction":{"identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","title":"built-in solution","url":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","type":"link","titleInlineContent":[{"text":"built-in solution","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"type":"image"},"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","url":"https:\/\/www.fline.dev\/imprint\/","type":"link","titleInlineContent":[{"text":"Imprint","type":"text"}]},"https://freemiumkit.app":{"identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","url":"https:\/\/freemiumkit.app","type":"link","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}]},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-migratefromrevenuecat.json b/data/documentation/freemiumkit/faq-migratefromrevenuecat.json index 78f0159..a7f96ea 100644 --- a/data/documentation/freemiumkit/faq-migratefromrevenuecat.json +++ b/data/documentation/freemiumkit/faq-migratefromrevenuecat.json @@ -1 +1 @@ -{"metadata":{"title":"I use RevenueCat, how can I migrate?","roleHeading":"FAQs","role":"sampleCode"},"primaryContentSections":[{"kind":"content","content":[{"anchor":"Short-Answer","type":"heading","text":"Short Answer","level":2},{"type":"paragraph","inlineContent":[{"text":"Migrating from RevenueCat involves the following steps (outlined in detail below):","type":"text"}]},{"type":"orderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Set up your app & existing purchases in the FreemiumKit app (5 min)","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Integrate the FreemiumKit SDK into your app & configure it (5 min)","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Replace RevenueCat SDK calls with FreemiumKit calls (10-15 min)"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Remove the RevenueCat SDK integration from your app (5 min)"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Adjust the Paywall UI in FreemiumKit to your liking (5 min)"}]}]}]},{"anchor":"Full-Answer","type":"heading","text":"Full Answer","level":2},{"anchor":"Step-1-Set-up-your-app--purchases-in-FreemiumKit-5-min","type":"heading","text":"Step 1: Set up your app & purchases in FreemiumKit (5 min)","level":3},{"type":"orderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Download FreemiumKit and follow the simple instructions to connect to your App Store account if you’re starting it for the first time. This should take less than a minute.","type":"text"}]}]},{"content":[{"inlineContent":[{"text":"Now, press the + button at the top of the left sidebar and select the app you want to migrate and press “Add Project”.","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"Navigate to your apps “Products” tab and make sure that all purchases are listed there and have the correct tier set. Subscription tiers are detected automatically, but if you have a Lifetime Purchase, FreemiumKit can’t auto-detect the tier, so you need to press “Mark as Lifetime for Tier…” and select the right tier (most likely ‘Tier 1’).","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"Open the ‘Setup’ tab and drag & drop the config icon on the right to your apps’ Asset Catalog.","type":"text"}],"type":"paragraph"}]}]},{"anchor":"Step-2-Integrate-FreemiumKit-SDK--configure-it-5-min","type":"heading","text":"Step 2: Integrate FreemiumKit SDK & configure it (5 min)","level":3},{"type":"paragraph","inlineContent":[{"text":"For this step, simply follow the ‘Adding the SDK’ and ‘Configuring the SDK’ sections of the ","type":"text"},{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","isActive":true,"type":"reference"},{"text":" – feel free to also read the rest of the guide to get a better understanding of the next step!","type":"text"}]},{"anchor":"Step-3-Replace-RevenueCat-SDK-with-our-SDK-calls-10-15-min","type":"heading","text":"Step 3: Replace RevenueCat SDK with our SDK calls (10-15 min)","level":3},{"type":"paragraph","inlineContent":[{"text":"If you’ve been using RevenueCat with your own paywall UIs, we have good news because you no longer need to maintain your paywall code that loads ‘offerings’ and displays them – we all handle this for you!","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If this is the case, then somewhere in your project you’re checking if the current user has access to your paid features with either the async\/await call or the completion call below:"}]},{"code":["\/\/ async\/await call","let customerInfo = try await Purchases.shared.customerInfo()","","\/\/ closure-based call ","Purchases.shared.getCustomerInfo { (customerInfo, error) in"," \/\/ access latest customerInfo","}"],"syntax":"swift","type":"codeListing"},{"type":"paragraph","inlineContent":[{"text":"A quick search for ","type":"text"},{"code":"Purchases.shared.customerInfo()","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"Purchases.shared.getCustomerInfo","type":"codeVoice"},{"text":" should reveal these places. You’ll have some logic based on ","type":"text"},{"code":"customerInfo","type":"codeVoice"},{"text":" instance details that either gives the user access to your paid features or shows your paywall.","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"This logic can be completely replaced by one of our 3 APIs explained in the ‘Showing the Paywalls’ section in our ","type":"text"},{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","isActive":true,"type":"reference"},{"text":":","type":"text"}]},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"text":"Use ","type":"text"},{"code":"PaidFeatureButton","type":"codeVoice"},{"text":" or ","type":"text"},{"code":"PaidFeatureView","type":"codeVoice"},{"text":" for buttons or custom views that should only work for paying customers. Both of these views will automatically show our built-in paywall if the user didn’t purchase the required paid tier yet. These are the easiest and therefore recommended APIs for most cases – and thanks to ","type":"text"},{"code":"PaidFeatureView","type":"codeVoice"},{"text":" they’re quite flexible.","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"You can also use the ","type":"text"},{"code":".paywall(isPresented:)","type":"codeVoice"},{"text":" SwiftUI modifier with a custom check for the ","type":"text"},{"code":"purchasedTier","type":"codeVoice"},{"text":" property of ","type":"text"},{"code":"@EnvironmentObject var freemiumKit: FreemiumKit","type":"codeVoice"},{"text":" added to your SwiftUI view(s). This is more similar to how the RevenueCat SDK works with either the manual paywall or their bult-in iOS paywalls, but we still provide the paywall UI for you. This requires more code on your end, but also gives you more control if needed.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Our ","type":"text"},{"code":"PaidStatusView","type":"codeVoice"},{"text":" is a special view that we pepared for use in places where you want to simply indicate the current paid status of the user. This is a common need in the settings screen of an app and usually inside a ","type":"text"},{"code":"Form","type":"codeVoice"},{"text":" or ","type":"text"},{"code":"List","type":"codeVoice"},{"text":" view. We recommend adding it if you don’t have such a place yet as this serves also as a reminder for Free users that you have paid features they might be interested in.","type":"text"}]}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you need global access to the current user’s purchase status, you can call "},{"code":"FreemiumKit.shared.purchasedTier","type":"codeVoice"},{"type":"text","text":" from anywhwere in your app (e.g. in your models)."}]},{"type":"paragraph","inlineContent":[{"text":"Make sure your project builds before moving on to the next step.","type":"text"}]},{"anchor":"Step-4-Remove-the-RevenueCat-SDK-integration-5-min","type":"heading","text":"Step 4: Remove the RevenueCat SDK integration (5 min)","level":3},{"type":"paragraph","inlineContent":[{"type":"text","text":"Once you migrated all your code over to FreemiumKit, you can remove the RevenueCat SDK from your project. Once the dependency is removed, build your project to find places where you still are importing the RevenueCat SDKs and where you configuried it (probably in your app entry point). Remove the configuration code and all import statements. Your project should build now and the technical part of the migration process is completed! Feel free to commit. 🎉"}]},{"content":[{"inlineContent":[{"text":"While FreemiumKit is much more convenient to use than RevenueCat overall (less clicks, less code, more “built-in” stuff like localization), services like RevenueCat have been around for longer and excel at other areas like integrations with other services. If you want to keep using RevenueCat for these benefits, just put their SDK to “Observer mode” rather than removing it entirely: ","type":"text"},{"isActive":true,"type":"reference","identifier":"https:\/\/www.revenuecat.com\/docs\/migrating-to-revenuecat\/sdk-or-not\/finishing-transactions"},{"text":".","type":"text"}],"type":"paragraph"}],"name":"Tip","type":"aside","style":"tip"},{"anchor":"Step-5-Adjust-the-Paywall-UI-in-FreemiumKit-5-min","type":"heading","text":"Step 5: Adjust the Paywall UI in FreemiumKit (5 min)","level":3},{"type":"paragraph","inlineContent":[{"type":"text","text":"While at this point your app is already fully migrated to FreemiumKit, you might want to open the FreemiumKit app, select your project and open the ‘Paywalls’ tab."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Here you can see a preview of your paywall and adjust it with many configuration options. Feel free to play around with the options until you’re happy with the results and don’t forget to press ‘Save Changes to Remote’ at the end."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"You might also want to optionally delete the ‘FreemiumKit’ config file from your Asset Catalog and drag & drop the now adjusted config file from the ‘Setup’ tab. This will make sure your adjustments are also available in case the remote config file can’t be loaded on the users devices, where FreemiumKit will fall back to the local file included in the Asset Catalog."}]},{"type":"paragraph","inlineContent":[{"type":"reference","isActive":true,"identifier":"https:\/\/freemiumkit.app"}]},{"anchor":"Contact","type":"heading","text":"Contact","level":2},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","isActive":true,"type":"reference"},{"text":".","type":"text"}]},{"anchor":"Legal","type":"heading","text":"Legal","level":2},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}]}]}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","interfaceLanguage":"swift"},"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"sections":[],"schemaVersion":{"patch":0,"minor":3,"major":0},"kind":"article","references":{"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","titleInlineContent":[{"type":"text","text":"Imprint"}],"url":"https:\/\/www.fline.dev\/imprint\/","type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"https://freemiumkit.app":{"identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"url":"https:\/\/freemiumkit.app","type":"link"},"https://www.revenuecat.com/docs/migrating-to-revenuecat/sdk-or-not/finishing-transactions":{"identifier":"https:\/\/www.revenuecat.com\/docs\/migrating-to-revenuecat\/sdk-or-not\/finishing-transactions","title":"Learn more","titleInlineContent":[{"type":"text","text":"Learn more"}],"url":"https:\/\/www.revenuecat.com\/docs\/migrating-to-revenuecat\/sdk-or-not\/finishing-transactions","type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"kind":"article","url":"\/documentation\/freemiumkit\/setupguide","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","title":"SDK Setup Guide","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}]},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"url":"mailto:freemiumkit@fline.dev","type":"link"}}} \ No newline at end of file +{"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"schemaVersion":{"patch":0,"minor":3,"major":0},"abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"sections":[],"metadata":{"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","roleHeading":"FAQs"},"primaryContentSections":[{"kind":"content","content":[{"type":"heading","text":"Short Answer","anchor":"Short-Answer","level":2},{"type":"paragraph","inlineContent":[{"text":"Migrating from RevenueCat involves the following steps (outlined in detail below):","type":"text"}]},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"text":"Set up your app & existing purchases in the FreemiumKit app (5 min)","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Integrate the FreemiumKit SDK into your app & configure it (5 min)"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Replace RevenueCat SDK calls with FreemiumKit calls (10-15 min)"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Remove the RevenueCat SDK integration from your app (5 min)","type":"text"}]}]},{"content":[{"inlineContent":[{"text":"Adjust the Paywall UI in FreemiumKit to your liking (5 min)","type":"text"}],"type":"paragraph"}]}]},{"type":"heading","text":"Full Answer","anchor":"Full-Answer","level":2},{"type":"heading","text":"Step 1: Set up your app & purchases in FreemiumKit (5 min)","anchor":"Step-1-Set-up-your-app--purchases-in-FreemiumKit-5-min","level":3},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"text":"Download FreemiumKit and follow the simple instructions to connect to your App Store account if you’re starting it for the first time. This should take less than a minute.","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Now, press the + button at the top of the left sidebar and select the app you want to migrate and press “Add Project”."}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Navigate to your apps “Products” tab and make sure that all purchases are listed there and have the correct tier set. Subscription tiers are detected automatically, but if you have a Lifetime Purchase, FreemiumKit can’t auto-detect the tier, so you need to press “Mark as Lifetime for Tier…” and select the right tier (most likely ‘Tier 1’).","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"Open the ‘Setup’ tab and drag & drop the config icon on the right to your apps’ Asset Catalog.","type":"text"}]}]}]},{"type":"heading","text":"Step 2: Integrate FreemiumKit SDK & configure it (5 min)","anchor":"Step-2-Integrate-FreemiumKit-SDK--configure-it-5-min","level":3},{"type":"paragraph","inlineContent":[{"text":"For this step, simply follow the ‘Adding the SDK’ and ‘Configuring the SDK’ sections of the ","type":"text"},{"type":"reference","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","isActive":true},{"text":" – feel free to also read the rest of the guide to get a better understanding of the next step!","type":"text"}]},{"type":"heading","text":"Step 3: Replace RevenueCat SDK with our SDK calls (10-15 min)","anchor":"Step-3-Replace-RevenueCat-SDK-with-our-SDK-calls-10-15-min","level":3},{"type":"paragraph","inlineContent":[{"text":"If you’ve been using RevenueCat with your own paywall UIs, we have good news because you no longer need to maintain your paywall code that loads ‘offerings’ and displays them – we all handle this for you!","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"If this is the case, then somewhere in your project you’re checking if the current user has access to your paid features with either the async\/await call or the completion call below:","type":"text"}]},{"type":"codeListing","syntax":"swift","code":["\/\/ async\/await call","let customerInfo = try await Purchases.shared.customerInfo()","","\/\/ closure-based call ","Purchases.shared.getCustomerInfo { (customerInfo, error) in"," \/\/ access latest customerInfo","}"]},{"inlineContent":[{"type":"text","text":"A quick search for "},{"type":"codeVoice","code":"Purchases.shared.customerInfo()"},{"type":"text","text":" and "},{"type":"codeVoice","code":"Purchases.shared.getCustomerInfo"},{"type":"text","text":" should reveal these places. You’ll have some logic based on "},{"type":"codeVoice","code":"customerInfo"},{"type":"text","text":" instance details that either gives the user access to your paid features or shows your paywall."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"This logic can be completely replaced by one of our 3 APIs explained in the ‘Showing the Paywalls’ section in our "},{"isActive":true,"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","type":"reference"},{"type":"text","text":":"}],"type":"paragraph"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Use ","type":"text"},{"code":"PaidFeatureButton","type":"codeVoice"},{"text":" or ","type":"text"},{"code":"PaidFeatureView","type":"codeVoice"},{"text":" for buttons or custom views that should only work for paying customers. Both of these views will automatically show our built-in paywall if the user didn’t purchase the required paid tier yet. These are the easiest and therefore recommended APIs for most cases – and thanks to ","type":"text"},{"code":"PaidFeatureView","type":"codeVoice"},{"text":" they’re quite flexible.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"You can also use the ","type":"text"},{"code":".paywall(isPresented:)","type":"codeVoice"},{"text":" SwiftUI modifier with a custom check for the ","type":"text"},{"code":"purchasedTier","type":"codeVoice"},{"text":" property of ","type":"text"},{"code":"@EnvironmentObject var freemiumKit: FreemiumKit","type":"codeVoice"},{"text":" added to your SwiftUI view(s). This is more similar to how the RevenueCat SDK works with either the manual paywall or their bult-in iOS paywalls, but we still provide the paywall UI for you. This requires more code on your end, but also gives you more control if needed.","type":"text"}]}]},{"content":[{"inlineContent":[{"text":"Our ","type":"text"},{"code":"PaidStatusView","type":"codeVoice"},{"text":" is a special view that we pepared for use in places where you want to simply indicate the current paid status of the user. This is a common need in the settings screen of an app and usually inside a ","type":"text"},{"code":"Form","type":"codeVoice"},{"text":" or ","type":"text"},{"code":"List","type":"codeVoice"},{"text":" view. We recommend adding it if you don’t have such a place yet as this serves also as a reminder for Free users that you have paid features they might be interested in.","type":"text"}],"type":"paragraph"}]}],"type":"orderedList"},{"inlineContent":[{"type":"text","text":"If you need global access to the current user’s purchase status, you can call "},{"code":"FreemiumKit.shared.purchasedTier","type":"codeVoice"},{"type":"text","text":" from anywhwere in your app (e.g. in your models)."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"Make sure your project builds before moving on to the next step."}],"type":"paragraph"},{"text":"Step 4: Remove the RevenueCat SDK integration (5 min)","anchor":"Step-4-Remove-the-RevenueCat-SDK-integration-5-min","type":"heading","level":3},{"inlineContent":[{"type":"text","text":"Once you migrated all your code over to FreemiumKit, you can remove the RevenueCat SDK from your project. Once the dependency is removed, build your project to find places where you still are importing the RevenueCat SDKs and where you configuried it (probably in your app entry point). Remove the configuration code and all import statements. Your project should build now and the technical part of the migration process is completed! Feel free to commit. 🎉"}],"type":"paragraph"},{"name":"Tip","style":"tip","content":[{"type":"paragraph","inlineContent":[{"text":"While FreemiumKit is much more convenient to use than RevenueCat overall (less clicks, less code, more “built-in” stuff like localization), services like RevenueCat have been around for longer and excel at other areas like integrations with other services. If you want to keep using RevenueCat for these benefits, just put their SDK to “Observer mode” rather than removing it entirely: ","type":"text"},{"identifier":"https:\/\/www.revenuecat.com\/docs\/migrating-to-revenuecat\/sdk-or-not\/finishing-transactions","isActive":true,"type":"reference"},{"text":".","type":"text"}]}],"type":"aside"},{"text":"Step 5: Adjust the Paywall UI in FreemiumKit (5 min)","anchor":"Step-5-Adjust-the-Paywall-UI-in-FreemiumKit-5-min","type":"heading","level":3},{"inlineContent":[{"type":"text","text":"While at this point your app is already fully migrated to FreemiumKit, you might want to open the FreemiumKit app, select your project and open the ‘Paywalls’ tab."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"Here you can see a preview of your paywall and adjust it with many configuration options. Feel free to play around with the options until you’re happy with the results and don’t forget to press ‘Save Changes to Remote’ at the end."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"You might also want to optionally delete the ‘FreemiumKit’ config file from your Asset Catalog and drag & drop the now adjusted config file from the ‘Setup’ tab. This will make sure your adjustments are also available in case the remote config file can’t be loaded on the users devices, where FreemiumKit will fall back to the local file included in the Asset Catalog."}],"type":"paragraph"},{"inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/freemiumkit.app"}],"type":"paragraph"},{"text":"Contact","anchor":"Contact","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"type":"reference","isActive":true,"identifier":"mailto:freemiumkit@fline.dev"},{"type":"text","text":"."}],"type":"paragraph"},{"text":"Legal","anchor":"Legal","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}],"type":"small"}]}],"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"kind":"article","references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"https://freemiumkit.app":{"titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"type":"link","identifier":"https:\/\/freemiumkit.app","url":"https:\/\/freemiumkit.app","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"FreemiumKit.png":{"alt":null,"variants":[{"url":"\/images\/FreemiumKit.png","traits":["1x","light"]}],"type":"image","identifier":"FreemiumKit.png"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}],"title":"SDK Setup Guide","type":"topic","url":"\/documentation\/freemiumkit\/setupguide","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"https://www.revenuecat.com/docs/migrating-to-revenuecat/sdk-or-not/finishing-transactions":{"titleInlineContent":[{"text":"Learn more","type":"text"}],"type":"link","identifier":"https:\/\/www.revenuecat.com\/docs\/migrating-to-revenuecat\/sdk-or-not\/finishing-transactions","url":"https:\/\/www.revenuecat.com\/docs\/migrating-to-revenuecat\/sdk-or-not\/finishing-transactions","title":"Learn more"},"mailto:freemiumkit@fline.dev":{"titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"type":"link","identifier":"mailto:freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"https://www.fline.dev/imprint/":{"titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link","identifier":"https:\/\/www.fline.dev\/imprint\/","url":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint"}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-parentalgate.json b/data/documentation/freemiumkit/faq-parentalgate.json index 4f5f10d..3ef6708 100644 --- a/data/documentation/freemiumkit/faq-parentalgate.json +++ b/data/documentation/freemiumkit/faq-parentalgate.json @@ -1 +1 @@ -{"primaryContentSections":[{"kind":"content","content":[{"type":"heading","anchor":"Short-Answer","level":2,"text":"Short Answer"},{"inlineContent":[{"type":"text","text":"Yes, the FreemiumKit SDK ships with a built-in parental gate. Just call "},{"type":"codeVoice","code":"FreemiumKit.shared.enableParentalGate(options:)"},{"type":"text","text":" upon app start."}],"type":"paragraph"},{"text":"Full Answer","type":"heading","level":2,"anchor":"Full-Answer"},{"inlineContent":[{"type":"text","text":"We’ve built a simple math-based parental gate that will ask a random multiplication question with numbers from 2 to 10. This should be easy enough for any parent to solve, but tricky enough to avoid small children (6 or younger) accidentally getting into the paywall, as required by the "},{"type":"reference","identifier":"https:\/\/developer.apple.com\/app-store\/review\/guidelines\/#kids-category","isActive":true},{"type":"text","text":" for apps in the Kids category."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"Just tell our SDK that it should use a parental gate before showing the paywall upon app start, like this:"}],"type":"paragraph"},{"type":"codeListing","syntax":"swift","code":["import FreemiumKit","","@main","struct AwesomeApp: App {"," init() {"," FreemiumKit.shared.enableParentalGate(options: ParentalGateOptions())"," }","}"]},{"inlineContent":[{"type":"text","text":"This single line will already work! 🎉 But it will use the default system colors (black\/white\/accent) which can look off."}],"type":"paragraph"},{"inlineContent":[{"text":"You probably want to customize the parental gate to look nicer to fit your apps playful color scheme, like this:","type":"text"}],"type":"paragraph"},{"type":"codeListing","syntax":"swift","code":["import FreemiumKit","","@main","struct AwesomeApp: App {"," init() {"," FreemiumKit.shared.enableParentalGate("," options: ParentalGateOptions("," background: .linearGradient("," LinearGradient("," gradient: Gradient(colors: [.blue, .purple]),"," startPoint: .topLeading, "," endPoint: .bottomTrailing"," )"," ),"," textColor: .white, "," submitButtonBackgroundColor: .green,"," submitButtonTitleColor: .white"," )"," )"," }","}"]},{"inlineContent":[{"text":"The result will look like this on iOS (and similar on other platforms):","type":"text"}],"type":"paragraph"},{"inlineContent":[{"identifier":"ParentalGate-Customized","type":"image"}],"type":"paragraph"},{"inlineContent":[{"identifier":"https:\/\/freemiumkit.app","isActive":true,"type":"reference"}],"type":"paragraph"},{"text":"Contact","type":"heading","level":2,"anchor":"Contact"},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","type":"reference","isActive":true},{"text":".","type":"text"}]},{"anchor":"Legal","type":"heading","text":"Legal","level":2},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}]}]}],"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","interfaceLanguage":"swift"},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"sections":[],"kind":"article","metadata":{"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","roleHeading":"FAQs"},"schemaVersion":{"major":0,"minor":3,"patch":0},"abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"references":{"mailto:freemiumkit@fline.dev":{"url":"mailto:freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"type":"link"},"FreemiumKit.png":{"variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"identifier":"FreemiumKit.png","alt":null,"type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"https://freemiumkit.app":{"url":"https:\/\/freemiumkit.app","identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"type":"link"},"ParentalGate-Customized":{"variants":[{"traits":["1x","light"],"url":"\/images\/ParentalGate-Customized.png"}],"identifier":"ParentalGate-Customized","alt":null,"type":"image"},"https://www.fline.dev/imprint/":{"url":"https:\/\/www.fline.dev\/imprint\/","identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"https://developer.apple.com/app-store/review/guidelines/#kids-category":{"url":"https:\/\/developer.apple.com\/app-store\/review\/guidelines\/#kids-category","identifier":"https:\/\/developer.apple.com\/app-store\/review\/guidelines\/#kids-category","title":"App Store guidelines","titleInlineContent":[{"text":"App Store guidelines","type":"text"}],"type":"link"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"}}} \ No newline at end of file +{"kind":"article","sections":[],"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"metadata":{"role":"sampleCode","roleHeading":"FAQs","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?"},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","interfaceLanguage":"swift"},"primaryContentSections":[{"kind":"content","content":[{"text":"Short Answer","anchor":"Short-Answer","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"Yes, the FreemiumKit SDK ships with a built-in parental gate. Just call "},{"type":"codeVoice","code":"FreemiumKit.shared.enableParentalGate(options:)"},{"type":"text","text":" upon app start."}],"type":"paragraph"},{"text":"Full Answer","anchor":"Full-Answer","type":"heading","level":2},{"inlineContent":[{"text":"We’ve built a simple math-based parental gate that will ask a random multiplication question with numbers from 2 to 10. This should be easy enough for any parent to solve, but tricky enough to avoid small children (6 or younger) accidentally getting into the paywall, as required by the ","type":"text"},{"type":"reference","identifier":"https:\/\/developer.apple.com\/app-store\/review\/guidelines\/#kids-category","isActive":true},{"type":"text","text":" for apps in the Kids category."}],"type":"paragraph"},{"inlineContent":[{"text":"Just tell our SDK that it should use a parental gate before showing the paywall upon app start, like this:","type":"text"}],"type":"paragraph"},{"syntax":"swift","type":"codeListing","code":["import FreemiumKit","","@main","struct AwesomeApp: App {"," init() {"," FreemiumKit.shared.enableParentalGate(options: ParentalGateOptions())"," }","}"]},{"inlineContent":[{"text":"This single line will already work! 🎉 But it will use the default system colors (black\/white\/accent) which can look off.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"You probably want to customize the parental gate to look nicer to fit your apps playful color scheme, like this:","type":"text"}],"type":"paragraph"},{"syntax":"swift","type":"codeListing","code":["import FreemiumKit","","@main","struct AwesomeApp: App {"," init() {"," FreemiumKit.shared.enableParentalGate("," options: ParentalGateOptions("," background: .linearGradient("," LinearGradient("," gradient: Gradient(colors: [.blue, .purple]),"," startPoint: .topLeading, "," endPoint: .bottomTrailing"," )"," ),"," textColor: .white, "," submitButtonBackgroundColor: .green,"," submitButtonTitleColor: .white"," )"," )"," }","}"]},{"inlineContent":[{"type":"text","text":"The result will look like this on iOS (and similar on other platforms):"}],"type":"paragraph"},{"inlineContent":[{"type":"image","identifier":"ParentalGate-Customized"}],"type":"paragraph"},{"inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/freemiumkit.app"}],"type":"paragraph"},{"text":"Contact","anchor":"Contact","type":"heading","level":2},{"inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"isActive":true,"identifier":"mailto:freemiumkit@fline.dev","type":"reference"},{"text":".","type":"text"}],"type":"paragraph"},{"text":"Legal","anchor":"Legal","type":"heading","level":2},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true,"type":"reference"}],"type":"small"}]}],"abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"references":{"https://www.fline.dev/imprint/":{"type":"link","identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","titleInlineContent":[{"type":"text","text":"Imprint"}],"url":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"ParentalGate-Customized":{"type":"image","alt":null,"identifier":"ParentalGate-Customized","variants":[{"traits":["1x","light"],"url":"\/images\/ParentalGate-Customized.png"}]},"FreemiumKit.png":{"type":"image","alt":null,"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"https://developer.apple.com/app-store/review/guidelines/#kids-category":{"type":"link","identifier":"https:\/\/developer.apple.com\/app-store\/review\/guidelines\/#kids-category","title":"App Store guidelines","titleInlineContent":[{"text":"App Store guidelines","type":"text"}],"url":"https:\/\/developer.apple.com\/app-store\/review\/guidelines\/#kids-category"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"https://freemiumkit.app":{"type":"link","identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"url":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"mailto:freemiumkit@fline.dev":{"type":"link","identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-pricing.json b/data/documentation/freemiumkit/faq-pricing.json index 0356ec0..c58e018 100644 --- a/data/documentation/freemiumkit/faq-pricing.json +++ b/data/documentation/freemiumkit/faq-pricing.json @@ -1 +1 @@ -{"metadata":{"role":"sampleCode","roleHeading":"FAQs","title":"How does the Pricing work in detail?"},"primaryContentSections":[{"content":[{"anchor":"Short-Answer","text":"Short Answer","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"We build the average of your last 2 months total revenue reported to App Store Connect across all apps. If you exceed your current plan, you no longer will be able to update the paywall remote configuration, you won’t see the purchase stats, nor will you receive purchase notifications. But your app will continue to show your last paywall and purchases will continue to work in your apps."}],"type":"paragraph"},{"anchor":"Full-Answer","text":"Full Answer","type":"heading","level":2},{"inlineContent":[{"text":"Income on App Store Connect can vary significantly, that’s why we’ve build a flexible and fair system for you:","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"Your monthly income is calculated by building the ","type":"text"},{"type":"strong","inlineContent":[{"text":"average of your last 2 months’ total revenue","type":"text"}]},{"text":". This ensures that (1) you don’t have to upgrade if you exceeded just for one month and (2) you can downgrade quickly again when your business takes an unexpected dip.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"If you exceed your current plan, you don’t need to worry, nothing bad will happen. Everything in your app will continue to work as expected, including the paywalls and your last remote configuration and purchases. But you won’t be able to edit anything or see any data in FreemiumKit. So you will lose access to the paywall editor to adjust your paywall remotely or change A\/B testing settings. You also won’t be able to change your pricing through FreemiumKit or receive push notifications for live purchase stats. And you won’t see your purchase history stats."}],"type":"paragraph"},{"content":[{"type":"paragraph","inlineContent":[{"text":"This is all how it’s ","type":"text"},{"inlineContent":[{"text":"planned","type":"text"}],"type":"emphasis"},{"text":" to work. Currently, there’s no payment at all and FreemiumKit is free to use for everyone. If you have any doubts about this system, don’t hesitate to contact me, I might adjust things as needed.","type":"text"}]}],"type":"aside","style":"note","name":"Note"},{"inlineContent":[{"isActive":true,"identifier":"https:\/\/freemiumkit.app","type":"reference"}],"type":"paragraph"},{"anchor":"Contact","text":"Contact","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"type":"reference","identifier":"mailto:freemiumkit@fline.dev","isActive":true},{"type":"text","text":"."}],"type":"paragraph"},{"anchor":"Legal","text":"Legal","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true,"type":"reference"}],"type":"small"}],"kind":"content"}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","interfaceLanguage":"swift"},"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}],"sections":[],"schemaVersion":{"patch":0,"minor":3,"major":0},"kind":"article","references":{"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"https://freemiumkit.app":{"identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","type":"link","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"url":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","type":"link","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"type":"image"},"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","type":"link","titleInlineContent":[{"text":"Imprint","type":"text"}],"url":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"}}} \ No newline at end of file +{"schemaVersion":{"patch":0,"major":0,"minor":3},"kind":"article","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"sections":[],"metadata":{"roleHeading":"FAQs","title":"How does the Pricing work in detail?","role":"sampleCode"},"primaryContentSections":[{"content":[{"type":"heading","anchor":"Short-Answer","level":2,"text":"Short Answer"},{"type":"paragraph","inlineContent":[{"text":"We build the average of your last 2 months total revenue reported to App Store Connect across all apps. If you exceed your current plan, you no longer will be able to update the paywall remote configuration, you won’t see the purchase stats, nor will you receive purchase notifications. But your app will continue to show your last paywall and purchases will continue to work in your apps.","type":"text"}]},{"type":"heading","anchor":"Full-Answer","level":2,"text":"Full Answer"},{"type":"paragraph","inlineContent":[{"text":"Income on App Store Connect can vary significantly, that’s why we’ve build a flexible and fair system for you:","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Your monthly income is calculated by building the "},{"type":"strong","inlineContent":[{"text":"average of your last 2 months’ total revenue","type":"text"}]},{"type":"text","text":". This ensures that (1) you don’t have to upgrade if you exceeded just for one month and (2) you can downgrade quickly again when your business takes an unexpected dip."}]},{"type":"paragraph","inlineContent":[{"text":"If you exceed your current plan, you don’t need to worry, nothing bad will happen. Everything in your app will continue to work as expected, including the paywalls and your last remote configuration and purchases. But you won’t be able to edit anything or see any data in FreemiumKit. So you will lose access to the paywall editor to adjust your paywall remotely or change A\/B testing settings. You also won’t be able to change your pricing through FreemiumKit or receive push notifications for live purchase stats. And you won’t see your purchase history stats.","type":"text"}]},{"style":"note","content":[{"inlineContent":[{"type":"text","text":"This is all how it’s "},{"inlineContent":[{"type":"text","text":"planned"}],"type":"emphasis"},{"type":"text","text":" to work. Currently, there’s no payment at all and FreemiumKit is free to use for everyone. If you have any doubts about this system, don’t hesitate to contact me, I might adjust things as needed."}],"type":"paragraph"}],"type":"aside","name":"Note"},{"type":"paragraph","inlineContent":[{"type":"reference","identifier":"https:\/\/freemiumkit.app","isActive":true}]},{"type":"heading","anchor":"Contact","level":2,"text":"Contact"},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","isActive":true,"type":"reference"},{"text":".","type":"text"}]},{"type":"heading","anchor":"Legal","level":2,"text":"Legal"},{"type":"small","inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"isActive":true,"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference"}]}],"kind":"content"}],"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"FreemiumKit.png":{"type":"image","identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"alt":null},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"https://www.fline.dev/imprint/":{"title":"Imprint","titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link","identifier":"https:\/\/www.fline.dev\/imprint\/","url":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]},"mailto:freemiumkit@fline.dev":{"title":"freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"type":"link","identifier":"mailto:freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"https://freemiumkit.app":{"title":"🏠 Back to Home","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"type":"link","identifier":"https:\/\/freemiumkit.app","url":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-privacy.json b/data/documentation/freemiumkit/faq-privacy.json index a90e760..273d2d8 100644 --- a/data/documentation/freemiumkit/faq-privacy.json +++ b/data/documentation/freemiumkit/faq-privacy.json @@ -1 +1 @@ -{"sections":[],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"kind":"article","seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"primaryContentSections":[{"kind":"content","content":[{"type":"heading","anchor":"Short-Answer","level":2,"text":"Short Answer"},{"type":"paragraph","inlineContent":[{"text":"We ","type":"text"},{"inlineContent":[{"type":"text","text":"don’t send any personal user data"}],"type":"strong"},{"text":" to our servers, respecting user privacy. And we delete purchase data from our servers as soon as they are fetched to ","type":"text"},{"inlineContent":[{"type":"text","text":"your"}],"type":"emphasis"},{"text":" devices. Your purchase data is persisted via CloudKit in your Apple Account. We can’t access your purchase history.","type":"text"}]},{"name":"Apple App Privacy","type":"aside","style":"note","content":[{"inlineContent":[{"type":"text","text":"If you are here to understand what fields you need to fill out for your app on App Store Connect, here’s your quick answer: Select “Purchases” for data types. Then select “Analytics” and “App Functionality” within the “Purchases” detail setup like this:"}],"type":"paragraph"},{"inlineContent":[{"identifier":"AppPrivacy-Purchases","type":"image"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"You can answer all subsequent questions with “No” when pressing “Next” because we are not collecting any user-identifiable information."}],"type":"paragraph"}]},{"type":"heading","anchor":"Full-Answer","level":2,"text":"Full Answer"},{"type":"paragraph","inlineContent":[{"text":"Firstly, we follow the principle of ","type":"text"},{"type":"strong","inlineContent":[{"text":"data minimization","type":"text"}]},{"text":" and don’t send any personal data to our servers. The only data we send are the date and country of the purchase and the purchased product with its price. This way even if our servers were breached, there’s nothing useful to be obtained for attackers.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Secondly, we "},{"inlineContent":[{"type":"text","text":"don’t keep the data for long"}],"type":"strong"},{"type":"text","text":": The moment the FreemiumKit app on your devices successfully fetch the purchase data, they are deleted from our servers. If you install FreemiumKit on your iPhone and have push notifications turned on, this happens just seconds after a purchase was made, keeping the amount of data we store on our servers close to zero basically all the time."}]},{"name":"Tip","type":"aside","style":"tip","content":[{"inlineContent":[{"text":"All our servers are hosted within the European Union (EU), ensuring your data complies with strict EU privacy laws, including GDPR, for enhanced protection and security.","type":"text"}],"type":"paragraph"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"To ensure your data is backed up and syncs across devices, we use CloudKit. This way, even if you delete the FreemiumKit app or lose your device, you can just reinstall FreemiumKit on another device and your full purchase history statistics will stay available within the same Apple Account."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you happen to stop using the FreemiumKit app for some reason, new purchases are kept up to 90 days on our servers. So you’ll always be able to fetch the last 90 days if you decide to return. If you have push notifications disabled, you need to open the app at least once every 90 days to not lose any purchase history data. If you returned after 100 days, you would lose 10 days of data, for example."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"That’s why we strongly recommend to "},{"inlineContent":[{"text":"keep push notifications enabled","type":"text"}],"type":"strong"},{"type":"text","text":" on FreemiumKit for iPhone, even if you don’t wish to actually receive push notifications. You can turn off push notifications within the FreemiumKit app, which will disable the local push notification sent by the app while woken up in the background by a silent push notification. This way, the app will continue fetching purchase data without bothering you with push notifications."}]},{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/freemiumkit.app","isActive":true,"type":"reference"}]},{"type":"heading","anchor":"Contact","level":2,"text":"Contact"},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"isActive":true,"identifier":"mailto:freemiumkit@fline.dev","type":"reference"},{"type":"text","text":"."}]},{"type":"heading","anchor":"Legal","level":2,"text":"Legal"},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}]}]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}],"metadata":{"title":"How does FreemiumKit handle User Privacy?","roleHeading":"FAQs","role":"sampleCode"},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","interfaceLanguage":"swift"},"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"https://www.fline.dev/imprint/":{"type":"link","title":"Imprint","titleInlineContent":[{"text":"Imprint","type":"text"}],"url":"https:\/\/www.fline.dev\/imprint\/","identifier":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"FreemiumKit.png":{"type":"image","variants":[{"url":"\/images\/FreemiumKit.png","traits":["1x","light"]}],"alt":null,"identifier":"FreemiumKit.png"},"mailto:freemiumkit@fline.dev":{"type":"link","title":"freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev"},"AppPrivacy-Purchases":{"type":"image","variants":[{"url":"\/images\/AppPrivacy-Purchases.png","traits":["1x","light"]}],"alt":"Purchase History Setup","identifier":"AppPrivacy-Purchases"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"https://freemiumkit.app":{"type":"link","title":"🏠 Back to Home","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"url":"https:\/\/freemiumkit.app","identifier":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"}}} \ No newline at end of file +{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"primaryContentSections":[{"kind":"content","content":[{"level":2,"text":"Short Answer","anchor":"Short-Answer","type":"heading"},{"inlineContent":[{"type":"text","text":"We "},{"type":"strong","inlineContent":[{"text":"don’t send any personal user data","type":"text"}]},{"type":"text","text":" to our servers, respecting user privacy. And we delete purchase data from our servers as soon as they are fetched to "},{"type":"emphasis","inlineContent":[{"type":"text","text":"your"}]},{"type":"text","text":" devices. Your purchase data is persisted via CloudKit in your Apple Account. We can’t access your purchase history."}],"type":"paragraph"},{"name":"Apple App Privacy","style":"note","content":[{"inlineContent":[{"text":"If you are here to understand what fields you need to fill out for your app on App Store Connect, here’s your quick answer: Select “Purchases” for data types. Then select “Analytics” and “App Functionality” within the “Purchases” detail setup like this:","type":"text"}],"type":"paragraph"},{"inlineContent":[{"identifier":"AppPrivacy-Purchases","type":"image"}],"type":"paragraph"},{"inlineContent":[{"text":"You can answer all subsequent questions with “No” when pressing “Next” because we are not collecting any user-identifiable information.","type":"text"}],"type":"paragraph"}],"type":"aside"},{"level":2,"text":"Full Answer","anchor":"Full-Answer","type":"heading"},{"inlineContent":[{"type":"text","text":"Firstly, we follow the principle of "},{"inlineContent":[{"type":"text","text":"data minimization"}],"type":"strong"},{"type":"text","text":" and don’t send any personal data to our servers. The only data we send are the date and country of the purchase and the purchased product with its price. This way even if our servers were breached, there’s nothing useful to be obtained for attackers."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"Secondly, we "},{"type":"strong","inlineContent":[{"text":"don’t keep the data for long","type":"text"}]},{"type":"text","text":": The moment the FreemiumKit app on your devices successfully fetch the purchase data, they are deleted from our servers. If you install FreemiumKit on your iPhone and have push notifications turned on, this happens just seconds after a purchase was made, keeping the amount of data we store on our servers close to zero basically all the time."}],"type":"paragraph"},{"name":"Tip","style":"tip","content":[{"inlineContent":[{"type":"text","text":"All our servers are hosted within the European Union (EU), ensuring your data complies with strict EU privacy laws, including GDPR, for enhanced protection and security."}],"type":"paragraph"}],"type":"aside"},{"inlineContent":[{"type":"text","text":"To ensure your data is backed up and syncs across devices, we use CloudKit. This way, even if you delete the FreemiumKit app or lose your device, you can just reinstall FreemiumKit on another device and your full purchase history statistics will stay available within the same Apple Account."}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"If you happen to stop using the FreemiumKit app for some reason, new purchases are kept up to 90 days on our servers. So you’ll always be able to fetch the last 90 days if you decide to return. If you have push notifications disabled, you need to open the app at least once every 90 days to not lose any purchase history data. If you returned after 100 days, you would lose 10 days of data, for example."}],"type":"paragraph"},{"inlineContent":[{"text":"That’s why we strongly recommend to ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"keep push notifications enabled"}]},{"text":" on FreemiumKit for iPhone, even if you don’t wish to actually receive push notifications. You can turn off push notifications within the FreemiumKit app, which will disable the local push notification sent by the app while woken up in the background by a silent push notification. This way, the app will continue fetching purchase data without bothering you with push notifications.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"identifier":"https:\/\/freemiumkit.app","isActive":true,"type":"reference"}],"type":"paragraph"},{"level":2,"text":"Contact","anchor":"Contact","type":"heading"},{"inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"isActive":true,"type":"reference","identifier":"mailto:freemiumkit@fline.dev"},{"text":".","type":"text"}],"type":"paragraph"},{"level":2,"text":"Legal","anchor":"Legal","type":"heading"},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true,"type":"reference"}],"type":"small"}]}],"schemaVersion":{"minor":3,"major":0,"patch":0},"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"sections":[],"abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}],"metadata":{"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","roleHeading":"FAQs"},"kind":"article","references":{"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"text":"Imprint","type":"text"}],"url":"https:\/\/www.fline.dev\/imprint\/","type":"link","title":"Imprint"},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"FreemiumKit.png":{"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"alt":null,"type":"image"},"AppPrivacy-Purchases":{"identifier":"AppPrivacy-Purchases","variants":[{"traits":["1x","light"],"url":"\/images\/AppPrivacy-Purchases.png"}],"alt":"Purchase History Setup","type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"https://freemiumkit.app":{"identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"url":"https:\/\/freemiumkit.app","type":"link","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev","type":"link","title":"freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-serverlimits.json b/data/documentation/freemiumkit/faq-serverlimits.json index 9609a73..5a6eb85 100644 --- a/data/documentation/freemiumkit/faq-serverlimits.json +++ b/data/documentation/freemiumkit/faq-serverlimits.json @@ -1 +1 @@ -{"metadata":{"roleHeading":"FAQs","role":"sampleCode","title":"How can I apply my custom server-side limits?"},"primaryContentSections":[{"kind":"content","content":[{"anchor":"Short-Answer","type":"heading","level":2,"text":"Short Answer"},{"type":"paragraph","inlineContent":[{"type":"text","text":"FreemiumKit uses the built-in "},{"type":"codeVoice","code":"appDeviceToken"},{"type":"text","text":" in StoreKit 2 to recognize the same user across app installs and devices. You can access it from the "},{"type":"codeVoice","code":"FreemiumKit"},{"type":"text","text":" instance either using the "},{"type":"codeVoice","code":"@EnvironmentObject"},{"type":"text","text":" method or globally via "},{"type":"codeVoice","code":"FreemiumKit.shared.appDeviceToken"},{"type":"text","text":"."}]},{"anchor":"Full-Answer","type":"heading","level":2,"text":"Full Answer"},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you have your own server-side logic for locking\/unlocking functionality based on usage (such as ‘100 posts per month’), you will want to identify the same user across app installs or devices. To do this, you can access "},{"type":"codeVoice","code":"appAccountToken"},{"type":"text","text":" on the "},{"type":"codeVoice","code":"FreemiumKit"},{"type":"text","text":" environment object which will return a "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":" stored right within StoreKit (so Apple makes sure you recognize the same user across devices – we don’t store that data on our servers)."}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Access the field after purchases are loaded like so:"}]},{"code":["import FreemiumKit","","struct MyView: View {"," @EnvironmentObject private var freemiumKit: FreemiumKit",""," var body: some View {"," VStack {"," \/\/ your main view ..."," }"," .onPurchasesLoaded {"," let appAccountToken: UUID = freemiumKit.appAccountToken"," \/\/ do something with the app account token"," }"," }","}"],"type":"codeListing","syntax":"swift"},{"type":"paragraph","inlineContent":[{"type":"text","text":"You can also access it globally via "},{"type":"codeVoice","code":"FreemiumKit.shared.appAccountToken"},{"type":"text","text":" but make sure that "},{"type":"codeVoice","code":"FreemiumKit.shared.purchasesLoad"},{"type":"text","text":" is "},{"type":"codeVoice","code":"true"},{"type":"text","text":", else you won’t get the correct "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":". Note that FreemiumKit loads this data upon app start and caches it, so most of the time it should be available."}]},{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/freemiumkit.app","isActive":true,"type":"reference"}]},{"anchor":"Contact","type":"heading","level":2,"text":"Contact"},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","isActive":true,"type":"reference"},{"text":".","type":"text"}]},{"anchor":"Legal","type":"heading","level":2,"text":"Legal"},{"type":"small","inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}]}]}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","interfaceLanguage":"swift"},"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"abstract":[{"type":"text","text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits."}],"sections":[],"schemaVersion":{"patch":0,"minor":3,"major":0},"kind":"article","references":{"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"https://freemiumkit.app":{"identifier":"https:\/\/freemiumkit.app","title":"🏠 Back to Home","type":"link","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"url":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","type":"link","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"url":"mailto:freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"type":"image"},"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","type":"link","titleInlineContent":[{"type":"text","text":"Imprint"}],"url":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"}}} \ No newline at end of file +{"kind":"article","schemaVersion":{"minor":3,"patch":0,"major":0},"sections":[],"metadata":{"title":"How can I apply my custom server-side limits?","roleHeading":"FAQs","role":"sampleCode"},"primaryContentSections":[{"content":[{"type":"heading","anchor":"Short-Answer","level":2,"text":"Short Answer"},{"inlineContent":[{"text":"FreemiumKit uses the built-in ","type":"text"},{"code":"appDeviceToken","type":"codeVoice"},{"text":" in StoreKit 2 to recognize the same user across app installs and devices. You can access it from the ","type":"text"},{"code":"FreemiumKit","type":"codeVoice"},{"text":" instance either using the ","type":"text"},{"code":"@EnvironmentObject","type":"codeVoice"},{"text":" method or globally via ","type":"text"},{"code":"FreemiumKit.shared.appDeviceToken","type":"codeVoice"},{"text":".","type":"text"}],"type":"paragraph"},{"type":"heading","anchor":"Full-Answer","level":2,"text":"Full Answer"},{"inlineContent":[{"type":"text","text":"If you have your own server-side logic for locking\/unlocking functionality based on usage (such as ‘100 posts per month’), you will want to identify the same user across app installs or devices. To do this, you can access "},{"code":"appAccountToken","type":"codeVoice"},{"type":"text","text":" on the "},{"code":"FreemiumKit","type":"codeVoice"},{"type":"text","text":" environment object which will return a "},{"code":"UUID","type":"codeVoice"},{"type":"text","text":" stored right within StoreKit (so Apple makes sure you recognize the same user across devices – we don’t store that data on our servers)."}],"type":"paragraph"},{"inlineContent":[{"text":"Access the field after purchases are loaded like so:","type":"text"}],"type":"paragraph"},{"type":"codeListing","code":["import FreemiumKit","","struct MyView: View {"," @EnvironmentObject private var freemiumKit: FreemiumKit",""," var body: some View {"," VStack {"," \/\/ your main view ..."," }"," .onPurchasesLoaded {"," let appAccountToken: UUID = freemiumKit.appAccountToken"," \/\/ do something with the app account token"," }"," }","}"],"syntax":"swift"},{"inlineContent":[{"text":"You can also access it globally via ","type":"text"},{"code":"FreemiumKit.shared.appAccountToken","type":"codeVoice"},{"text":" but make sure that ","type":"text"},{"code":"FreemiumKit.shared.purchasesLoad","type":"codeVoice"},{"type":"text","text":" is "},{"type":"codeVoice","code":"true"},{"type":"text","text":", else you won’t get the correct "},{"type":"codeVoice","code":"UUID"},{"type":"text","text":". Note that FreemiumKit loads this data upon app start and caches it, so most of the time it should be available."}],"type":"paragraph"},{"inlineContent":[{"identifier":"https:\/\/freemiumkit.app","isActive":true,"type":"reference"}],"type":"paragraph"},{"type":"heading","anchor":"Contact","level":2,"text":"Contact"},{"inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"isActive":true,"identifier":"mailto:freemiumkit@fline.dev","type":"reference"},{"text":".","type":"text"}],"type":"paragraph"},{"type":"heading","anchor":"Legal","level":2,"text":"Legal"},{"inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}],"type":"small"}],"kind":"content"}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits"},"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"abstract":[{"type":"text","text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits."}],"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"https://freemiumkit.app":{"title":"🏠 Back to Home","type":"link","identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"url":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"FreemiumKit.png":{"alt":null,"type":"image","variants":[{"url":"\/images\/FreemiumKit.png","traits":["1x","light"]}],"identifier":"FreemiumKit.png"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"mailto:freemiumkit@fline.dev":{"title":"freemiumkit@fline.dev","type":"link","identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"https://www.fline.dev/imprint/":{"title":"Imprint","type":"link","identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"text":"Imprint","type":"text"}],"url":"https:\/\/www.fline.dev\/imprint\/"}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faq-validation.json b/data/documentation/freemiumkit/faq-validation.json index c439c53..33a8906 100644 --- a/data/documentation/freemiumkit/faq-validation.json +++ b/data/documentation/freemiumkit/faq-validation.json @@ -1 +1 @@ -{"abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"metadata":{"title":"Does FreemiumKit validate purchases?","role":"sampleCode","roleHeading":"FAQs"},"schemaVersion":{"major":0,"patch":0,"minor":3},"sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"primaryContentSections":[{"kind":"content","content":[{"type":"heading","level":2,"text":"Short Answer","anchor":"Short-Answer"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Yes, we handle validation automatically and only report purchases that have been verified by the App Store. No action needed on your end, it all happens within our SDK automatically."}]},{"type":"heading","level":2,"text":"Full Answer","anchor":"Full-Answer"},{"type":"paragraph","inlineContent":[{"text":"The FreemiumKit SDK is built on top of StoreKit 2, which automatically verifies any transaction is “signed by the App Store for ","type":"text"},{"type":"emphasis","inlineContent":[{"text":"my","type":"text"}]},{"text":" app for ","type":"text"},{"type":"emphasis","inlineContent":[{"text":"this","type":"text"}]},{"text":" device” (quote from WWDC22 session ","type":"text"},{"type":"reference","identifier":"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/?time=694","isActive":true},{"text":"). StoreKit 2 leaves developers the choice to accept even unverified purchases. But FreemiumKit doesn’t do that, it simply ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"always"}]},{"type":"text","text":" ignores unverified purchases. When FreemiumKit reports a purchase, it has already successfully passed transaction verification. 💯"}]},{"type":"paragraph","inlineContent":[{"text":"While StoreKit 2 makes sure a transaction is coming from Apple and has not been tampered with, it’s still possible that a highly skilled attacker could tamper with the devices memory or the app logic on a jailbroken device to bypass these checks. It is possible to guard against these kinds of attacks with additional server-side validation and by moving some of the paid feature logic to your servers.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The complexity of such an attack is very high though and most apps are vulnerable to it even with server-side receipt validation because the attacker can simply bypass the boolean check inside the apps logic if they have this level of access to your apps code. Protecting against all potential security risks is impossible and we think that the built-in transaction verification is a good level of security for most apps."}]},{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/freemiumkit.app","type":"reference","isActive":true}]},{"type":"heading","level":2,"text":"Contact","anchor":"Contact"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"identifier":"mailto:freemiumkit@fline.dev","type":"reference","isActive":true},{"type":"text","text":"."}]},{"type":"heading","level":2,"text":"Legal","anchor":"Legal"},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference","isActive":true}]}]}],"kind":"article","seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"],"generated":true}],"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"https://freemiumkit.app":{"url":"https:\/\/freemiumkit.app","identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"type":"link","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"mailto:freemiumkit@fline.dev":{"url":"mailto:freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"type":"link","title":"freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"https://developer.apple.com/videos/play/wwdc2021/10114/?time=694":{"url":"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/?time=694","identifier":"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/?time=694","titleInlineContent":[{"type":"text","text":"Meet StoreKit 2"}],"type":"link","title":"Meet StoreKit 2"},"https://www.fline.dev/imprint/":{"url":"https:\/\/www.fline.dev\/imprint\/","identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link","title":"Imprint"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"}}} \ No newline at end of file +{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]]},"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"schemaVersion":{"minor":3,"patch":0,"major":0},"kind":"article","primaryContentSections":[{"content":[{"text":"Short Answer","type":"heading","anchor":"Short-Answer","level":2},{"inlineContent":[{"text":"Yes, we handle validation automatically and only report purchases that have been verified by the App Store. No action needed on your end, it all happens within our SDK automatically.","type":"text"}],"type":"paragraph"},{"text":"Full Answer","type":"heading","anchor":"Full-Answer","level":2},{"inlineContent":[{"type":"text","text":"The FreemiumKit SDK is built on top of StoreKit 2, which automatically verifies any transaction is “signed by the App Store for "},{"inlineContent":[{"type":"text","text":"my"}],"type":"emphasis"},{"type":"text","text":" app for "},{"inlineContent":[{"type":"text","text":"this"}],"type":"emphasis"},{"type":"text","text":" device” (quote from WWDC22 session "},{"isActive":true,"type":"reference","identifier":"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/?time=694"},{"type":"text","text":"). StoreKit 2 leaves developers the choice to accept even unverified purchases. But FreemiumKit doesn’t do that, it simply "},{"inlineContent":[{"type":"text","text":"always"}],"type":"strong"},{"type":"text","text":" ignores unverified purchases. When FreemiumKit reports a purchase, it has already successfully passed transaction verification. 💯"}],"type":"paragraph"},{"inlineContent":[{"text":"While StoreKit 2 makes sure a transaction is coming from Apple and has not been tampered with, it’s still possible that a highly skilled attacker could tamper with the devices memory or the app logic on a jailbroken device to bypass these checks. It is possible to guard against these kinds of attacks with additional server-side validation and by moving some of the paid feature logic to your servers.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"The complexity of such an attack is very high though and most apps are vulnerable to it even with server-side receipt validation because the attacker can simply bypass the boolean check inside the apps logic if they have this level of access to your apps code. Protecting against all potential security risks is impossible and we think that the built-in transaction verification is a good level of security for most apps.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"isActive":true,"identifier":"https:\/\/freemiumkit.app","type":"reference"}],"type":"paragraph"},{"text":"Contact","type":"heading","anchor":"Contact","level":2},{"inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"identifier":"mailto:freemiumkit@fline.dev","isActive":true,"type":"reference"},{"text":".","type":"text"}],"type":"paragraph"},{"text":"Legal","type":"heading","anchor":"Legal","level":2},{"inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}],"type":"small"}],"kind":"content"}],"metadata":{"roleHeading":"FAQs","role":"sampleCode","title":"Does FreemiumKit validate purchases?"},"abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"sections":[],"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"https://freemiumkit.app":{"identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"type":"link","url":"https:\/\/freemiumkit.app","title":"🏠 Back to Home"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"https://developer.apple.com/videos/play/wwdc2021/10114/?time=694":{"identifier":"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/?time=694","titleInlineContent":[{"text":"Meet StoreKit 2","type":"text"}],"type":"link","url":"https:\/\/developer.apple.com\/videos\/play\/wwdc2021\/10114\/?time=694","title":"Meet StoreKit 2"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"FreemiumKit.png":{"identifier":"FreemiumKit.png","type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"alt":null},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"type":"link","url":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link","url":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint"}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/faqs.json b/data/documentation/freemiumkit/faqs.json index 4fca199..92aa430 100644 --- a/data/documentation/freemiumkit/faqs.json +++ b/data/documentation/freemiumkit/faqs.json @@ -1 +1 @@ -{"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"metadata":{"role":"article","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"roleHeading":"FreemiumKit","title":"FAQs"},"schemaVersion":{"patch":0,"minor":3,"major":0},"sections":[],"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","interfaceLanguage":"swift"},"kind":"article","topicSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid"],"generated":true}],"references":{"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","type":"topic","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"url":"\/documentation\/freemiumkit\/migratefrompaid","title":"Paid to Freemium Migration Guide","kind":"article"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}],"role":"sampleCode","title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}],"role":"sampleCode","title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}],"role":"sampleCode","title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum."}],"role":"sampleCode","title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"kind":"article","url":"\/documentation\/freemiumkit\/setupguide","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","title":"SDK Setup Guide","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}]},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"kind":"article","url":"\/documentation\/freemiumkit\/appreviewchecklist","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","title":"Checklist to Pass App Review","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}]},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}],"type":"topic","kind":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","title":"How can I apply my custom server-side limits?","url":"\/documentation\/freemiumkit\/faq-serverlimits","role":"sampleCode"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"}}} \ No newline at end of file +{"sections":[],"kind":"article","schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}],"seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid"]}],"topicSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts"]}],"metadata":{"role":"article","title":"FAQs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"roleHeading":"FreemiumKit"},"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ParentalGate":{"title":"Are ‘Made for Kids’ apps supported with a Parental Gate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ParentalGate","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-parentalgate","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how to use our built-in parental gate for apps ‘Made for Kids’ to comply with Apples guidelines and avoid accidental purchases by small children."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-ServerLimits":{"title":"How can I apply my custom server-side limits?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-ServerLimits","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-serverlimits","kind":"article","type":"topic","abstract":[{"text":"Learn how you can recognize a purchased user across app installs and devices to roll your own server-side logic for custom limits.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-LegacyProducts":{"title":"How can I disable old products without customers losing access?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-LegacyProducts","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-legacyproducts","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit allows you to mark purchases as ‘legacy’ and how the SDK ensures existing customers can continue to use your app as expected."}]},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","title":"Paid to Freemium Migration Guide","url":"\/documentation\/freemiumkit\/migratefrompaid","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","kind":"article"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Privacy":{"title":"How does FreemiumKit handle User Privacy?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Privacy","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-privacy","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit was designed to keep your users data private and reduce the exposure of your purchase data to a minimum.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}],"title":"Checklist to Pass App Review","type":"topic","url":"\/documentation\/freemiumkit\/appreviewchecklist","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-FixCrashOnStart":{"title":"My Mac app is crashing on start on TestFlight \/ during App Review – how to fix?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-FixCrashOnStart","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-fixcrashonstart","kind":"article","type":"topic","abstract":[{"type":"text","text":"If your app crashes upon app start, it’s likely that your app can’t find the FreemiumKit SDK path. Learn how to fix your build settings."}]},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}],"title":"SDK Setup Guide","type":"topic","url":"\/documentation\/freemiumkit\/setupguide","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/migratefrompaid.json b/data/documentation/freemiumkit/migratefrompaid.json index 4879b04..8a7ed29 100644 --- a/data/documentation/freemiumkit/migratefrompaid.json +++ b/data/documentation/freemiumkit/migratefrompaid.json @@ -1 +1 @@ -{"abstract":[{"type":"text","text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased."}],"kind":"article","seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"],"generated":true}],"metadata":{"role":"article","title":"Paid to Freemium Migration Guide","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"roleHeading":"FreemiumKit"},"primaryContentSections":[{"kind":"content","content":[{"anchor":"Step-1-Set-up-FreemiumKit-like-normally","type":"heading","text":"Step 1: Set up FreemiumKit like normally","level":2},{"type":"paragraph","inlineContent":[{"text":"Add your app inside the FreemiumKit app and follow all instructions to set up your app for In-App Purchases like you would normally do (see Setup tab inside the Mac app). Just act like your app is already free to use and make sure to lock any features you want to hide behind paid tiers using the SDK features from our ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"},{"text":".","type":"text"}]},{"anchor":"Step-2-Tell-our-SDK-the-last-paid-version","type":"heading","text":"Step 2: Tell our SDK the last paid version","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"In order to continue giving users who had already purchased your app previously full access to your apps features, you need to tell our SDK which was the last version and build number sold as a paid-up-front app. Our SDK will then use Apples "},{"identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","type":"reference","isActive":true},{"type":"text","text":" in StoreKit to automatically detect those users for you, there’s nothing else you need to do. Just call this, e.g. in your app entry point:"}]},{"code":["import FreemiumKit","","@main","struct AwesomeApp: App {"," init() {"," FreemiumKit.shared.lastPaidRelease(version: \"1.5.1\", buildNum: 25)"," }"," \/\/ ...","}"],"type":"codeListing","syntax":"swift"},{"style":"note","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Apple has introduced the "},{"code":"AppTransaction","type":"codeVoice"},{"type":"text","text":" API for this purpose in 2022 with iOS 16. Therefore, this guide only works if you target your "},{"type":"emphasis","inlineContent":[{"text":"new","type":"text"}]},{"type":"text","text":" Freemium app version to iOS 16 (or macOS 13, tvOS 16, watchOS 9) or later."}]}],"type":"aside","name":"Requirements"},{"style":"warning","content":[{"inlineContent":[{"text":"The ","type":"text"},{"code":"AppTransaction","type":"codeVoice"},{"text":" API Apple offers to detect the first downloaded app version returns the version (e.g. ","type":"text"},{"code":"1.5.1","type":"codeVoice"},{"text":") on macOS but the build number (e.g. ","type":"text"},{"code":"25","type":"codeVoice"},{"text":") on all other platforms, including iOS. But only on macOS of all platforms (where it’s not relevant) Apple requires new versions to have a ","type":"text"},{"inlineContent":[{"type":"text","text":"higher"}],"type":"emphasis"},{"text":" build number, but not on iOS, for example. As long as you increase the version number (e.g. from ","type":"text"},{"code":"1.5.1","type":"codeVoice"},{"text":" to ","type":"text"},{"code":"1.5.2","type":"codeVoice"},{"text":") you can always go back to build number ","type":"text"},{"code":"1","type":"codeVoice"},{"text":" even if you were at build ","type":"text"},{"code":"25","type":"codeVoice"},{"text":" in version ","type":"text"},{"code":"1.5.1","type":"codeVoice"},{"text":".","type":"text"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"So for this check to work, make sure to "},{"inlineContent":[{"type":"text","text":"always"}],"type":"strong"},{"type":"text","text":" increase your build number from now on if you haven’t already. Also, if you had been resetting your build number to "},{"type":"codeVoice","code":"1"},{"type":"text","text":" in the past, make sure to pass the highest build number you’ve ever shipped your app with when calling "},{"type":"codeVoice","code":"lastPaidRelease(version:buildNum:)"},{"type":"text","text":" and start with the next number for your future releases. E.g. if "},{"type":"codeVoice","code":"5"},{"type":"text","text":" was your latest released build number, but you had a version with build "},{"type":"codeVoice","code":"25"},{"type":"text","text":" in the past, pass "},{"type":"codeVoice","code":"25"},{"type":"text","text":" for the "},{"type":"codeVoice","code":"buildNum"},{"type":"text","text":" and start your build number at "},{"type":"codeVoice","code":"26"},{"type":"text","text":" for your next release."}],"type":"paragraph"},{"inlineContent":[{"text":"If it takes too long to figure out which was the highest build number, just pick a number that’s sure to be higher than the highest build number so far (e.g. ","type":"text"},{"code":"500","type":"codeVoice"},{"text":") and start from there.","type":"text"}],"type":"paragraph"}],"type":"aside","name":"Warning"},{"anchor":"Step-3-Submit-a-new-version--make-your-app-free","type":"heading","text":"Step 3: Submit a new version & make your app free","level":2},{"type":"paragraph","inlineContent":[{"text":"With everything ready and tested, set your app to “Manually release this version” and submit it to the App Store.","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"Once your update is approved, release your version and immediately after that set your app pricing to “Free”. This will ensure that no one can download your previous (paid) version for free but also no one has to pay for the new Freemium version.","type":"text"}]},{"type":"paragraph","inlineContent":[{"text":"That’s it, you successfully migrated your paid app to the Freemium model!","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The FreemiumKit SDK will automatically treat any users who had paid for your app previously like someone who purchased your highest tier for Lifetime. This means calls to APIs like "},{"type":"codeVoice","code":"PaidFeatureButton"},{"type":"text","text":", "},{"type":"codeVoice","code":"purchasedTier"},{"type":"text","text":" or "},{"type":"codeVoice","code":"hasPurchased"},{"type":"text","text":" will behave like for an active subscriber. 🎉"}]},{"style":"tip","content":[{"inlineContent":[{"text":"If you want to particularly know if the current user is a paid-up-front puchaser who upgraded (e.g. to give them extras like an ‘Early Adopter’ badge), you can call ","type":"text"},{"code":"hasUpgradedFromPaidRelease","type":"codeVoice"},{"text":" on ","type":"text"},{"code":"FreemiumKit.shared","type":"codeVoice"},{"text":" or on the FreemiumKit ","type":"text"},{"code":"@EnvironmentObject","type":"codeVoice"},{"text":".","type":"text"}],"type":"paragraph"}],"type":"aside","name":"Tip"},{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/freemiumkit.app","type":"reference","isActive":true}]},{"anchor":"Contact","type":"heading","text":"Contact","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"isActive":true,"identifier":"mailto:freemiumkit@fline.dev","type":"reference"},{"type":"text","text":"."}]},{"anchor":"Legal","type":"heading","text":"Legal","level":2},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}]}]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid"},"schemaVersion":{"patch":0,"major":0,"minor":3},"sections":[],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"references":{"https://freemiumkit.app":{"url":"https:\/\/freemiumkit.app","identifier":"https:\/\/freemiumkit.app","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"title":"🏠 Back to Home","type":"link"},"https://developer.apple.com/documentation/storekit/supporting_business_model_changes_by_using_the_app_transaction":{"url":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","titleInlineContent":[{"type":"text","text":"built-in solution"}],"title":"built-in solution","type":"link"},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"kind":"article","url":"\/documentation\/freemiumkit\/setupguide","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","title":"SDK Setup Guide","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}]},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"kind":"article","url":"\/documentation\/freemiumkit\/appreviewchecklist","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","title":"Checklist to Pass App Review","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}]},"mailto:freemiumkit@fline.dev":{"url":"mailto:freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"title":"freemiumkit@fline.dev","type":"link"},"https://www.fline.dev/imprint/":{"url":"https:\/\/www.fline.dev\/imprint\/","identifier":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"type":"text","text":"Imprint"}],"title":"Imprint","type":"link"},"FreemiumKit.png":{"variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"identifier":"FreemiumKit.png","alt":null,"type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]}}} \ No newline at end of file +{"sections":[],"abstract":[{"type":"text","text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased."}],"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"metadata":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"roleHeading":"FreemiumKit","title":"Paid to Freemium Migration Guide","role":"article"},"kind":"article","seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"],"generated":true}],"schemaVersion":{"major":0,"patch":0,"minor":3},"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","interfaceLanguage":"swift"},"primaryContentSections":[{"content":[{"text":"Step 1: Set up FreemiumKit like normally","type":"heading","anchor":"Step-1-Set-up-FreemiumKit-like-normally","level":2},{"type":"paragraph","inlineContent":[{"text":"Add your app inside the FreemiumKit app and follow all instructions to set up your app for In-App Purchases like you would normally do (see Setup tab inside the Mac app). Just act like your app is already free to use and make sure to lock any features you want to hide behind paid tiers using the SDK features from our ","type":"text"},{"isActive":true,"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","type":"reference"},{"text":".","type":"text"}]},{"level":2,"text":"Step 2: Tell our SDK the last paid version","anchor":"Step-2-Tell-our-SDK-the-last-paid-version","type":"heading"},{"inlineContent":[{"text":"In order to continue giving users who had already purchased your app previously full access to your apps features, you need to tell our SDK which was the last version and build number sold as a paid-up-front app. Our SDK will then use Apples ","type":"text"},{"identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","type":"reference","isActive":true},{"text":" in StoreKit to automatically detect those users for you, there’s nothing else you need to do. Just call this, e.g. in your app entry point:","type":"text"}],"type":"paragraph"},{"code":["import FreemiumKit","","@main","struct AwesomeApp: App {"," init() {"," FreemiumKit.shared.lastPaidRelease(version: \"1.5.1\", buildNum: 25)"," }"," \/\/ ...","}"],"type":"codeListing","syntax":"swift"},{"content":[{"inlineContent":[{"text":"Apple has introduced the ","type":"text"},{"type":"codeVoice","code":"AppTransaction"},{"text":" API for this purpose in 2022 with iOS 16. Therefore, this guide only works if you target your ","type":"text"},{"inlineContent":[{"type":"text","text":"new"}],"type":"emphasis"},{"text":" Freemium app version to iOS 16 (or macOS 13, tvOS 16, watchOS 9) or later.","type":"text"}],"type":"paragraph"}],"style":"note","name":"Requirements","type":"aside"},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"type":"codeVoice","code":"AppTransaction"},{"type":"text","text":" API Apple offers to detect the first downloaded app version returns the version (e.g. "},{"type":"codeVoice","code":"1.5.1"},{"type":"text","text":") on macOS but the build number (e.g. "},{"type":"codeVoice","code":"25"},{"type":"text","text":") on all other platforms, including iOS. But only on macOS of all platforms (where it’s not relevant) Apple requires new versions to have a "},{"inlineContent":[{"text":"higher","type":"text"}],"type":"emphasis"},{"type":"text","text":" build number, but not on iOS, for example. As long as you increase the version number (e.g. from "},{"type":"codeVoice","code":"1.5.1"},{"type":"text","text":" to "},{"type":"codeVoice","code":"1.5.2"},{"type":"text","text":") you can always go back to build number "},{"type":"codeVoice","code":"1"},{"type":"text","text":" even if you were at build "},{"type":"codeVoice","code":"25"},{"type":"text","text":" in version "},{"type":"codeVoice","code":"1.5.1"},{"type":"text","text":"."}]},{"type":"paragraph","inlineContent":[{"text":"So for this check to work, make sure to ","type":"text"},{"inlineContent":[{"text":"always","type":"text"}],"type":"strong"},{"text":" increase your build number from now on if you haven’t already. Also, if you had been resetting your build number to ","type":"text"},{"code":"1","type":"codeVoice"},{"text":" in the past, make sure to pass the highest build number you’ve ever shipped your app with when calling ","type":"text"},{"code":"lastPaidRelease(version:buildNum:)","type":"codeVoice"},{"text":" and start with the next number for your future releases. E.g. if ","type":"text"},{"code":"5","type":"codeVoice"},{"text":" was your latest released build number, but you had a version with build ","type":"text"},{"code":"25","type":"codeVoice"},{"text":" in the past, pass ","type":"text"},{"code":"25","type":"codeVoice"},{"text":" for the ","type":"text"},{"code":"buildNum","type":"codeVoice"},{"text":" and start your build number at ","type":"text"},{"code":"26","type":"codeVoice"},{"text":" for your next release.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If it takes too long to figure out which was the highest build number, just pick a number that’s sure to be higher than the highest build number so far (e.g. "},{"code":"500","type":"codeVoice"},{"type":"text","text":") and start from there."}]}],"style":"warning","name":"Warning","type":"aside"},{"level":2,"text":"Step 3: Submit a new version & make your app free","anchor":"Step-3-Submit-a-new-version--make-your-app-free","type":"heading"},{"inlineContent":[{"text":"With everything ready and tested, set your app to “Manually release this version” and submit it to the App Store.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"Once your update is approved, release your version and immediately after that set your app pricing to “Free”. This will ensure that no one can download your previous (paid) version for free but also no one has to pay for the new Freemium version.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"That’s it, you successfully migrated your paid app to the Freemium model!"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"The FreemiumKit SDK will automatically treat any users who had paid for your app previously like someone who purchased your highest tier for Lifetime. This means calls to APIs like "},{"code":"PaidFeatureButton","type":"codeVoice"},{"type":"text","text":", "},{"code":"purchasedTier","type":"codeVoice"},{"type":"text","text":" or "},{"code":"hasPurchased","type":"codeVoice"},{"type":"text","text":" will behave like for an active subscriber. 🎉"}],"type":"paragraph"},{"content":[{"inlineContent":[{"text":"If you want to particularly know if the current user is a paid-up-front puchaser who upgraded (e.g. to give them extras like an ‘Early Adopter’ badge), you can call ","type":"text"},{"type":"codeVoice","code":"hasUpgradedFromPaidRelease"},{"text":" on ","type":"text"},{"type":"codeVoice","code":"FreemiumKit.shared"},{"text":" or on the FreemiumKit ","type":"text"},{"type":"codeVoice","code":"@EnvironmentObject"},{"text":".","type":"text"}],"type":"paragraph"}],"style":"tip","name":"Tip","type":"aside"},{"inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/freemiumkit.app"}],"type":"paragraph"},{"level":2,"text":"Contact","anchor":"Contact","type":"heading"},{"inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"type":"reference","identifier":"mailto:freemiumkit@fline.dev","isActive":true},{"type":"text","text":"."}],"type":"paragraph"},{"level":2,"text":"Legal","anchor":"Legal","type":"heading"},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true,"type":"reference"}],"type":"small"}],"kind":"content"}],"references":{"FreemiumKit.png":{"type":"image","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"alt":null,"identifier":"FreemiumKit.png"},"https://freemiumkit.app":{"title":"🏠 Back to Home","type":"link","url":"https:\/\/freemiumkit.app","titleInlineContent":[{"type":"text","text":"🏠 Back to Home"}],"identifier":"https:\/\/freemiumkit.app"},"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}],"title":"SDK Setup Guide","type":"topic","url":"\/documentation\/freemiumkit\/setupguide","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"},"mailto:freemiumkit@fline.dev":{"title":"freemiumkit@fline.dev","type":"link","url":"mailto:freemiumkit@fline.dev","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"identifier":"mailto:freemiumkit@fline.dev"},"https://developer.apple.com/documentation/storekit/supporting_business_model_changes_by_using_the_app_transaction":{"title":"built-in solution","type":"link","url":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction","titleInlineContent":[{"type":"text","text":"built-in solution"}],"identifier":"https:\/\/developer.apple.com\/documentation\/storekit\/supporting_business_model_changes_by_using_the_app_transaction"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"https://www.fline.dev/imprint/":{"title":"Imprint","type":"link","url":"https:\/\/www.fline.dev\/imprint\/","titleInlineContent":[{"type":"text","text":"Imprint"}],"identifier":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}],"title":"Checklist to Pass App Review","type":"topic","url":"\/documentation\/freemiumkit\/appreviewchecklist","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist"}}} \ No newline at end of file diff --git a/data/documentation/freemiumkit/setupguide.json b/data/documentation/freemiumkit/setupguide.json index 40e9c89..19903d9 100644 --- a/data/documentation/freemiumkit/setupguide.json +++ b/data/documentation/freemiumkit/setupguide.json @@ -1 +1 @@ -{"schemaVersion":{"patch":0,"major":0,"minor":3},"sampleCodeDownload":{"action":{"type":"reference","isActive":true,"identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs","overridingTitle":"Detailed Setup Video (17 min)"},"kind":"sampleDownload"},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"},"abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}],"primaryContentSections":[{"kind":"content","content":[{"text":"Adding the SDK","type":"heading","anchor":"Adding-the-SDK","level":2},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Open your app project in Xcode."}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"In the “File” menu select “Add Package Dependencies…”"}],"type":"paragraph"}]}],"type":"orderedList"},{"type":"paragraph","inlineContent":[{"type":"image","identifier":"Setup-Add-Dependency"}]},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Paste this to the top right text field and press “Add Package”:","type":"text"}]},{"type":"codeListing","syntax":null,"code":["https:\/\/github.com\/FlineDev\/FreemiumKit.git"]}]}],"type":"orderedList","start":3},{"type":"paragraph","inlineContent":[{"identifier":"Setup-Add-Package","type":"image"}]},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Select your app target (if not already selected) and confirm by pressing “Add Package”","type":"text"}]}]}],"type":"orderedList","start":4},{"type":"paragraph","inlineContent":[{"identifier":"Setup-Choose-Package","type":"image"}]},{"text":"Configuring the SDK","type":"heading","anchor":"Configuring-the-SDK","level":2},{"name":"Tip","style":"tip","content":[{"inlineContent":[{"text":"Don’t forget to ","type":"text"},{"type":"codeVoice","code":"import FreemiumKit"},{"text":" for any of the below calls to build.","type":"text"}],"type":"paragraph"}],"type":"aside"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"Make sure your app’s Asset Catalog contains the ","type":"text"},{"type":"codeVoice","code":"FreemiumKit"},{"text":" data set from the “Setup” tab of your app in FreemiumKit for Mac. If it doesn’t, drag & drop it from the Setup tab now.","type":"text"}]}]},{"content":[{"inlineContent":[{"text":"Add a call to ","type":"text"},{"code":".environmentObject(FreemiumKit.shared)","type":"codeVoice"},{"text":" to the root view of every scene in the app entry point. For example:","type":"text"}],"type":"paragraph"},{"syntax":"swift","code":["import FreemiumKit","","@main","struct MyApp: App {"," var body: some Scene {"," WindowGroup {"," MainView()"," .environmentObject(FreemiumKit.shared)"," }"," }","}"],"type":"codeListing"}]}],"type":"orderedList"},{"name":"Tip","style":"tip","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"If you want to disable the paywall during DEBUG builds after you’ve made sure that it works as expected, you can call "},{"type":"codeVoice","code":".overrideForDebug"},{"type":"text","text":" on "},{"type":"codeVoice","code":"FreemiumKit.shared"},{"type":"text","text":" within an "},{"type":"codeVoice","code":"#if DEBUG"},{"type":"text","text":" check like this:"}]},{"code":["WindowGroup {"," MainView()"," .onAppear {"," #if DEBUG"," FreemiumKit.shared.overrideForDebug(purchasedTier: 1)"," #endif"," }"," .environmentObject(FreemiumKit.shared)","}"],"syntax":"swift","type":"codeListing"}],"type":"aside"},{"text":"Understanding Apples Tier System","type":"heading","anchor":"Understanding-Apples-Tier-System","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"If your goal is to ship your app with any combination of Monthly, Yearly, and Lifetime purchases, you most likely only need one tier: Tier 1. Just pass "},{"code":"1","type":"codeVoice"},{"type":"text","text":" for the "},{"code":"purchasedTier","type":"codeVoice"},{"type":"text","text":" parameter everywhere or don’t pass any, "},{"code":"1","type":"codeVoice"},{"type":"text","text":" is the default value – easy. Continue to the next section."}]},{"type":"paragraph","inlineContent":[{"text":"But if you want to support multiple levels of access to your app, like a combination of Monthly\/Yearly\/Lifetime for the ‘Pro’ level, another combination of Monthly\/Yearly\/Lifetime for the ‘Max’ level, and maybe another combination of Monthly\/Yearly\/Lifetime for the ‘Ultra’ level, that’s when you need to think about which value to pass to the ","type":"text"},{"code":"purchasedTier","type":"codeVoice"},{"text":" parameter. Note that ","type":"text"},{"code":"1","type":"codeVoice"},{"text":" always refers to the highest level. That’s how Apple has decided their tier system to work. Read their ","type":"text"},{"type":"reference","identifier":"https:\/\/developer.apple.com\/help\/app-store-connect\/manage-subscriptions\/offer-auto-renewable-subscriptions","isActive":true},{"text":" to learn more.","type":"text"}]},{"text":"Showing the Paywalls","type":"heading","anchor":"Showing-the-Paywalls","level":2},{"identifier":"PaidViews","type":"video"},{"items":[{"content":[{"inlineContent":[{"type":"text","text":"Lock your paid features for users who have not made a purchase yet by using one of the built-in views "},{"code":"PaidFeatureButton","type":"codeVoice"},{"type":"text","text":" or "},{"code":"PaidFeatureView","type":"codeVoice"},{"type":"text","text":". This is the recommended way of using the SDK (when applicable) as it handles purchase states automatically for you and saves you a lot of boilerplate code. For example:"}],"type":"paragraph"},{"code":["\/\/ opens paywall if user has not purchased, else just like `Button`","PaidFeatureButton(\"Export\", systemImage: \"square.and.arrow.up\") {"," \/\/ your export logic – no check for a paid tier needed, only called if already purchased ","}","","\/\/ exactly the same as above, but gives you full customizability","PaidFeatureView {"," Button(\"Export\", systemImage: \"square.and.arrow.up\") {"," \/\/ your export logic – no check for a paid tier needed, only called if already purchased"," }","} lockedView: {"," Label(\"Export\", systemImage: \"lock\")","}"],"syntax":"swift","type":"codeListing"},{"inlineContent":[{"type":"text","text":"Both "},{"code":"PaidFeatureButton","type":"codeVoice"},{"type":"text","text":" and "},{"code":"PaidFeatureView","type":"codeVoice"},{"type":"text","text":" accept an "},{"code":"unlocksAtTier","type":"codeVoice"},{"type":"text","text":" parameter of type "},{"code":"Int","type":"codeVoice"},{"type":"text","text":" (default: "},{"code":"1","type":"codeVoice"},{"type":"text","text":") and a "},{"code":"showPaywallOnPressIfLocked","type":"codeVoice"},{"type":"text","text":" parameter of type "},{"code":"Bool","type":"codeVoice"},{"type":"text","text":" (default: "},{"code":"true","type":"codeVoice"},{"type":"text","text":")."}],"type":"paragraph"},{"inlineContent":[{"text":"If you don’t pass any of those parameters, the default behavior unlocks the feature only if tier 1 is purchased and shows a paywall on press if tier 1 is not yet purchased. If ","type":"text"},{"type":"codeVoice","code":"showPaywallOnPressIfLocked"},{"text":" is set to ","type":"text"},{"type":"codeVoice","code":"false"},{"text":", the locked view will not have any automatic interaction, just rendering locked view state as-is without any added behavior.","type":"text"}],"type":"paragraph"},{"content":[{"type":"paragraph","inlineContent":[{"text":"If you place ","type":"text"},{"type":"codeVoice","code":"PaidFeatureButton"},{"text":" or ","type":"text"},{"type":"codeVoice","code":"PaidFeatureView"},{"text":" inside a view that self-dismisses itself after any interaction (like in a ","type":"text"},{"type":"codeVoice","code":"Menu"},{"text":"), the paywall might not show because SwiftUI deinitializes the view and attached logic before it can be executed. Use the below method in such contexts and place the ","type":"text"},{"type":"codeVoice","code":".paywall"},{"text":" modifier at the root of your view to avoid auto-deinit.","type":"text"}]}],"name":"Note","style":"note","type":"aside"}]},{"content":[{"inlineContent":[{"text":"Alternatively, if you want to control the presentation of the paywall manually, you can add the ","type":"text"},{"code":".paywall(isPresented:)","type":"codeVoice"},{"text":" modifier to your custom views where needed. For example:","type":"text"}],"type":"paragraph"},{"code":["import FreemiumKit","","struct MyView: View {"," @State var showPaywall: Bool = false",""," var body: some View {"," Button(\"Unlock Pro\") {"," showPaywall = true"," }"," .paywall(isPresented: $showPaywall)"," }","}"],"syntax":"swift","type":"codeListing"},{"inlineContent":[{"type":"text","text":"If you want to conditionally hide views based on paid state (like hiding the unlock button if a user has already purchased), you can add the "},{"code":"FreemiumKit","type":"codeVoice"},{"type":"text","text":" object as an "},{"code":"@EnvironmentObject","type":"codeVoice"},{"type":"text","text":" and call "},{"code":".purchasedTier","type":"codeVoice"},{"type":"text","text":" or "},{"code":".hasPurchased","type":"codeVoice"},{"type":"text","text":" if you only have one tier like so:"}],"type":"paragraph"},{"code":["import FreemiumKit","","struct MyView: View {"," @EnvironmentObject var freemiumKit: FreemiumKit"," @State var showPaywall: Bool = false",""," var body: some View {"," if freemiumKit.purchasedTier == nil {"," Button(\"Unlock Pro\") {"," showPaywall = true"," }"," .paywall(isPresented: $showPaywall)"," }"," }","}"],"syntax":"swift","type":"codeListing"},{"inlineContent":[{"text":"If you want to show the paywall upon appearance of a view if a user has not paid, you should first check that the ","type":"text"},{"code":"purchasesLoaded","type":"codeVoice"},{"text":" property of ","type":"text"},{"code":"FreemiumKit","type":"codeVoice"},{"text":" is ","type":"text"},{"code":"true","type":"codeVoice"},{"text":" – or else paying users might see the paywall, too. Since this is a common use case, our SDK ships with the ","type":"text"},{"code":".onPurchasesLoaded","type":"codeVoice"},{"text":" view modifier which is guaranteed to be called exactly once (like ","type":"text"},{"code":".onAppear","type":"codeVoice"},{"text":") but only when purchases are loaded:","type":"text"}],"type":"paragraph"},{"code":["import FreemiumKit","","struct MyView: View {"," @State var showPaywall: Bool = false",""," var body: some View {"," VStack {"," \/\/ your view ..."," }"," .paywall(isPresented: $showPaywall)"," .onPurchasesLoaded {"," if !FreemiumKit.shared.hasPurchased {"," showPaywall = true"," }"," }"," }","}"],"syntax":"swift","type":"codeListing"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"There’s also a "},{"code":"PaidStatusView","type":"codeVoice"},{"type":"text","text":" which you can add to your app’s settings to indicate to users what their current purchase state is. There are two styles:"}]},{"code":["PaidStatusView(style: .plain)","PaidStatusView(style: .decorative(icon: .laurel))"],"type":"codeListing","syntax":"swift"}]}],"type":"orderedList"},{"type":"paragraph","inlineContent":[{"identifier":"Setup-PaidStatusView","type":"image"}]},{"type":"paragraph","inlineContent":[{"text":"The ","type":"text"},{"type":"codeVoice","code":".decorative"},{"text":" style has multiple ","type":"text"},{"type":"codeVoice","code":"icon"},{"text":" parameter options and also accepts optional ","type":"text"},{"type":"codeVoice","code":"foregroundColor"},{"text":" and ","type":"text"},{"type":"codeVoice","code":"backgroundColor"},{"text":" parameters if you need to adjust the defaults. Note that the ","type":"text"},{"type":"codeVoice","code":"PaidStatusView"},{"text":" will automatically open a paywall on press if there’s no purchase yet. Else, it’s rendered as just a label without interaction.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you place it inside a "},{"code":"Form","type":"codeVoice"},{"type":"text","text":" with "},{"code":"Sections","type":"codeVoice"},{"type":"text","text":", you might want to set the "},{"code":"listRowBackground","type":"codeVoice"},{"type":"text","text":" for a clean look like this:"}]},{"code":["Form {"," Section {"," PaidStatusView(style: .decorative(icon: .laurel))"," .listRowBackground(Color.accentColor)"," .padding(.vertical, -10)"," }"," "," \/\/ ...","}"],"type":"codeListing","syntax":"swift"},{"name":"Tip","style":"tip","content":[{"inlineContent":[{"type":"text","text":"We prepared a "},{"isActive":true,"type":"reference","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist"},{"type":"text","text":" you will find useful, especially if this is the first time you’re publishing an app with In-App Purchases."}],"type":"paragraph"}],"type":"aside"},{"text":"`@EnvironmentObject` vs `FreemiumKit.shared`","type":"heading","anchor":"EnvironmentObject-vs-FreemiumKitshared","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"Sometimes we were using "},{"type":"codeVoice","code":"FreemiumKit.shared"},{"type":"text","text":" and sometimes "},{"type":"codeVoice","code":"@EnvironmentObject var freemiumKit: FreemiumKit"},{"type":"text","text":". They both actually refer to the exact same Singleton instance. So you might ask yourself: "},{"type":"emphasis","inlineContent":[{"inlineContent":[{"text":"When to use which?","type":"text"}],"type":"strong"}]}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The answer is simple: Whenever you are in a "},{"type":"strong","inlineContent":[{"type":"text","text":"SwiftUI view"}]},{"type":"text","text":" and you want your view to "},{"type":"strong","inlineContent":[{"type":"text","text":"automatically update"}]},{"type":"text","text":" based on the purchase state, you should use "},{"type":"codeVoice","code":"@EnvironmentObject"},{"type":"text","text":". This will ensure that the SwiftUI rendering picks up changes to the purchase state and refreshes your UI accordingly."}]},{"type":"paragraph","inlineContent":[{"text":"Everywhere else, you can use ","type":"text"},{"code":"FreemiumKit.shared","type":"codeVoice"},{"text":". For example in your model layer, your user-intitiated functions, or even in one-off modifiers in your views like in ","type":"text"},{"code":"onAppear","type":"codeVoice"},{"text":".","type":"text"}]},{"text":"SwiftUI Previews","type":"heading","anchor":"SwiftUI-Previews","level":2},{"type":"paragraph","inlineContent":[{"type":"text","text":"For SwiftUI previews to work where you make use of the built-in views or modifier, add a call to "},{"code":".environmentObject(FreemiumKit.preview)","type":"codeVoice"},{"type":"text","text":" in your preview code like so:"}]},{"code":["#Preview {"," YourView()"," .environmentObject(FreemiumKit.preview)","}"],"type":"codeListing","syntax":"swift"},{"type":"paragraph","inlineContent":[{"type":"text","text":"If you want to simulate a specific paid state in your previews, you can call the "},{"code":"withOverridesForDebug(purchasedTier:)","type":"codeVoice"},{"type":"text","text":" function on "},{"code":"FreemiumKit.preview","type":"codeVoice"},{"type":"text","text":" and set your desired tier (set "},{"code":"1","type":"codeVoice"},{"type":"text","text":" for full access). The default "},{"code":"FreemiumKit.preview","type":"codeVoice"},{"type":"text","text":" shows in the “nothing purchased” state, showcasing how things will look from a Free users perspective. For example:"}]},{"code":["#Preview(\"Full Access\") {"," YourView()"," .environmentObject(FreemiumKit.preview.withOverridesForDebug(purchasedTier: 1))","}"],"type":"codeListing","syntax":"swift"},{"name":"Note","style":"note","content":[{"type":"paragraph","inlineContent":[{"text":"The paywall UI you will see in SwiftUI previews will not reflect your custom paywall UI due to previews being rendered outside your apps lifecycle. Run your app on device or simulator to see your own paywall.","type":"text"}]}],"type":"aside"},{"text":"Direct Access to StoreKit Transactions","type":"heading","anchor":"Direct-Access-to-StoreKit-Transactions","level":2},{"type":"paragraph","inlineContent":[{"text":"In some advanced use cases, you might want to directly access the transactions reported by ","type":"text"},{"type":"codeVoice","code":"StoreKit"},{"text":" which our SDK is already subscribed to. You can easily get all valid transactions by calling ","type":"text"},{"type":"codeVoice","code":"FreemiumKit.shared.purchasedTransactions"},{"text":" or even subscribe and react to changes in your SwiftUI views:","type":"text"}]},{"code":["import FreemiumKit","","struct MyView: View {"," @EnvironmentObject var freemiumKit: FreemiumKit",""," var body: some View {"," MyView()"," .onChange(of: self.freemiumKit.purchasedTransactions) {"," for transaction in self.freemiumKit.purchasedTransactions {"," \/\/ do something with the `StoreKit.Transaction`"," }"," }"," }","}"],"type":"codeListing","syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"If all you need to know is ","type":"text"},{"inlineContent":[{"type":"text","text":"which"}],"type":"emphasis"},{"text":" of your in-app purchases\/subscriptions the user has purchased, there’s a much easier way to get the ID of the product (e.g. ","type":"text"},{"type":"codeVoice","code":"YourApp.Pro.Monthly"},{"text":"):","type":"text"}]},{"code":["FreemiumKit.shared.purchasedProductID \/\/ returns a `String?`"],"type":"codeListing","syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"If all you need is to ","type":"text"},{"inlineContent":[{"type":"text","text":"get notified"}],"type":"strong"},{"text":" when a user just made a purchase (e.g. to report to analytics or show some kind of confetti effect), use the built-in ","type":"text"},{"type":"codeVoice","code":".onPurchaseCompleted"},{"text":" modifier which has the purchased ","type":"text"},{"type":"codeVoice","code":"transaction"},{"text":" available with all the StoreKit details if needed:","type":"text"}]},{"code":["import FreemiumKit","","@main","struct MyApp: App {"," var body: some Scene {"," WindowGroup {"," MainView()"," .onPurchaseCompleted { transaction in"," \/\/ show confetti or report transaction details to analytics"," }"," .environmentObject(FreemiumKit.shared)"," }"," }","}"],"type":"codeListing","syntax":"swift"},{"type":"paragraph","inlineContent":[{"identifier":"https:\/\/freemiumkit.app","isActive":true,"type":"reference"}]},{"text":"Contact","type":"heading","anchor":"Contact","level":2},{"type":"paragraph","inlineContent":[{"text":"Have questions or need support? Reach out to me at ","type":"text"},{"isActive":true,"identifier":"mailto:freemiumkit@fline.dev","type":"reference"},{"text":".","type":"text"}]},{"text":"Legal","type":"heading","anchor":"Legal","level":2},{"type":"small","inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}]}]}],"metadata":{"role":"article","title":"SDK Setup Guide","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"roleHeading":"FreemiumKit"},"kind":"article","sections":[],"seeAlsoSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"],"generated":true}],"references":{"mailto:freemiumkit@fline.dev":{"title":"freemiumkit@fline.dev","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev","type":"link","identifier":"mailto:freemiumkit@fline.dev"},"https://www.fline.dev/imprint/":{"titleInlineContent":[{"text":"Imprint","type":"text"}],"type":"link","identifier":"https:\/\/www.fline.dev\/imprint\/","url":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint"},"https://freemiumkit.app":{"titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"type":"link","identifier":"https:\/\/freemiumkit.app","url":"https:\/\/freemiumkit.app","title":"🏠 Back to Home"},"PaidViews":{"type":"video","identifier":"PaidViews","alt":null,"variants":[{"traits":["1x","light"],"url":"\/videos\/PaidViews.mp4"}],"poster":"PaidViews-Poster"},"Setup-Add-Dependency":{"type":"image","identifier":"Setup-Add-Dependency","alt":null,"variants":[{"traits":["1x","light"],"url":"\/images\/Setup-Add-Dependency.jpeg"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"FreemiumKit.png":{"type":"image","identifier":"FreemiumKit.png","alt":null,"variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}]},"Setup-Add-Package":{"type":"image","identifier":"Setup-Add-Package","alt":null,"variants":[{"traits":["1x","light"],"url":"\/images\/Setup-Add-Package.jpeg"}]},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","type":"topic","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"url":"\/documentation\/freemiumkit\/migratefrompaid","title":"Paid to Freemium Migration Guide","kind":"article"},"Setup-Choose-Package":{"type":"image","identifier":"Setup-Choose-Package","alt":null,"variants":[{"traits":["1x","light"],"url":"\/images\/Setup-Choose-Package.jpeg"}]},"doc://FreemiumKit/documentation/Index":{"kind":"article","url":"\/documentation\/index","role":"collection","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","title":"FreemiumKit","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}]},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"kind":"article","url":"\/documentation\/freemiumkit\/appreviewchecklist","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","title":"Checklist to Pass App Review","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}]},"Setup-PaidStatusView":{"type":"image","identifier":"Setup-PaidStatusView","alt":null,"variants":[{"traits":["1x","light"],"url":"\/images\/Setup-PaidStatusView.jpeg"}]},"https://developer.apple.com/help/app-store-connect/manage-subscriptions/offer-auto-renewable-subscriptions":{"titleInlineContent":[{"text":"official docs","type":"text"}],"type":"link","identifier":"https:\/\/developer.apple.com\/help\/app-store-connect\/manage-subscriptions\/offer-auto-renewable-subscriptions","url":"https:\/\/developer.apple.com\/help\/app-store-connect\/manage-subscriptions\/offer-auto-renewable-subscriptions","title":"official docs"},"https://www.youtube.com/watch?v=6JxwA3WieHs":{"checksum":null,"type":"download","identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs","url":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs"},"PaidViews-Poster":{"type":"image","identifier":"PaidViews-Poster","alt":null,"variants":[{"traits":["1x","light"],"url":"\/images\/PaidViews-Poster.jpeg"}]}}} \ No newline at end of file +{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"},"kind":"article","seeAlsoSections":[{"generated":true,"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]}],"abstract":[{"text":"Learn how to set up your app for our paywalls and live push notifications.","type":"text"}],"metadata":{"role":"article","title":"SDK Setup Guide","roleHeading":"FreemiumKit","images":[{"identifier":"FreemiumKit.png","type":"icon"}]},"hierarchy":{"paths":[["doc:\/\/FreemiumKit\/documentation\/Index"]]},"sampleCodeDownload":{"kind":"sampleDownload","action":{"type":"reference","identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs","overridingTitle":"Detailed Setup Video (17 min)","isActive":true}},"schemaVersion":{"minor":3,"major":0,"patch":0},"primaryContentSections":[{"content":[{"text":"Adding the SDK","type":"heading","level":2,"anchor":"Adding-the-SDK"},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"text":"Open your app project in Xcode.","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"In the “File” menu select “Add Package Dependencies…”"}]}]}]},{"type":"paragraph","inlineContent":[{"identifier":"Setup-Add-Dependency","type":"image"}]},{"type":"orderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Paste this to the top right text field and press “Add Package”:"}]},{"syntax":null,"code":["https:\/\/github.com\/FlineDev\/FreemiumKit.git"],"type":"codeListing"}]}],"start":3},{"type":"paragraph","inlineContent":[{"identifier":"Setup-Add-Package","type":"image"}]},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"text":"Select your app target (if not already selected) and confirm by pressing “Add Package”","type":"text"}],"type":"paragraph"}]}],"start":4},{"type":"paragraph","inlineContent":[{"identifier":"Setup-Choose-Package","type":"image"}]},{"text":"Configuring the SDK","type":"heading","level":2,"anchor":"Configuring-the-SDK"},{"type":"aside","name":"Tip","content":[{"inlineContent":[{"type":"text","text":"Don’t forget to "},{"type":"codeVoice","code":"import FreemiumKit"},{"type":"text","text":" for any of the below calls to build."}],"type":"paragraph"}],"style":"tip"},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"Make sure your app’s Asset Catalog contains the "},{"type":"codeVoice","code":"FreemiumKit"},{"type":"text","text":" data set from the “Setup” tab of your app in FreemiumKit for Mac. If it doesn’t, drag & drop it from the Setup tab now."}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"text","text":"Add a call to "},{"type":"codeVoice","code":".environmentObject(FreemiumKit.shared)"},{"type":"text","text":" to the root view of every scene in the app entry point. For example:"}],"type":"paragraph"},{"code":["import FreemiumKit","","@main","struct MyApp: App {"," var body: some Scene {"," WindowGroup {"," MainView()"," .environmentObject(FreemiumKit.shared)"," }"," }","}"],"syntax":"swift","type":"codeListing"}]}]},{"type":"aside","name":"Tip","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"If you want to disable the paywall during DEBUG builds after you’ve made sure that it works as expected, you can call "},{"type":"codeVoice","code":".overrideForDebug"},{"type":"text","text":" on "},{"type":"codeVoice","code":"FreemiumKit.shared"},{"type":"text","text":" within an "},{"type":"codeVoice","code":"#if DEBUG"},{"type":"text","text":" check like this:"}]},{"code":["WindowGroup {"," MainView()"," .onAppear {"," #if DEBUG"," FreemiumKit.shared.overrideForDebug(purchasedTier: 1)"," #endif"," }"," .environmentObject(FreemiumKit.shared)","}"],"type":"codeListing","syntax":"swift"}],"style":"tip"},{"text":"Understanding Apples Tier System","type":"heading","level":2,"anchor":"Understanding-Apples-Tier-System"},{"type":"paragraph","inlineContent":[{"type":"text","text":"If your goal is to ship your app with any combination of Monthly, Yearly, and Lifetime purchases, you most likely only need one tier: Tier 1. Just pass "},{"type":"codeVoice","code":"1"},{"type":"text","text":" for the "},{"type":"codeVoice","code":"purchasedTier"},{"type":"text","text":" parameter everywhere or don’t pass any, "},{"type":"codeVoice","code":"1"},{"type":"text","text":" is the default value – easy. Continue to the next section."}]},{"type":"paragraph","inlineContent":[{"text":"But if you want to support multiple levels of access to your app, like a combination of Monthly\/Yearly\/Lifetime for the ‘Pro’ level, another combination of Monthly\/Yearly\/Lifetime for the ‘Max’ level, and maybe another combination of Monthly\/Yearly\/Lifetime for the ‘Ultra’ level, that’s when you need to think about which value to pass to the ","type":"text"},{"code":"purchasedTier","type":"codeVoice"},{"text":" parameter. Note that ","type":"text"},{"code":"1","type":"codeVoice"},{"text":" always refers to the highest level. That’s how Apple has decided their tier system to work. Read their ","type":"text"},{"identifier":"https:\/\/developer.apple.com\/help\/app-store-connect\/manage-subscriptions\/offer-auto-renewable-subscriptions","type":"reference","isActive":true},{"text":" to learn more.","type":"text"}]},{"text":"Showing the Paywalls","type":"heading","level":2,"anchor":"Showing-the-Paywalls"},{"type":"video","identifier":"PaidViews"},{"type":"orderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"Lock your paid features for users who have not made a purchase yet by using one of the built-in views "},{"type":"codeVoice","code":"PaidFeatureButton"},{"type":"text","text":" or "},{"type":"codeVoice","code":"PaidFeatureView"},{"type":"text","text":". This is the recommended way of using the SDK (when applicable) as it handles purchase states automatically for you and saves you a lot of boilerplate code. For example:"}],"type":"paragraph"},{"syntax":"swift","code":["\/\/ opens paywall if user has not purchased, else just like `Button`","PaidFeatureButton(\"Export\", systemImage: \"square.and.arrow.up\") {"," \/\/ your export logic – no check for a paid tier needed, only called if already purchased ","}","","\/\/ exactly the same as above, but gives you full customizability","PaidFeatureView {"," Button(\"Export\", systemImage: \"square.and.arrow.up\") {"," \/\/ your export logic – no check for a paid tier needed, only called if already purchased"," }","} lockedView: {"," Label(\"Export\", systemImage: \"lock\")","}"],"type":"codeListing"},{"inlineContent":[{"text":"Both ","type":"text"},{"code":"PaidFeatureButton","type":"codeVoice"},{"text":" and ","type":"text"},{"code":"PaidFeatureView","type":"codeVoice"},{"text":" accept an ","type":"text"},{"code":"unlocksAtTier","type":"codeVoice"},{"text":" parameter of type ","type":"text"},{"code":"Int","type":"codeVoice"},{"text":" (default: ","type":"text"},{"code":"1","type":"codeVoice"},{"text":") and a ","type":"text"},{"code":"showPaywallOnPressIfLocked","type":"codeVoice"},{"text":" parameter of type ","type":"text"},{"code":"Bool","type":"codeVoice"},{"text":" (default: ","type":"text"},{"code":"true","type":"codeVoice"},{"text":").","type":"text"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"If you don’t pass any of those parameters, the default behavior unlocks the feature only if tier 1 is purchased and shows a paywall on press if tier 1 is not yet purchased. If "},{"type":"codeVoice","code":"showPaywallOnPressIfLocked"},{"type":"text","text":" is set to "},{"type":"codeVoice","code":"false"},{"type":"text","text":", the locked view will not have any automatic interaction, just rendering locked view state as-is without any added behavior."}],"type":"paragraph"},{"style":"note","name":"Note","content":[{"inlineContent":[{"text":"If you place ","type":"text"},{"type":"codeVoice","code":"PaidFeatureButton"},{"text":" or ","type":"text"},{"type":"codeVoice","code":"PaidFeatureView"},{"text":" inside a view that self-dismisses itself after any interaction (like in a ","type":"text"},{"type":"codeVoice","code":"Menu"},{"text":"), the paywall might not show because SwiftUI deinitializes the view and attached logic before it can be executed. Use the below method in such contexts and place the ","type":"text"},{"type":"codeVoice","code":".paywall"},{"text":" modifier at the root of your view to avoid auto-deinit.","type":"text"}],"type":"paragraph"}],"type":"aside"}]},{"content":[{"inlineContent":[{"type":"text","text":"Alternatively, if you want to control the presentation of the paywall manually, you can add the "},{"type":"codeVoice","code":".paywall(isPresented:)"},{"type":"text","text":" modifier to your custom views where needed. For example:"}],"type":"paragraph"},{"code":["import FreemiumKit","","struct MyView: View {"," @State var showPaywall: Bool = false",""," var body: some View {"," Button(\"Unlock Pro\") {"," showPaywall = true"," }"," .paywall(isPresented: $showPaywall)"," }","}"],"type":"codeListing","syntax":"swift"},{"inlineContent":[{"type":"text","text":"If you want to conditionally hide views based on paid state (like hiding the unlock button if a user has already purchased), you can add the "},{"type":"codeVoice","code":"FreemiumKit"},{"type":"text","text":" object as an "},{"type":"codeVoice","code":"@EnvironmentObject"},{"type":"text","text":" and call "},{"type":"codeVoice","code":".purchasedTier"},{"type":"text","text":" or "},{"type":"codeVoice","code":".hasPurchased"},{"type":"text","text":" if you only have one tier like so:"}],"type":"paragraph"},{"code":["import FreemiumKit","","struct MyView: View {"," @EnvironmentObject var freemiumKit: FreemiumKit"," @State var showPaywall: Bool = false",""," var body: some View {"," if freemiumKit.purchasedTier == nil {"," Button(\"Unlock Pro\") {"," showPaywall = true"," }"," .paywall(isPresented: $showPaywall)"," }"," }","}"],"type":"codeListing","syntax":"swift"},{"inlineContent":[{"text":"If you want to show the paywall upon appearance of a view if a user has not paid, you should first check that the ","type":"text"},{"type":"codeVoice","code":"purchasesLoaded"},{"text":" property of ","type":"text"},{"type":"codeVoice","code":"FreemiumKit"},{"text":" is ","type":"text"},{"type":"codeVoice","code":"true"},{"text":" – or else paying users might see the paywall, too. Since this is a common use case, our SDK ships with the ","type":"text"},{"type":"codeVoice","code":".onPurchasesLoaded"},{"text":" view modifier which is guaranteed to be called exactly once (like ","type":"text"},{"type":"codeVoice","code":".onAppear"},{"text":") but only when purchases are loaded:","type":"text"}],"type":"paragraph"},{"code":["import FreemiumKit","","struct MyView: View {"," @State var showPaywall: Bool = false",""," var body: some View {"," VStack {"," \/\/ your view ..."," }"," .paywall(isPresented: $showPaywall)"," .onPurchasesLoaded {"," if !FreemiumKit.shared.hasPurchased {"," showPaywall = true"," }"," }"," }","}"],"type":"codeListing","syntax":"swift"}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"There’s also a ","type":"text"},{"code":"PaidStatusView","type":"codeVoice"},{"text":" which you can add to your app’s settings to indicate to users what their current purchase state is. There are two styles:","type":"text"}]},{"syntax":"swift","type":"codeListing","code":["PaidStatusView(style: .plain)","PaidStatusView(style: .decorative(icon: .laurel))"]}]}]},{"type":"paragraph","inlineContent":[{"type":"image","identifier":"Setup-PaidStatusView"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"code":".decorative","type":"codeVoice"},{"type":"text","text":" style has multiple "},{"code":"icon","type":"codeVoice"},{"type":"text","text":" parameter options and also accepts optional "},{"code":"foregroundColor","type":"codeVoice"},{"type":"text","text":" and "},{"code":"backgroundColor","type":"codeVoice"},{"type":"text","text":" parameters if you need to adjust the defaults. Note that the "},{"code":"PaidStatusView","type":"codeVoice"},{"type":"text","text":" will automatically open a paywall on press if there’s no purchase yet. Else, it’s rendered as just a label without interaction."}]},{"type":"paragraph","inlineContent":[{"text":"If you place it inside a ","type":"text"},{"code":"Form","type":"codeVoice"},{"text":" with ","type":"text"},{"code":"Sections","type":"codeVoice"},{"text":", you might want to set the ","type":"text"},{"code":"listRowBackground","type":"codeVoice"},{"text":" for a clean look like this:","type":"text"}]},{"type":"codeListing","code":["Form {"," Section {"," PaidStatusView(style: .decorative(icon: .laurel))"," .listRowBackground(Color.accentColor)"," .padding(.vertical, -10)"," }"," "," \/\/ ...","}"],"syntax":"swift"},{"type":"aside","name":"Tip","content":[{"inlineContent":[{"text":"We prepared a ","type":"text"},{"isActive":true,"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","type":"reference"},{"text":" you will find useful, especially if this is the first time you’re publishing an app with In-App Purchases.","type":"text"}],"type":"paragraph"}],"style":"tip"},{"text":"`@EnvironmentObject` vs `FreemiumKit.shared`","type":"heading","level":2,"anchor":"EnvironmentObject-vs-FreemiumKitshared"},{"type":"paragraph","inlineContent":[{"text":"Sometimes we were using ","type":"text"},{"code":"FreemiumKit.shared","type":"codeVoice"},{"text":" and sometimes ","type":"text"},{"code":"@EnvironmentObject var freemiumKit: FreemiumKit","type":"codeVoice"},{"text":". They both actually refer to the exact same Singleton instance. So you might ask yourself: ","type":"text"},{"type":"emphasis","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"When to use which?"}]}]}]},{"type":"paragraph","inlineContent":[{"text":"The answer is simple: Whenever you are in a ","type":"text"},{"inlineContent":[{"type":"text","text":"SwiftUI view"}],"type":"strong"},{"text":" and you want your view to ","type":"text"},{"inlineContent":[{"text":"automatically update","type":"text"}],"type":"strong"},{"text":" based on the purchase state, you should use ","type":"text"},{"code":"@EnvironmentObject","type":"codeVoice"},{"text":". This will ensure that the SwiftUI rendering picks up changes to the purchase state and refreshes your UI accordingly.","type":"text"}]},{"type":"paragraph","inlineContent":[{"type":"text","text":"Everywhere else, you can use "},{"type":"codeVoice","code":"FreemiumKit.shared"},{"type":"text","text":". For example in your model layer, your user-intitiated functions, or even in one-off modifiers in your views like in "},{"type":"codeVoice","code":"onAppear"},{"type":"text","text":"."}]},{"text":"SwiftUI Previews","type":"heading","level":2,"anchor":"SwiftUI-Previews"},{"type":"paragraph","inlineContent":[{"type":"text","text":"For SwiftUI previews to work where you make use of the built-in views or modifier, add a call to "},{"code":".environmentObject(FreemiumKit.preview)","type":"codeVoice"},{"type":"text","text":" in your preview code like so:"}]},{"type":"codeListing","code":["#Preview {"," YourView()"," .environmentObject(FreemiumKit.preview)","}"],"syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"If you want to simulate a specific paid state in your previews, you can call the ","type":"text"},{"code":"withOverridesForDebug(purchasedTier:)","type":"codeVoice"},{"text":" function on ","type":"text"},{"code":"FreemiumKit.preview","type":"codeVoice"},{"text":" and set your desired tier (set ","type":"text"},{"code":"1","type":"codeVoice"},{"text":" for full access). The default ","type":"text"},{"code":"FreemiumKit.preview","type":"codeVoice"},{"text":" shows in the “nothing purchased” state, showcasing how things will look from a Free users perspective. For example:","type":"text"}]},{"type":"codeListing","code":["#Preview(\"Full Access\") {"," YourView()"," .environmentObject(FreemiumKit.preview.withOverridesForDebug(purchasedTier: 1))","}"],"syntax":"swift"},{"type":"aside","name":"Note","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The paywall UI you will see in SwiftUI previews will not reflect your custom paywall UI due to previews being rendered outside your apps lifecycle. Run your app on device or simulator to see your own paywall."}]}],"style":"note"},{"text":"Direct Access to StoreKit Transactions","type":"heading","level":2,"anchor":"Direct-Access-to-StoreKit-Transactions"},{"type":"paragraph","inlineContent":[{"type":"text","text":"In some advanced use cases, you might want to directly access the transactions reported by "},{"code":"StoreKit","type":"codeVoice"},{"type":"text","text":" which our SDK is already subscribed to. You can easily get all valid transactions by calling "},{"code":"FreemiumKit.shared.purchasedTransactions","type":"codeVoice"},{"type":"text","text":" or even subscribe and react to changes in your SwiftUI views:"}]},{"type":"codeListing","code":["import FreemiumKit","","struct MyView: View {"," @EnvironmentObject var freemiumKit: FreemiumKit",""," var body: some View {"," MyView()"," .onChange(of: self.freemiumKit.purchasedTransactions) {"," for transaction in self.freemiumKit.purchasedTransactions {"," \/\/ do something with the `StoreKit.Transaction`"," }"," }"," }","}"],"syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"If all you need to know is ","type":"text"},{"type":"emphasis","inlineContent":[{"type":"text","text":"which"}]},{"text":" of your in-app purchases\/subscriptions the user has purchased, there’s a much easier way to get the ID of the product (e.g. ","type":"text"},{"code":"YourApp.Pro.Monthly","type":"codeVoice"},{"text":"):","type":"text"}]},{"type":"codeListing","code":["FreemiumKit.shared.purchasedProductID \/\/ returns a `String?`"],"syntax":"swift"},{"type":"paragraph","inlineContent":[{"text":"If all you need is to ","type":"text"},{"type":"strong","inlineContent":[{"text":"get notified","type":"text"}]},{"text":" when a user just made a purchase (e.g. to report to analytics or show some kind of confetti effect), use the built-in ","type":"text"},{"code":".onPurchaseCompleted","type":"codeVoice"},{"text":" modifier which has the purchased ","type":"text"},{"code":"transaction","type":"codeVoice"},{"text":" available with all the StoreKit details if needed:","type":"text"}]},{"type":"codeListing","code":["import FreemiumKit","","@main","struct MyApp: App {"," var body: some Scene {"," WindowGroup {"," MainView()"," .onPurchaseCompleted { transaction in"," \/\/ show confetti or report transaction details to analytics"," }"," .environmentObject(FreemiumKit.shared)"," }"," }","}"],"syntax":"swift"},{"type":"paragraph","inlineContent":[{"type":"reference","identifier":"https:\/\/freemiumkit.app","isActive":true}]},{"text":"Contact","type":"heading","level":2,"anchor":"Contact"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"type":"reference","identifier":"mailto:freemiumkit@fline.dev","isActive":true},{"type":"text","text":"."}]},{"text":"Legal","type":"heading","level":2,"anchor":"Legal"},{"type":"small","inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","isActive":true,"identifier":"https:\/\/www.fline.dev\/imprint\/"}]}],"kind":"content"}],"sections":[],"references":{"doc://FreemiumKit/documentation/Index":{"images":[{"identifier":"FreemiumKit.png","type":"icon"}],"title":"FreemiumKit","identifier":"doc:\/\/FreemiumKit\/documentation\/Index","role":"collection","url":"\/documentation\/index","kind":"article","type":"topic","abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}]},"Setup-Add-Dependency":{"variants":[{"url":"\/images\/Setup-Add-Dependency.jpeg","traits":["1x","light"]}],"identifier":"Setup-Add-Dependency","type":"image","alt":null},"PaidViews":{"variants":[{"url":"\/videos\/PaidViews.mp4","traits":["1x","light"]}],"identifier":"PaidViews","type":"video","poster":"PaidViews-Poster","alt":null},"https://developer.apple.com/help/app-store-connect/manage-subscriptions/offer-auto-renewable-subscriptions":{"title":"official docs","identifier":"https:\/\/developer.apple.com\/help\/app-store-connect\/manage-subscriptions\/offer-auto-renewable-subscriptions","type":"link","titleInlineContent":[{"text":"official docs","type":"text"}],"url":"https:\/\/developer.apple.com\/help\/app-store-connect\/manage-subscriptions\/offer-auto-renewable-subscriptions"},"https://freemiumkit.app":{"title":"🏠 Back to Home","identifier":"https:\/\/freemiumkit.app","type":"link","titleInlineContent":[{"text":"🏠 Back to Home","type":"text"}],"url":"https:\/\/freemiumkit.app"},"Setup-Add-Package":{"variants":[{"url":"\/images\/Setup-Add-Package.jpeg","traits":["1x","light"]}],"identifier":"Setup-Add-Package","type":"image","alt":null},"https://www.youtube.com/watch?v=6JxwA3WieHs":{"identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs","type":"download","checksum":null,"url":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs"},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}],"title":"Checklist to Pass App Review","type":"topic","url":"\/documentation\/freemiumkit\/appreviewchecklist","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist"},"PaidViews-Poster":{"variants":[{"url":"\/images\/PaidViews-Poster.jpeg","traits":["1x","light"]}],"identifier":"PaidViews-Poster","type":"image","alt":null},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","title":"Paid to Freemium Migration Guide","url":"\/documentation\/freemiumkit\/migratefrompaid","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","kind":"article"},"Setup-Choose-Package":{"variants":[{"url":"\/images\/Setup-Choose-Package.jpeg","traits":["1x","light"]}],"identifier":"Setup-Choose-Package","type":"image","alt":null},"FreemiumKit.png":{"variants":[{"url":"\/images\/FreemiumKit.png","traits":["1x","light"]}],"identifier":"FreemiumKit.png","type":"image","alt":null},"mailto:freemiumkit@fline.dev":{"title":"freemiumkit@fline.dev","identifier":"mailto:freemiumkit@fline.dev","type":"link","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}],"url":"mailto:freemiumkit@fline.dev"},"https://www.fline.dev/imprint/":{"title":"Imprint","identifier":"https:\/\/www.fline.dev\/imprint\/","type":"link","titleInlineContent":[{"text":"Imprint","type":"text"}],"url":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"Setup-PaidStatusView":{"variants":[{"url":"\/images\/Setup-PaidStatusView.jpeg","traits":["1x","light"]}],"identifier":"Setup-PaidStatusView","type":"image","alt":null}}} \ No newline at end of file diff --git a/data/documentation/index.json b/data/documentation/index.json index 8042306..3ee4dac 100644 --- a/data/documentation/index.json +++ b/data/documentation/index.json @@ -1 +1 @@ -{"topicSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]}],"metadata":{"roleHeading":"Welcome to","role":"collection","title":"FreemiumKit","images":[{"identifier":"FreemiumKit.png","type":"icon"}]},"schemaVersion":{"patch":0,"minor":3,"major":0},"kind":"article","primaryContentSections":[{"content":[{"text":"Overview","level":2,"anchor":"Overview","type":"heading"},{"inlineContent":[{"type":"image","identifier":"FreemiumKit-Lettering"}],"type":"paragraph"},{"inlineContent":[{"text":"FreemiumKit is the ultimate solution for Apple platform developers to integrate and manage in-app purchases and subscriptions effortlessly. With support for all Apple platforms, FreemiumKit provides a seamless and efficient way to handle your app’s monetization.","type":"text"}],"type":"paragraph"},{"style":"tip","content":[{"type":"paragraph","inlineContent":[{"text":"Install the Mac app first for a smooth onboarding experience.","type":"text"}]}],"name":"Tip","type":"aside"},{"text":"Key Features","level":2,"anchor":"Key-Features","type":"heading"},{"text":"One-Click Creation of Monthly\/Yearly\/Lifetime","level":3,"anchor":"One-Click-Creation-of-MonthlyYearlyLifetime","type":"heading"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Connect API Integration","type":"text"}]},{"text":": FreemiumKit connects to App Store Connect on your behalf to automate all the steps needed to create your products, saving you a lot of click & wait.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Automatic Pricing","type":"text"}]},{"text":": We even calculate the prices for longer periods by default based on your Monthly price in a sensible manner, giving you full control when needed.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Combined Review Note","type":"text"}]},{"type":"text","text":": The review note updates for all of Monthly\/Yearly\/Lifetime at once."}]}]}],"type":"unorderedList"},{"identifier":"QuickSetup","type":"video"},{"text":"Configurable Paywalls","level":3,"anchor":"Configurable-Paywalls","type":"heading"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Paywalls","type":"text"}]},{"text":": Our SDK contains beautiful & localized paywall designs for all Apple platforms.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Remote Config"}]},{"text":": Paywalls update immediately so you don’t need to wait for a new app version.","type":"text"}]}]},{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"A\/B Testing"}]},{"text":": Improve your conversion by comparing up to 4 designs in parallel.","type":"text"}],"type":"paragraph"}]}],"type":"unorderedList"},{"identifier":"Paywalls","type":"video"},{"text":"Flexible Pricing Adjustments (Coming Soon!)","level":3,"anchor":"Flexible-Pricing-Adjustments-Coming-Soon","type":"heading"},{"items":[{"content":[{"inlineContent":[{"inlineContent":[{"text":"Purchase Power Parity:","type":"text"}],"type":"strong"},{"text":" Adjust prices based on country to maximize revenue & accessibility.","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"inlineContent":[{"text":"A\/B Testing:","type":"text"}],"type":"strong"},{"type":"text","text":" Automatically creates subscription groups so you can test different prices!"}],"type":"paragraph"}]}],"type":"unorderedList"},{"numberOfColumns":3,"columns":[{"size":2,"content":[{"level":3,"anchor":"Native-Experience","text":"Native Experience","type":"heading"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Full Apple Platforms Support:"}],"type":"strong"},{"text":" Seamlessly integrate the SDK with iOS, macOS, visionOS, and tvOS (coming soon).","type":"text"}]}]},{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Live Purchase Push Notifications:"}]},{"type":"text","text":" Receive real-time notifications for user purchases to stay on top of your app’s performance."}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Privacy by Design:"}],"type":"strong"},{"text":" The SDK avoids sending personal user data to any servers. And we don’t keep your purchase data on our servers.","type":"text"}]}]}],"type":"unorderedList"}]},{"size":1,"content":[{"type":"paragraph","inlineContent":[{"identifier":"PushNotifications","type":"image"}]}]}],"type":"row"},{"text":"Stellar Documentation & Support","level":2,"anchor":"Stellar-Documentation--Support","type":"heading"},{"inlineContent":[{"text":"Our customers are amazed by our – quote – “stellar” documentation and support:","type":"text"}],"type":"paragraph"},{"items":[{"content":[{"type":"paragraph","inlineContent":[{"text":"We worked hard on providing an ","type":"text"},{"inlineContent":[{"type":"text","text":"intuitive Onboarding"}],"type":"strong"},{"text":" inside our app","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"text":"We have ","type":"text"},{"type":"strong","inlineContent":[{"text":"detailed guides","type":"text"}]},{"text":" for various use cases like for ","type":"text"},{"identifier":"https:\/\/freemiumkit.app\/documentation\/freemiumkit\/faq-migratefrompaidupfront","type":"reference","isActive":true}]}]},{"content":[{"inlineContent":[{"type":"text","text":"We even recorded a detailed "},{"inlineContent":[{"type":"text","text":"walkthrough video"}],"type":"strong"},{"type":"text","text":" explaining the entire process"}],"type":"paragraph"}]}],"type":"unorderedList"},{"text":"Explanation Video on YouTube:","level":3,"anchor":"Explanation-Video-on-YouTube","type":"heading"},{"inlineContent":[{"type":"image","identifier":"Setup-Guide-Thumbnail"}],"type":"paragraph"},{"inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs"}],"type":"paragraph"},{"text":"FreemiumKit vs. RevenueCat","level":2,"anchor":"FreemiumKit-vs-RevenueCat","type":"heading"},{"inlineContent":[{"text":"Many people in our community love 😻 RevenueCat, so you might wonder how FreemiumKit compares. The short answer is, that RevenueCat focuses on ","type":"text"},{"inlineContent":[{"text":"growth","type":"text"}],"type":"strong"},{"text":" for ","type":"text"},{"inlineContent":[{"type":"text","text":"already successful"}],"type":"emphasis"},{"text":" customers, whereas FreemiumKit focuses on ","type":"text"},{"inlineContent":[{"text":"convenience","type":"text"}],"type":"strong"},{"text":" for ","type":"text"},{"inlineContent":[{"text":"beginners and Indie developers","type":"text"}],"type":"emphasis"},{"text":". See the following table to get a better understanding of what I mean by that:","type":"text"}],"type":"paragraph"},{"header":"row","rows":[[[{"inlineContent":[{"type":"text","text":"Feature"}],"type":"paragraph"}],[{"inlineContent":[{"text":"FreemiumKit","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"RevenueCat"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Quick Setup"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (automated creation of products on Connect)"}],"type":"paragraph"}],[{"inlineContent":[{"text":"❌","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Paywalls"}]}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (on all Apple Platforms, even visionOS!)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"text":"🚧 (only iOS)","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"strong","inlineContent":[{"text":"Built-In Localization","type":"text"}]}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (paywalls localized to ~40 languages)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"❌"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"text":"Real-Time Notifications","type":"text"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (push notifications sent to native iPhone app)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (inspired by FreemiumKit)"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"text":"Skip Renewal Notifications","type":"text"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (reports purchases & "},{"type":"strong","inlineContent":[{"type":"text","text":"new"}]},{"type":"text","text":" subscriptions)"}],"type":"paragraph"}],[{"inlineContent":[{"text":"❌","type":"text"}],"type":"paragraph"}]],[[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Verified Transactions"}]}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ (using StoreKit 2)"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"A\/B Testing","type":"text"}]}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (fast setup, up to 4 designs in parallel)","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (but a lot of work)","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Native App"}]}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (on all Apple Platforms)","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"❌ (only Purchases)"}]}]],[[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Purchases Dashboard"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (in native app)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (only Web)"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"text":"Purchase Power Parity (Soon!)","type":"text"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (adjustable slider to mix with Apple prices)"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"❌"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"text":"Scalable","type":"text"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (CDN for remote config, purchases in iCloud)"}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (higher price)","type":"text"}],"type":"paragraph"}]],[[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Low App Size Impact"}]}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (3MB less than RevenueCat)","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"❌"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"User Privacy"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ (no personal data sent, server temporary storage)"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"❌ (lots of data)"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Supports Apple Platforms"}]}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (including visionOS)","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (including visionOS)","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Supports Android & Web"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"text":"❌","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"text":"Pricing","type":"text"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"text":"Freemium, paid tier ","type":"text"},{"type":"strong","inlineContent":[{"text":"below 1%","type":"text"}]},{"text":" of Revenue","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"Freemium, paid tier exactly 1% of Revenue"}]}]]],"type":"table"},{"inlineContent":[{"type":"text","text":"If you are a RevenueCat user and want to migrate to FreemiumKit, read our "},{"overridingTitleInlineContent":[{"text":"migration guide","type":"text"}],"type":"reference","overridingTitle":"migration guide","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","isActive":true},{"type":"text","text":"."}],"type":"paragraph"},{"text":"Pricing","level":2,"anchor":"Pricing","type":"heading"},{"inlineContent":[{"text":"FreemiumKit is ","type":"text"},{"inlineContent":[{"text":"completely free to use","type":"text"}],"type":"strong"},{"text":" at the moment for ","type":"text"},{"inlineContent":[{"type":"text","text":"everyone"}],"type":"emphasis"},{"text":".","type":"text"}],"type":"paragraph"},{"inlineContent":[{"text":"In the future, only developers with more than $500 monthly income on App Store Connect will need to pay, and ","type":"text"},{"inlineContent":[{"type":"text","text":"only 0.5% of their income on average"}],"type":"strong"},{"text":". The full planned pricing table:","type":"text"}],"type":"paragraph"},{"numberOfColumns":2,"columns":[{"content":[{"type":"table","rows":[[[{"type":"paragraph","inlineContent":[{"type":"text","text":"Monthly Income"}]}],[{"type":"paragraph","inlineContent":[{"text":"Cost","type":"text"}]}]],[[{"inlineContent":[{"type":"text","text":"$0 - $500"}],"type":"paragraph"}],[{"inlineContent":[{"text":"Free","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"text":"$500 - $1,500k","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"$5\/mo"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"text","text":"$1,500 - $3,000"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"$11\/mo"}],"type":"paragraph"}]],[[{"inlineContent":[{"text":"$3,000 - $5,000","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"$20\/mo"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"text","text":"$5,000 - $8,000"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"$33\/mo"}],"type":"paragraph"}]]],"header":"row"}],"size":1},{"content":[{"header":"row","rows":[[[{"type":"paragraph","inlineContent":[{"text":"Monthly Income","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"text":"Cost","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"text","text":"$8,000 - $12,000"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"$50\/mo"}]}]],[[{"inlineContent":[{"type":"text","text":"$12,000 - $18,000"}],"type":"paragraph"}],[{"inlineContent":[{"text":"$75\/mo","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"text":"$18,000 - $32,000","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"text":"$125\/mo","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"text","text":"$32,000 - $75,000"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"$250\/mo"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"text","text":"$75,000 – Unlimited"}],"type":"paragraph"}],[{"inlineContent":[{"text":"$500\/mo","type":"text"}],"type":"paragraph"}]]],"type":"table"}],"size":1}],"type":"row"},{"text":"Get Started","level":2,"anchor":"Get-Started","type":"heading"},{"inlineContent":[{"text":"Ready to take your app’s monetization to the next level? Download FreemiumKit today and start experiencing the benefits of simplified and powerful in-app purchases & subscriptions.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","type":"reference","isActive":true},{"text":" ","type":"text"},{"overridingTitleInlineContent":[{"type":"text","text":"Download Now"}],"overridingTitle":"Download Now","identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","type":"reference","isActive":true}],"type":"paragraph"},{"text":"Detailed Setup Guides","level":2,"anchor":"Detailed-Setup-Guides","type":"heading"},{"inlineContent":[{"type":"text","text":"For a detailed walkthrough on how to integrate the FreemiumKit SDK into your app, check out our "},{"overridingTitle":"SDK Setup Guide","overridingTitleInlineContent":[{"type":"text","text":"SDK Setup Guide"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","isActive":true,"type":"reference"},{"type":"text","text":". For a smooth app review process with in-app purchases, use our "},{"overridingTitle":"App Review Checklist","overridingTitleInlineContent":[{"type":"text","text":"App Review Checklist"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","isActive":true,"type":"reference"},{"type":"text","text":". To migrate a paid app to the Freemium model, refer to our "},{"overridingTitle":"Migration Guide","overridingTitleInlineContent":[{"type":"text","text":"Migration Guide"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","isActive":true,"type":"reference"},{"type":"text","text":"."}],"type":"paragraph"},{"text":"Testimonials","level":2,"anchor":"Testimonials","type":"heading"},{"inlineContent":[{"type":"text","text":"Here’s what customers are saying about FreemiumKit:"}],"type":"paragraph"},{"numberOfColumns":2,"columns":[{"content":[{"type":"paragraph","inlineContent":[]},{"type":"aside","style":"note","name":"Nicolo Stanciu, NFC.cool","content":[{"inlineContent":[{"text":"Setting up in-app purchases and subscriptions is a tedious task, and FreemiumKit is a ","type":"text"},{"type":"strong","inlineContent":[{"text":"huge time saver","type":"text"}]},{"text":" by automating it. Once you try it, you will never go back!","type":"text"}],"type":"paragraph"}]}],"size":1},{"content":[{"inlineContent":[],"type":"paragraph"},{"content":[{"inlineContent":[{"type":"text","text":"The setup is "},{"inlineContent":[{"type":"text","text":"unbelievably simple"}],"type":"strong"},{"type":"text","text":" and way faster to get going than any other solution I’ve tried. The SDK documentation is crystal clear! It comes packed with smart automation that work flawlessly out of the box, plus the flexibility to tailor it to your needs. And the support from the developers? Stellar!"}],"type":"paragraph"}],"type":"aside","style":"note","name":"Seou Hounkanrin, Glu Sight"}],"size":1}],"type":"row"},{"numberOfColumns":1,"columns":[{"content":[{"type":"paragraph","inlineContent":[]},{"type":"aside","name":"Michael Lysons, QuizFolks","style":"note","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The setup video is very well done. I’ve been using FreemiumKit to setup In-App Purchases for my app – it’s been very straightforward, very good indeed! And the developer is an absolute pleasure to work with."}]}]}],"size":1}],"type":"row"},{"text":"FAQ","level":2,"anchor":"FAQ","type":"heading"},{"inlineContent":[{"text":"The top 5 most frequently asked questions:","type":"text"}],"type":"paragraph"},{"style":"list","items":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront"],"type":"links"},{"inlineContent":[{"text":"Visit the ","type":"text"},{"overridingTitle":"Frequently Asked Questions","overridingTitleInlineContent":[{"text":"Frequently Asked Questions","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","isActive":true,"type":"reference"},{"text":" page for the full list of questions & answers.","type":"text"}],"type":"paragraph"},{"text":"Contact","level":2,"anchor":"Contact","type":"heading"},{"inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"type":"reference","isActive":true,"identifier":"mailto:freemiumkit@fline.dev"},{"type":"text","text":"."}],"type":"paragraph"},{"text":"Legal","level":2,"anchor":"Legal","type":"heading"},{"inlineContent":[{"type":"text","text":"Cihat Gündüz © 2024. All rights reserved."},{"type":"text","text":" "},{"type":"text","text":"Privacy: No personal data is tracked on this site."},{"type":"text","text":" "},{"type":"reference","identifier":"https:\/\/www.fline.dev\/imprint\/","isActive":true}],"type":"small"}],"kind":"content"}],"sampleCodeDownload":{"kind":"sampleDownload","action":{"type":"reference","isActive":true,"overridingTitle":"Get it Now","identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8"}},"sections":[],"abstract":[{"text":"Simple In-App Purchases and Subscriptions for Apple Platforms:","type":"text"},{"text":" ","type":"text"},{"text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more.","type":"text"}],"hierarchy":{"paths":[[]]},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/FreemiumKit\/documentation\/Index"},"references":{"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"kind":"article","url":"\/documentation\/freemiumkit\/faqs","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","title":"FAQs","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"The most frequently asked questions about FreemiumKit."}]},"Setup-Guide-Thumbnail":{"type":"image","alt":null,"variants":[{"url":"\/images\/Setup-Guide-Thumbnail.jpeg","traits":["1x","light"]}],"identifier":"Setup-Guide-Thumbnail"},"FreemiumKit-Lettering":{"type":"image","alt":"FreemiumKit Logo","variants":[{"url":"\/images\/FreemiumKit-Lettering.png","traits":["1x","light"]}],"identifier":"FreemiumKit-Lettering"},"PushNotifications":{"type":"image","alt":"Push Notifications","variants":[{"url":"\/images\/PushNotifications.jpeg","traits":["1x","light"]}],"identifier":"PushNotifications"},"mailto:freemiumkit@fline.dev":{"type":"link","titleInlineContent":[{"type":"text","text":"freemiumkit@fline.dev"}],"identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev"},"https://apps.apple.com/app/apple-store/id6502914189?pt=549314&ct=freemiumkit.app&mt=8":{"type":"download","checksum":null,"identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","url":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8"},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","type":"topic","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"url":"\/documentation\/freemiumkit\/migratefrompaid","title":"Paid to Freemium Migration Guide","kind":"article"},"Paywalls-Poster":{"type":"image","alt":null,"variants":[{"url":"\/images\/Paywalls-Poster.jpeg","traits":["1x","light"]}],"identifier":"Paywalls-Poster"},"https://www.fline.dev/imprint/":{"type":"link","titleInlineContent":[{"type":"text","text":"Imprint"}],"identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","url":"https:\/\/www.fline.dev\/imprint\/"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"type":"topic","role":"sampleCode","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","title":"My app is paid-up-front. How can I make it Freemium?","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","abstract":[{"type":"text","text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased."}]},"QuickSetup-Poster":{"type":"image","alt":null,"variants":[{"url":"\/images\/QuickSetup-Poster.jpeg","traits":["1x","light"]}],"identifier":"QuickSetup-Poster"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how we calculate your monthly income and what happens if you exceed your current plan."}],"role":"sampleCode","title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"url":"\/documentation\/freemiumkit\/faq-howitworks","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app."}],"role":"sampleCode","title":"How does FreemiumKit work? Can I trust it?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks"},"QuickSetup":{"type":"video","alt":null,"variants":[{"url":"\/videos\/QuickSetup.mp4","traits":["1x","light"]}],"identifier":"QuickSetup","poster":"QuickSetup-Poster"},"FreemiumKit.png":{"type":"image","alt":null,"variants":[{"url":"\/images\/FreemiumKit.png","traits":["1x","light"]}],"identifier":"FreemiumKit.png"},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"kind":"article","url":"\/documentation\/freemiumkit\/setupguide","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","title":"SDK Setup Guide","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","kind":"article","type":"topic","abstract":[{"type":"text","text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time)."}],"role":"sampleCode","title":"I use RevenueCat, how can I migrate?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat"},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"kind":"article","url":"\/documentation\/freemiumkit\/appreviewchecklist","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","title":"Checklist to Pass App Review","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"type":"text","text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!"}],"role":"sampleCode","title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation"},"Paywalls":{"type":"video","alt":null,"variants":[{"url":"\/videos\/Paywalls.mp4","traits":["1x","light"]}],"identifier":"Paywalls","poster":"Paywalls-Poster"},"https://freemiumkit.app/documentation/freemiumkit/faq-migratefrompaidupfront":{"type":"link","titleInlineContent":[{"type":"text","text":"migrating from a paid app"}],"identifier":"https:\/\/freemiumkit.app\/documentation\/freemiumkit\/faq-migratefrompaidupfront","title":"migrating from a paid app","url":"https:\/\/freemiumkit.app\/documentation\/freemiumkit\/faq-migratefrompaidupfront"},"https://www.youtube.com/watch?v=6JxwA3WieHs":{"type":"link","titleInlineContent":[{"type":"text","text":"See FreemiumKit in Action Now!"}],"identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs","title":"See FreemiumKit in Action Now!","url":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs"}}} \ No newline at end of file +{"sampleCodeDownload":{"action":{"type":"reference","isActive":true,"identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","overridingTitle":"Get it Now"},"kind":"sampleDownload"},"primaryContentSections":[{"kind":"content","content":[{"text":"Overview","level":2,"anchor":"Overview","type":"heading"},{"inlineContent":[{"identifier":"FreemiumKit-Lettering","type":"image"}],"type":"paragraph"},{"inlineContent":[{"type":"text","text":"FreemiumKit is the ultimate solution for Apple platform developers to integrate and manage in-app purchases and subscriptions effortlessly. With support for all Apple platforms, FreemiumKit provides a seamless and efficient way to handle your app’s monetization."}],"type":"paragraph"},{"name":"Tip","content":[{"type":"paragraph","inlineContent":[{"text":"Install the Mac app first for a smooth onboarding experience.","type":"text"}]}],"style":"tip","type":"aside"},{"text":"Key Features","level":2,"anchor":"Key-Features","type":"heading"},{"text":"One-Click Creation of Monthly\/Yearly\/Lifetime","level":3,"anchor":"One-Click-Creation-of-MonthlyYearlyLifetime","type":"heading"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Connect API Integration"}],"type":"strong"},{"type":"text","text":": FreemiumKit connects to App Store Connect on your behalf to automate all the steps needed to create your products, saving you a lot of click & wait."}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Automatic Pricing","type":"text"}]},{"type":"text","text":": We even calculate the prices for longer periods by default based on your Monthly price in a sensible manner, giving you full control when needed."}]}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Combined Review Note"}]},{"type":"text","text":": The review note updates for all of Monthly\/Yearly\/Lifetime at once."}]}]}]},{"identifier":"QuickSetup","type":"video"},{"text":"Configurable Paywalls","level":3,"anchor":"Configurable-Paywalls","type":"heading"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Paywalls","type":"text"}]},{"type":"text","text":": Our SDK contains beautiful & localized paywall designs for all Apple platforms."}]}]},{"content":[{"inlineContent":[{"inlineContent":[{"text":"Remote Config","type":"text"}],"type":"strong"},{"text":": Paywalls update immediately so you don’t need to wait for a new app version.","type":"text"}],"type":"paragraph"}]},{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"A\/B Testing"}]},{"text":": Improve your conversion by comparing up to 4 designs in parallel.","type":"text"}]}]}]},{"identifier":"Paywalls","type":"video"},{"text":"Flexible Pricing Adjustments (Coming Soon!)","level":3,"anchor":"Flexible-Pricing-Adjustments-Coming-Soon","type":"heading"},{"type":"unorderedList","items":[{"content":[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Purchase Power Parity:","type":"text"}]},{"text":" Adjust prices based on country to maximize revenue & accessibility.","type":"text"}]}]},{"content":[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"A\/B Testing:"}],"type":"strong"},{"type":"text","text":" Automatically creates subscription groups so you can test different prices!"}]}]}]},{"numberOfColumns":3,"columns":[{"content":[{"type":"heading","anchor":"Native-Experience","level":3,"text":"Native Experience"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"inlineContent":[{"text":"Full Apple Platforms Support:","type":"text"}],"type":"strong"},{"text":" Seamlessly integrate the SDK with iOS, macOS, visionOS, and tvOS (coming soon).","type":"text"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Live Purchase Push Notifications:"}],"type":"strong"},{"type":"text","text":" Receive real-time notifications for user purchases to stay on top of your app’s performance."}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Privacy by Design:"}]},{"type":"text","text":" The SDK avoids sending personal user data to any servers. And we don’t keep your purchase data on our servers."}],"type":"paragraph"}]}]}],"size":2},{"content":[{"inlineContent":[{"identifier":"PushNotifications","type":"image"}],"type":"paragraph"}],"size":1}],"type":"row"},{"text":"Stellar Documentation & Support","level":2,"anchor":"Stellar-Documentation--Support","type":"heading"},{"inlineContent":[{"text":"Our customers are amazed by our – quote – “stellar” documentation and support:","type":"text"}],"type":"paragraph"},{"type":"unorderedList","items":[{"content":[{"inlineContent":[{"type":"text","text":"We worked hard on providing an "},{"type":"strong","inlineContent":[{"type":"text","text":"intuitive Onboarding"}]},{"type":"text","text":" inside our app"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"We have ","type":"text"},{"inlineContent":[{"type":"text","text":"detailed guides"}],"type":"strong"},{"text":" for various use cases like for ","type":"text"},{"type":"reference","isActive":true,"identifier":"https:\/\/freemiumkit.app\/documentation\/freemiumkit\/faq-migratefrompaidupfront"}],"type":"paragraph"}]},{"content":[{"inlineContent":[{"text":"We even recorded a detailed ","type":"text"},{"inlineContent":[{"type":"text","text":"walkthrough video"}],"type":"strong"},{"text":" explaining the entire process","type":"text"}],"type":"paragraph"}]}]},{"text":"Explanation Video on YouTube:","level":3,"anchor":"Explanation-Video-on-YouTube","type":"heading"},{"inlineContent":[{"type":"image","identifier":"Setup-Guide-Thumbnail"}],"type":"paragraph"},{"inlineContent":[{"isActive":true,"type":"reference","identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs"}],"type":"paragraph"},{"text":"FreemiumKit vs. RevenueCat","level":2,"anchor":"FreemiumKit-vs-RevenueCat","type":"heading"},{"inlineContent":[{"type":"text","text":"Many people in our community love 😻 RevenueCat, so you might wonder how FreemiumKit compares. The short answer is, that RevenueCat focuses on "},{"type":"strong","inlineContent":[{"text":"growth","type":"text"}]},{"type":"text","text":" for "},{"type":"emphasis","inlineContent":[{"text":"already successful","type":"text"}]},{"type":"text","text":" customers, whereas FreemiumKit focuses on "},{"type":"strong","inlineContent":[{"text":"convenience","type":"text"}]},{"type":"text","text":" for "},{"type":"emphasis","inlineContent":[{"text":"beginners and Indie developers","type":"text"}]},{"type":"text","text":". See the following table to get a better understanding of what I mean by that:"}],"type":"paragraph"},{"header":"row","rows":[[[{"type":"paragraph","inlineContent":[{"type":"text","text":"Feature"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"FreemiumKit"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"RevenueCat"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"text":"Quick Setup","type":"text"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ (automated creation of products on Connect)"}]}],[{"type":"paragraph","inlineContent":[{"text":"❌","type":"text"}]}]],[[{"inlineContent":[{"inlineContent":[{"text":"Paywalls","type":"text"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (on all Apple Platforms, even visionOS!)"}],"type":"paragraph"}],[{"inlineContent":[{"text":"🚧 (only iOS)","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"strong","inlineContent":[{"text":"Built-In Localization","type":"text"}]}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (paywalls localized to ~40 languages)"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"❌"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Real-Time Notifications"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (push notifications sent to native iPhone app)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (inspired by FreemiumKit)"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Skip Renewal Notifications"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (reports purchases & "},{"type":"strong","inlineContent":[{"type":"text","text":"new"}]},{"type":"text","text":" subscriptions)"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"❌"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"strong","inlineContent":[{"type":"text","text":"Verified Transactions"}]}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (using StoreKit 2)"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"strong","inlineContent":[{"text":"A\/B Testing","type":"text"}]}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (fast setup, up to 4 designs in parallel)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (but a lot of work)"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"text":"Native App","type":"text"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (on all Apple Platforms)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"text":"❌ (only Purchases)","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"text":"Purchases Dashboard","type":"text"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (in native app)","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"text":"✅ (only Web)","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"inlineContent":[{"type":"text","text":"Purchase Power Parity (Soon!)"}],"type":"strong"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"✅ (adjustable slider to mix with Apple prices)"}],"type":"paragraph"}],[{"inlineContent":[{"text":"❌","type":"text"}],"type":"paragraph"}]],[[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"Scalable","type":"text"}]}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (CDN for remote config, purchases in iCloud)","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ (higher price)"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"text":"Low App Size Impact","type":"text"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ (3MB less than RevenueCat)"}]}],[{"type":"paragraph","inlineContent":[{"text":"❌","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"strong","inlineContent":[{"text":"User Privacy","type":"text"}]}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"✅ (no personal data sent, server temporary storage)"}]}],[{"type":"paragraph","inlineContent":[{"text":"❌ (lots of data)","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"text":"Supports Apple Platforms","type":"text"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (including visionOS)","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"text":"✅ (including visionOS)","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"text":"Supports Android & Web","type":"text"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"text":"❌","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"text":"✅","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"inlineContent":[{"type":"text","text":"Pricing"}],"type":"strong"}]}],[{"type":"paragraph","inlineContent":[{"text":"Freemium, paid tier ","type":"text"},{"inlineContent":[{"type":"text","text":"0.5%"}],"type":"strong"},{"text":" of Revenue","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"Freemium, paid tier exactly 1% of Revenue"}]}]]],"type":"table"},{"inlineContent":[{"text":"If you are a RevenueCat user and want to migrate to FreemiumKit, read our ","type":"text"},{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","overridingTitleInlineContent":[{"type":"text","text":"migration guide"}],"overridingTitle":"migration guide","isActive":true,"type":"reference"},{"text":".","type":"text"}],"type":"paragraph"},{"text":"Pricing","level":2,"anchor":"Pricing","type":"heading"},{"inlineContent":[{"type":"text","text":"FreemiumKit is "},{"inlineContent":[{"type":"text","text":"completely free to use"}],"type":"strong"},{"type":"text","text":" at the moment for "},{"inlineContent":[{"type":"text","text":"everyone"}],"type":"emphasis"},{"type":"text","text":"."}],"type":"paragraph"},{"inlineContent":[{"text":"In the future, only developers with more than $500 monthly income on App Store Connect will need to pay, and ","type":"text"},{"type":"strong","inlineContent":[{"text":"only 0.5% of their income on average","type":"text"}]},{"text":". The full planned pricing table:","type":"text"}],"type":"paragraph"},{"numberOfColumns":2,"columns":[{"size":1,"content":[{"type":"table","header":"row","rows":[[[{"type":"paragraph","inlineContent":[{"text":"Monthly Income","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"Cost"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"text","text":"$0 - $500"}]}],[{"type":"paragraph","inlineContent":[{"text":"Free","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"text":"$500 - $1,500k","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"$5\/mo"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"text","text":"$1,500 - $3,000"}]}],[{"type":"paragraph","inlineContent":[{"text":"$11\/mo","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"type":"text","text":"$3,000 - $5,000"}]}],[{"type":"paragraph","inlineContent":[{"text":"$20\/mo","type":"text"}]}]],[[{"type":"paragraph","inlineContent":[{"text":"$5,000 - $8,000","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"$33\/mo"}]}]]]}]},{"size":1,"content":[{"type":"table","header":"row","rows":[[[{"type":"paragraph","inlineContent":[{"text":"Monthly Income","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"Cost"}]}]],[[{"type":"paragraph","inlineContent":[{"text":"$8,000 - $12,000","type":"text"}]}],[{"type":"paragraph","inlineContent":[{"type":"text","text":"$50\/mo"}]}]],[[{"inlineContent":[{"text":"$12,000 - $18,000","type":"text"}],"type":"paragraph"}],[{"inlineContent":[{"text":"$75\/mo","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"text","text":"$18,000 - $32,000"}],"type":"paragraph"}],[{"inlineContent":[{"text":"$125\/mo","type":"text"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"text","text":"$32,000 - $75,000"}],"type":"paragraph"}],[{"inlineContent":[{"type":"text","text":"$250\/mo"}],"type":"paragraph"}]],[[{"inlineContent":[{"type":"text","text":"$75,000 – Unlimited"}],"type":"paragraph"}],[{"inlineContent":[{"text":"$500\/mo","type":"text"}],"type":"paragraph"}]]]}]}],"type":"row"},{"text":"Get Started","level":2,"anchor":"Get-Started","type":"heading"},{"inlineContent":[{"text":"Ready to take your app’s monetization to the next level? Download FreemiumKit today and start experiencing the benefits of simplified and powerful in-app purchases & subscriptions.","type":"text"}],"type":"paragraph"},{"inlineContent":[{"identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","isActive":true,"type":"reference"},{"type":"text","text":" "},{"identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","isActive":true,"type":"reference","overridingTitleInlineContent":[{"type":"text","text":"Download Now"}],"overridingTitle":"Download Now"}],"type":"paragraph"},{"text":"Detailed Setup Guides","level":2,"anchor":"Detailed-Setup-Guides","type":"heading"},{"inlineContent":[{"type":"text","text":"For a detailed walkthrough on how to integrate the FreemiumKit SDK into your app, check out our "},{"overridingTitle":"SDK Setup Guide","overridingTitleInlineContent":[{"text":"SDK Setup Guide","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","type":"reference","isActive":true},{"type":"text","text":". For a smooth app review process with in-app purchases, use our "},{"overridingTitle":"App Review Checklist","overridingTitleInlineContent":[{"type":"text","text":"App Review Checklist"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","type":"reference","isActive":true},{"type":"text","text":". To migrate a paid app to the Freemium model, refer to our "},{"overridingTitle":"Migration Guide","overridingTitleInlineContent":[{"text":"Migration Guide","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","type":"reference","isActive":true},{"type":"text","text":"."}],"type":"paragraph"},{"text":"Testimonials","level":2,"anchor":"Testimonials","type":"heading"},{"inlineContent":[{"text":"Here’s what customers are saying about FreemiumKit:","type":"text"}],"type":"paragraph"},{"numberOfColumns":2,"columns":[{"content":[{"inlineContent":[],"type":"paragraph"},{"style":"note","name":"Nicolo Stanciu, NFC.cool","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Setting up in-app purchases and subscriptions is a tedious task, and FreemiumKit is a "},{"type":"strong","inlineContent":[{"text":"huge time saver","type":"text"}]},{"type":"text","text":" by automating it. Once you try it, you will never go back!"}]}],"type":"aside"}],"size":1},{"content":[{"inlineContent":[],"type":"paragraph"},{"name":"Seou Hounkanrin, Glu Sight","style":"note","type":"aside","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"The setup is "},{"type":"strong","inlineContent":[{"text":"unbelievably simple","type":"text"}]},{"type":"text","text":" and way faster to get going than any other solution I’ve tried. The SDK documentation is crystal clear! It comes packed with smart automation that work flawlessly out of the box, plus the flexibility to tailor it to your needs. And the support from the developers? Stellar!"}]}]}],"size":1}],"type":"row"},{"numberOfColumns":1,"columns":[{"size":1,"content":[{"inlineContent":[],"type":"paragraph"},{"style":"note","name":"Michael Lysons, QuizFolks","content":[{"inlineContent":[{"type":"text","text":"The setup video is very well done. I’ve been using FreemiumKit to setup In-App Purchases for my app – it’s been very straightforward, very good indeed! And the developer is an absolute pleasure to work with."}],"type":"paragraph"}],"type":"aside"}]}],"type":"row"},{"text":"FAQ","level":2,"anchor":"FAQ","type":"heading"},{"inlineContent":[{"type":"text","text":"The top 5 most frequently asked questions:"}],"type":"paragraph"},{"style":"list","type":"links","items":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront"]},{"inlineContent":[{"text":"Visit the ","type":"text"},{"overridingTitleInlineContent":[{"type":"text","text":"Frequently Asked Questions"}],"isActive":true,"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","overridingTitle":"Frequently Asked Questions","type":"reference"},{"text":" page for the full list of questions & answers.","type":"text"}],"type":"paragraph"},{"text":"Contact","level":2,"anchor":"Contact","type":"heading"},{"inlineContent":[{"type":"text","text":"Have questions or need support? Reach out to me at "},{"type":"reference","isActive":true,"identifier":"mailto:freemiumkit@fline.dev"},{"type":"text","text":"."}],"type":"paragraph"},{"text":"Legal","level":2,"anchor":"Legal","type":"heading"},{"inlineContent":[{"text":"Cihat Gündüz © 2024. All rights reserved.","type":"text"},{"text":" ","type":"text"},{"text":"Privacy: No personal data is tracked on this site.","type":"text"},{"text":" ","type":"text"},{"isActive":true,"identifier":"https:\/\/www.fline.dev\/imprint\/","type":"reference"}],"type":"small"}]}],"kind":"article","sections":[],"identifier":{"url":"doc:\/\/FreemiumKit\/documentation\/Index","interfaceLanguage":"swift"},"hierarchy":{"paths":[[]]},"abstract":[{"type":"text","text":"Simple In-App Purchases and Subscriptions for Apple Platforms:"},{"type":"text","text":" "},{"type":"text","text":"Automation, Paywalls, A\/B Testing, Live Notifications, PPP, and more."}],"topicSections":[{"identifiers":["doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs"]}],"schemaVersion":{"major":0,"patch":0,"minor":3},"metadata":{"roleHeading":"Welcome to","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"role":"collection","title":"FreemiumKit"},"references":{"Paywalls-Poster":{"alt":null,"identifier":"Paywalls-Poster","variants":[{"traits":["1x","light"],"url":"\/images\/Paywalls-Poster.jpeg"}],"type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-HowItWorks":{"role":"sampleCode","kind":"article","type":"topic","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-HowItWorks","title":"How does FreemiumKit work? Can I trust it?","url":"\/documentation\/freemiumkit\/faq-howitworks","abstract":[{"text":"Learn why you can trust FreemiumKit to scale with your app and why there’s no long-term lock-in risk for your app.","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromPaidUpFront":{"title":"My app is paid-up-front. How can I make it Freemium?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromPaidUpFront","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefrompaidupfront","kind":"article","type":"topic","abstract":[{"text":"See how easy it is to migrate from a paid-up-front app to the Freemium model using FreemiumKit, while preserving access to your app for those who already purchased.","type":"text"}]},"QuickSetup":{"alt":null,"identifier":"QuickSetup","variants":[{"traits":["1x","light"],"url":"\/videos\/QuickSetup.mp4"}],"poster":"QuickSetup-Poster","type":"video"},"Paywalls":{"alt":null,"identifier":"Paywalls","variants":[{"traits":["1x","light"],"url":"\/videos\/Paywalls.mp4"}],"poster":"Paywalls-Poster","type":"video"},"Setup-Guide-Thumbnail":{"alt":null,"identifier":"Setup-Guide-Thumbnail","variants":[{"traits":["1x","light"],"url":"\/images\/Setup-Guide-Thumbnail.jpeg"}],"type":"image"},"FreemiumKit-Lettering":{"alt":"FreemiumKit Logo","identifier":"FreemiumKit-Lettering","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit-Lettering.png"}],"type":"image"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Validation":{"title":"Does FreemiumKit validate purchases?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Validation","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-validation","kind":"article","type":"topic","abstract":[{"text":"Learn how FreemiumKit deals with validation and how it helps you focus on what’s important – your app’s features!","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/FAQs":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQs","kind":"article","role":"article","url":"\/documentation\/freemiumkit\/faqs","images":[{"identifier":"FreemiumKit.png","type":"icon"}],"abstract":[{"text":"The most frequently asked questions about FreemiumKit.","type":"text"}],"title":"FAQs","type":"topic"},"doc://FreemiumKit/documentation/FreemiumKit/MigrateFromPaid":{"role":"article","abstract":[{"text":"Learn how to migrate from a paid-up-front app to the Freemium model using FreemiumKit in 3 simple steps, while preserving access to your app for those who already purchased.","type":"text"}],"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/MigrateFromPaid","title":"Paid to Freemium Migration Guide","url":"\/documentation\/freemiumkit\/migratefrompaid","images":[{"type":"icon","identifier":"FreemiumKit.png"}],"type":"topic","kind":"article"},"doc://FreemiumKit/documentation/FreemiumKit/AppReviewChecklist":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"This checklist helps developers using FreemiumKit to navigate Apple’s app review process for apps with in-app purchases (IAPs)."}],"title":"Checklist to Pass App Review","type":"topic","url":"\/documentation\/freemiumkit\/appreviewchecklist","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/AppReviewChecklist"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-MigrateFromRevenueCat":{"identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-MigrateFromRevenueCat","kind":"article","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-migratefromrevenuecat","abstract":[{"text":"See how easy it is to migrate from RevenueCat with our detailed migration guide – takes only ~30 minutes (including read time).","type":"text"}],"title":"I use RevenueCat, how can I migrate?","type":"topic"},"QuickSetup-Poster":{"alt":null,"identifier":"QuickSetup-Poster","variants":[{"traits":["1x","light"],"url":"\/images\/QuickSetup-Poster.jpeg"}],"type":"image"},"https://www.fline.dev/imprint/":{"identifier":"https:\/\/www.fline.dev\/imprint\/","title":"Imprint","url":"https:\/\/www.fline.dev\/imprint\/","type":"link","titleInlineContent":[{"text":"Imprint","type":"text"}]},"PushNotifications":{"alt":"Push Notifications","identifier":"PushNotifications","variants":[{"traits":["1x","light"],"url":"\/images\/PushNotifications.jpeg"}],"type":"image"},"mailto:freemiumkit@fline.dev":{"identifier":"mailto:freemiumkit@fline.dev","title":"freemiumkit@fline.dev","url":"mailto:freemiumkit@fline.dev","type":"link","titleInlineContent":[{"text":"freemiumkit@fline.dev","type":"text"}]},"https://apps.apple.com/app/apple-store/id6502914189?pt=549314&ct=freemiumkit.app&mt=8":{"checksum":null,"identifier":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","url":"https:\/\/apps.apple.com\/app\/apple-store\/id6502914189?pt=549314&ct=freemiumkit.app&mt=8","type":"download"},"FreemiumKit.png":{"alt":null,"identifier":"FreemiumKit.png","variants":[{"traits":["1x","light"],"url":"\/images\/FreemiumKit.png"}],"type":"image"},"https://freemiumkit.app/documentation/freemiumkit/faq-migratefrompaidupfront":{"identifier":"https:\/\/freemiumkit.app\/documentation\/freemiumkit\/faq-migratefrompaidupfront","title":"migrating from a paid app","url":"https:\/\/freemiumkit.app\/documentation\/freemiumkit\/faq-migratefrompaidupfront","type":"link","titleInlineContent":[{"text":"migrating from a paid app","type":"text"}]},"https://www.youtube.com/watch?v=6JxwA3WieHs":{"identifier":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs","title":"See FreemiumKit in Action Now!","url":"https:\/\/www.youtube.com\/watch?v=6JxwA3WieHs","type":"link","titleInlineContent":[{"text":"See FreemiumKit in Action Now!","type":"text"}]},"doc://FreemiumKit/documentation/FreemiumKit/SetupGuide":{"images":[{"type":"icon","identifier":"FreemiumKit.png"}],"abstract":[{"type":"text","text":"Learn how to set up your app for our paywalls and live push notifications."}],"title":"SDK Setup Guide","type":"topic","url":"\/documentation\/freemiumkit\/setupguide","kind":"article","role":"article","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/SetupGuide"},"doc://FreemiumKit/documentation/FreemiumKit/FAQ-Pricing":{"title":"How does the Pricing work in detail?","identifier":"doc:\/\/FreemiumKit\/documentation\/FreemiumKit\/FAQ-Pricing","role":"sampleCode","url":"\/documentation\/freemiumkit\/faq-pricing","kind":"article","type":"topic","abstract":[{"text":"Learn how we calculate your monthly income and what happens if you exceed your current plan.","type":"text"}]}}} \ No newline at end of file diff --git a/metadata.json b/metadata.json index 56dfbcf..7ffd2cb 100644 --- a/metadata.json +++ b/metadata.json @@ -1 +1 @@ -{"bundleIdentifier":"FreemiumKit","bundleDisplayName":"FreemiumKit","schemaVersion":{"minor":1,"patch":0,"major":0}} \ No newline at end of file +{"bundleDisplayName":"FreemiumKit","schemaVersion":{"major":0,"patch":0,"minor":1},"bundleIdentifier":"FreemiumKit"} \ No newline at end of file