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
230
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
Assistive Access: Reinventing Your App for a New (sort of) Generation
basthomas
0
14
Roasting Your App's Accessibility
basthomas
0
54
Building an Accessibility Culture, One Step at a Time (Leeds)
basthomas
0
150
Building an Accessibility Culture, One Step at a Time
basthomas
1
130
Not an afterthought: accessibility from start to finish
basthomas
0
180
Accessibility on Apple Platforms: Beyond VoiceOver
basthomas
0
200
No Touch(screen) Required: Voice & Keyboard Accessibility
basthomas
0
190
Dancing with Dinosaurs: Objective-C and Swift Interop
basthomas
0
200
Effective Pull Request Reviews
basthomas
0
450
Other Decks in Programming
See All in Programming
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
280
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
320
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
640
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
470
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
460
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
190
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
110
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.8k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
500
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
560
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.6k
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
My Coaching Mixtape
mlcsv
0
220
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
480
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1.1k
GraphQLとの向き合い方2022年版
quramy
50
15k
Why Our Code Smells
bkeepers
PRO
340
58k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
560
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
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