Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Building a modern subscription experience on iOS
Search
Bas Broek
August 17, 2022
Programming
0
170
Building a modern subscription experience on iOS
Sharing a story on how we built subscriptions for the iOS WeTransfer app.
Bas Broek
August 17, 2022
Tweet
Share
More Decks by Bas Broek
See All by Bas Broek
Building an Accessibility Culture, One Step at a Time (Leeds)
basthomas
0
100
Building an Accessibility Culture, One Step at a Time
basthomas
1
81
Not an afterthought: accessibility from start to finish
basthomas
0
130
Accessibility on Apple Platforms: Beyond VoiceOver
basthomas
0
130
No Touch(screen) Required: Voice & Keyboard Accessibility
basthomas
0
150
Dancing with Dinosaurs: Objective-C and Swift Interop
basthomas
0
130
Effective Pull Request Reviews
basthomas
0
400
Accessibility in SwiftUI: Better Apps for Everyone
basthomas
0
130
An Introduction to Unit Testing Logic (in Swift)
basthomas
0
120
Other Decks in Programming
See All in Programming
知って得する@cloudflare_vite-pluginのあれこれ
chimame
1
120
Caude codeで爆速開発
codelynx
0
100
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
2
780
MDN Web Docs に日本語翻訳でコントリビュートしたくなる
ohmori_yusuke
1
130
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
40
14k
Android 16KBページサイズ対応をはじめからていねいに
mine2424
0
640
効率的な開発手段として VRTを活用する
ishkawa
1
180
AI Agent 時代のソフトウェア開発を支える AWS Cloud Development Kit (CDK)
konokenj
6
970
「次に何を学べばいいか分からない」あなたへ──若手エンジニアのための学習地図
panda_program
3
640
MCPを使ってイベントソーシングのAIコーディングを効率化する / Streamlining Event Sourcing AI Coding with MCP
tomohisa
0
180
Streamlitで実現できるようになったこと、実現してくれたこと
ayumu_yamaguchi
2
220
Workers を定期実行する方法は一つじゃない
rokuosan
0
130
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
54k
How to train your dragon (web standard)
notwaldorf
96
6.1k
Designing for Performance
lara
610
69k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Site-Speed That Sticks
csswizardry
10
720
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Transcript
BUILDING A MODERN SUBSCRIPTION EXPERIENCE ON IOS @BASTHOMAS 1 —
@basthomas, SwiftConf, August 17, 2022
AMAZING ANNUAL RECURRING REVENUE... ON IOS @BASTHOMAS 2 — @basthomas,
SwiftConf, August 17, 2022
SUPERB SUBSCRIPTIONS... ON IOS @BASTHOMAS 3 — @basthomas, SwiftConf, August
17, 2022
INTERESTING IN-APP PURCHASES... ON IOS @BASTHOMAS 4 — @basthomas, SwiftConf,
August 17, 2022
BUILDING A MODERN SUBSCRIPTION EXPERIENCE ON IOS @BASTHOMAS 5 —
@basthomas, SwiftConf, August 17, 2022
WHO AM I? ▸ @basthomas on Twitter ▸ XING ▸
Moya, GitHawk ▸ Apple (macOS VoiceOver) ▸ WeTransfer 6 — @basthomas, SwiftConf, August 17, 2022
WHY AM I TALKING ABOUT THIS TOPIC? 7 — @basthomas,
SwiftConf, August 17, 2022
WETRANSFER IOS ! 8 — @basthomas, SwiftConf, August 17, 2022
WETRANSFER IOS !! 9 — @basthomas, SwiftConf, August 17, 2022
WETRANSFER IOS !!! 10 — @basthomas, SwiftConf, August 17, 2022
! 11 — @basthomas, SwiftConf, August 17, 2022
! ..? 12 — @basthomas, SwiftConf, August 17, 2022
! 13 — @basthomas, SwiftConf, August 17, 2022
! 14 — @basthomas, SwiftConf, August 17, 2022
WE GOT SOME DESIGNS. LET'S GET CRACKIN', RIGHT? 15 —
@basthomas, SwiftConf, August 17, 2022
16 — @basthomas, SwiftConf, August 17, 2022
ACCESSIBILITY 17 — @basthomas, SwiftConf, August 17, 2022
18 — @basthomas, SwiftConf, August 17, 2022
19 — @basthomas, SwiftConf, August 17, 2022
WAIT, TWITTER? 20 — @basthomas, SwiftConf, August 17, 2022
! 21 — @basthomas, SwiftConf, August 17, 2022
HAPTICS 22 — @basthomas, SwiftConf, August 17, 2022
VOICEOVER 23 — @basthomas, SwiftConf, August 17, 2022
VOICE CONTROL & FULL KEYBOARD ACCESS 24 — @basthomas, SwiftConf,
August 17, 2022
DARK MODE, MOTION, MORE 25 — @basthomas, SwiftConf, August 17,
2022
LET'S GET CRACKIN' 26 — @basthomas, SwiftConf, August 17, 2022
LOCAL CONFIGURATION 27 — @basthomas, SwiftConf, August 17, 2022
28 — @basthomas, SwiftConf, August 17, 2022
29 — @basthomas, SwiftConf, August 17, 2022
WE'LL START SLOWLY 30 — @basthomas, SwiftConf, August 17, 2022
... AND USE FEATURE FLAGS 31 — @basthomas, SwiftConf, August
17, 2022
EVERYTHING'S GOING TO BE FINE, RIGHT? 32 — @basthomas, SwiftConf,
August 17, 2022
33 — @basthomas, SwiftConf, August 17, 2022
34 — @basthomas, SwiftConf, August 17, 2022
35 — @basthomas, SwiftConf, August 17, 2022
36 — @basthomas, SwiftConf, August 17, 2022
public func purchase(product: StoreProduct) async throws -> PurchaseInformation { try
checkRevenueCatConfiguration() let purchaseInformation = try await revenueCat.purchase(product: product) return .init( transaction: purchaseInformation.0, customerInformation: .init(customerInformation: purchaseInformation.1), isUserCancelled: purchaseInformation.2 ) } 37 — @basthomas, SwiftConf, August 17, 2022
... THAT'S IT? 38 — @basthomas, SwiftConf, August 17, 2022
THANKS, REVENUECAT 39 — @basthomas, SwiftConf, August 17, 2022
OH, AND THEN WE CRASHED 40 — @basthomas, SwiftConf, August
17, 2022
HAS ANYONE EVER TOLD YOU TO BE CAREFUL WITH FORCE-UNWRAPPING?
41 — @basthomas, SwiftConf, August 17, 2022
! 42 — @basthomas, SwiftConf, August 17, 2022
// when we are here, we should always be able
// to find a package. if not, that's a programmer error 43 — @basthomas, SwiftConf, August 17, 2022
PRODUCT IDENTIFIER: ? 44 — @basthomas, SwiftConf, August 17, 2022
// when we are here, we should always be able
// to find a package. if not, that's a // programmer error... or an Apple issue. // So do _NOT_ crash. ! 45 — @basthomas, SwiftConf, August 17, 2022
PRODUCT IDENTIFIER: 46 — @basthomas, SwiftConf, August 17, 2022
ANYWAY... 47 — @basthomas, SwiftConf, August 17, 2022
DEMO 48 — @basthomas, SwiftConf, August 17, 2022
49 — @basthomas, SwiftConf, August 17, 2022
50 — @basthomas, SwiftConf, August 17, 2022
DEMO 51 — @basthomas, SwiftConf, August 17, 2022
52 — @basthomas, SwiftConf, August 17, 2022
53 — @basthomas, SwiftConf, August 17, 2022
54 — @basthomas, SwiftConf, August 17, 2022
55 — @basthomas, SwiftConf, August 17, 2022
EVERYTHING IS GOING (TO BE) FINE, RIGHT? 56 — @basthomas,
SwiftConf, August 17, 2022
57 — @basthomas, SwiftConf, August 17, 2022
GRADUAL ROLLOUT 58 — @basthomas, SwiftConf, August 17, 2022
59 — @basthomas, SwiftConf, August 17, 2022
60 — @basthomas, SwiftConf, August 17, 2022
IT'S NOT A BUG, IT'S A FEATURE 61 — @basthomas,
SwiftConf, August 17, 2022
YOLO 62 — @basthomas, SwiftConf, August 17, 2022
YOLO CARPE DIEM 63 — @basthomas, SwiftConf, August 17, 2022
64 — @basthomas, SwiftConf, August 17, 2022
!"# 65 — @basthomas, SwiftConf, August 17, 2022
✅ 66 — @basthomas, SwiftConf, August 17, 2022
! 67 — @basthomas, SwiftConf, August 17, 2022
PAYWALLS 68 — @basthomas, SwiftConf, August 17, 2022
PAYWALLS CONTEXTUAL PAYWALLS 69 — @basthomas, SwiftConf, August 17, 2022
DEMO 70 — @basthomas, SwiftConf, August 17, 2022
71 — @basthomas, SwiftConf, August 17, 2022
CHANGING EXPIRATION DATES PASSWORD PROTECTION TRANSFER LIMIT 72 — @basthomas,
SwiftConf, August 17, 2022
PRE-LOGIN PAYWALL 73 — @basthomas, SwiftConf, August 17, 2022
! 74 — @basthomas, SwiftConf, August 17, 2022
! 75 — @basthomas, SwiftConf, August 17, 2022
! 76 — @basthomas, SwiftConf, August 17, 2022
A NOTE ON CUSTOMER SATISFACTION... 77 — @basthomas, SwiftConf, August
17, 2022
BE CAREFUL WITH "TRICKING" USERS TO BUY SUBSCRIPTIONS 78 —
@basthomas, SwiftConf, August 17, 2022
DEMO 79 — @basthomas, SwiftConf, August 17, 2022
80 — @basthomas, SwiftConf, August 17, 2022
! 81 — @basthomas, SwiftConf, August 17, 2022
82 — @basthomas, SwiftConf, August 17, 2022
TICKING LIKE (GERMAN) CLOCKWORK 83 — @basthomas, SwiftConf, August 17,
2022
There's something one should expect not only of a watch
but also of oneself: to never stand sti . — Walter Lange 84 — @basthomas, SwiftConf, August 17, 2022
EXPERIMENTS 85 — @basthomas, SwiftConf, August 17, 2022
OPTIMIZATION* 86 — @basthomas, SwiftConf, August 17, 2022
* HAPPY CUSTOMERS > SHORT TERM 87 — @basthomas, SwiftConf,
August 17, 2022
OPTIMIZATIONS TO CONSIDER ▸ Default to monthly ▸ Default to
yearly ▸ Focus on Pro ▸ Focus on Premium ▸ Button colors ▸ Etc. etc. 88 — @basthomas, SwiftConf, August 17, 2022
VERIFY, VERIFY, VERIFY 89 — @basthomas, SwiftConf, August 17, 2022
! 90 — @basthomas, SwiftConf, August 17, 2022
THANK YOU! @BASTHOMAS 91 — @basthomas, SwiftConf, August 17, 2022