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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Bas Broek
August 17, 2022
Programming
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
More Decks by Bas Broek
See All by Bas Broek
Roasting Your App's Accessibility
basthomas
0
42
Building an Accessibility Culture, One Step at a Time (Leeds)
basthomas
0
140
Building an Accessibility Culture, One Step at a Time
basthomas
1
110
Not an afterthought: accessibility from start to finish
basthomas
0
160
Accessibility on Apple Platforms: Beyond VoiceOver
basthomas
0
190
No Touch(screen) Required: Voice & Keyboard Accessibility
basthomas
0
180
Dancing with Dinosaurs: Objective-C and Swift Interop
basthomas
0
190
Effective Pull Request Reviews
basthomas
0
440
Accessibility in SwiftUI: Better Apps for Everyone
basthomas
0
180
Other Decks in Programming
See All in Programming
Modding RubyKaigi for Myself
yui_knk
0
920
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.2k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
150
ふつうのFeature Flag実践入門
irof
7
3.7k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
180
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
110
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
Contextとはなにか
chiroruxx
1
290
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
220
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
530
Featured
See All Featured
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
160
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Mind Mapping
helmedeiros
PRO
1
240
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Tell your own story through comics
letsgokoyo
1
950
Designing Powerful Visuals for Engaging Learning
tmiket
1
410
Technical Leadership for Architectural Decision Making
baasie
3
400
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
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