Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Building a modern subscription experience on iOS

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

More Decks by Bas Broek

Other Decks in Programming

Transcript

  1. BUILDING A MODERN SUBSCRIPTION EXPERIENCE ON IOS @BASTHOMAS 1 —

    @basthomas, SwiftConf, August 17, 2022
  2. AMAZING ANNUAL RECURRING REVENUE... ON IOS @BASTHOMAS 2 — @basthomas,

    SwiftConf, August 17, 2022
  3. SUPERB SUBSCRIPTIONS... ON IOS @BASTHOMAS 3 — @basthomas, SwiftConf, August

    17, 2022
  4. INTERESTING IN-APP PURCHASES... ON IOS @BASTHOMAS 4 — @basthomas, SwiftConf,

    August 17, 2022
  5. BUILDING A MODERN SUBSCRIPTION EXPERIENCE ON IOS @BASTHOMAS 5 —

    @basthomas, SwiftConf, August 17, 2022
  6. WHO AM I? ▸ @basthomas on Twitter ▸ XING ▸

    Moya, GitHawk ▸ Apple (macOS VoiceOver) ▸ WeTransfer 6 — @basthomas, SwiftConf, August 17, 2022
  7. WHY AM I TALKING ABOUT THIS TOPIC? 7 — @basthomas,

    SwiftConf, August 17, 2022
  8. WETRANSFER IOS ! 8 — @basthomas, SwiftConf, August 17, 2022

  9. WETRANSFER IOS !! 9 — @basthomas, SwiftConf, August 17, 2022

  10. WETRANSFER IOS !!! 10 — @basthomas, SwiftConf, August 17, 2022

  11. ! 11 — @basthomas, SwiftConf, August 17, 2022

  12. ! ..? 12 — @basthomas, SwiftConf, August 17, 2022

  13. ! 13 — @basthomas, SwiftConf, August 17, 2022

  14. ! 14 — @basthomas, SwiftConf, August 17, 2022

  15. WE GOT SOME DESIGNS. LET'S GET CRACKIN', RIGHT? 15 —

    @basthomas, SwiftConf, August 17, 2022
  16. 16 — @basthomas, SwiftConf, August 17, 2022

  17. ACCESSIBILITY 17 — @basthomas, SwiftConf, August 17, 2022

  18. 18 — @basthomas, SwiftConf, August 17, 2022

  19. 19 — @basthomas, SwiftConf, August 17, 2022

  20. WAIT, TWITTER? 20 — @basthomas, SwiftConf, August 17, 2022

  21. ! 21 — @basthomas, SwiftConf, August 17, 2022

  22. HAPTICS 22 — @basthomas, SwiftConf, August 17, 2022

  23. VOICEOVER 23 — @basthomas, SwiftConf, August 17, 2022

  24. VOICE CONTROL & FULL KEYBOARD ACCESS 24 — @basthomas, SwiftConf,

    August 17, 2022
  25. DARK MODE, MOTION, MORE 25 — @basthomas, SwiftConf, August 17,

    2022
  26. LET'S GET CRACKIN' 26 — @basthomas, SwiftConf, August 17, 2022

  27. LOCAL CONFIGURATION 27 — @basthomas, SwiftConf, August 17, 2022

  28. 28 — @basthomas, SwiftConf, August 17, 2022

  29. 29 — @basthomas, SwiftConf, August 17, 2022

  30. WE'LL START SLOWLY 30 — @basthomas, SwiftConf, August 17, 2022

  31. ... AND USE FEATURE FLAGS 31 — @basthomas, SwiftConf, August

    17, 2022
  32. EVERYTHING'S GOING TO BE FINE, RIGHT? 32 — @basthomas, SwiftConf,

    August 17, 2022
  33. 33 — @basthomas, SwiftConf, August 17, 2022

  34. 34 — @basthomas, SwiftConf, August 17, 2022

  35. 35 — @basthomas, SwiftConf, August 17, 2022

  36. 36 — @basthomas, SwiftConf, August 17, 2022

  37. 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
  38. ... THAT'S IT? 38 — @basthomas, SwiftConf, August 17, 2022

  39. THANKS, REVENUECAT 39 — @basthomas, SwiftConf, August 17, 2022

  40. OH, AND THEN WE CRASHED 40 — @basthomas, SwiftConf, August

    17, 2022
  41. HAS ANYONE EVER TOLD YOU TO BE CAREFUL WITH FORCE-UNWRAPPING?

    41 — @basthomas, SwiftConf, August 17, 2022
  42. ! 42 — @basthomas, SwiftConf, August 17, 2022

  43. // 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
  44. PRODUCT IDENTIFIER: ? 44 — @basthomas, SwiftConf, August 17, 2022

  45. // 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
  46. PRODUCT IDENTIFIER: 46 — @basthomas, SwiftConf, August 17, 2022

  47. ANYWAY... 47 — @basthomas, SwiftConf, August 17, 2022

  48. DEMO 48 — @basthomas, SwiftConf, August 17, 2022

  49. 49 — @basthomas, SwiftConf, August 17, 2022

  50. 50 — @basthomas, SwiftConf, August 17, 2022

  51. DEMO 51 — @basthomas, SwiftConf, August 17, 2022

  52. 52 — @basthomas, SwiftConf, August 17, 2022

  53. 53 — @basthomas, SwiftConf, August 17, 2022

  54. 54 — @basthomas, SwiftConf, August 17, 2022

  55. 55 — @basthomas, SwiftConf, August 17, 2022

  56. EVERYTHING IS GOING (TO BE) FINE, RIGHT? 56 — @basthomas,

    SwiftConf, August 17, 2022
  57. 57 — @basthomas, SwiftConf, August 17, 2022

  58. GRADUAL ROLLOUT 58 — @basthomas, SwiftConf, August 17, 2022

  59. 59 — @basthomas, SwiftConf, August 17, 2022

  60. 60 — @basthomas, SwiftConf, August 17, 2022

  61. IT'S NOT A BUG, IT'S A FEATURE 61 — @basthomas,

    SwiftConf, August 17, 2022
  62. YOLO 62 — @basthomas, SwiftConf, August 17, 2022

  63. YOLO CARPE DIEM 63 — @basthomas, SwiftConf, August 17, 2022

  64. 64 — @basthomas, SwiftConf, August 17, 2022

  65. !"# 65 — @basthomas, SwiftConf, August 17, 2022

  66. ✅ 66 — @basthomas, SwiftConf, August 17, 2022

  67. ! 67 — @basthomas, SwiftConf, August 17, 2022

  68. PAYWALLS 68 — @basthomas, SwiftConf, August 17, 2022

  69. PAYWALLS CONTEXTUAL PAYWALLS 69 — @basthomas, SwiftConf, August 17, 2022

  70. DEMO 70 — @basthomas, SwiftConf, August 17, 2022

  71. 71 — @basthomas, SwiftConf, August 17, 2022

  72. CHANGING EXPIRATION DATES PASSWORD PROTECTION TRANSFER LIMIT 72 — @basthomas,

    SwiftConf, August 17, 2022
  73. PRE-LOGIN PAYWALL 73 — @basthomas, SwiftConf, August 17, 2022

  74. ! 74 — @basthomas, SwiftConf, August 17, 2022

  75. ! 75 — @basthomas, SwiftConf, August 17, 2022

  76. ! 76 — @basthomas, SwiftConf, August 17, 2022

  77. A NOTE ON CUSTOMER SATISFACTION... 77 — @basthomas, SwiftConf, August

    17, 2022
  78. BE CAREFUL WITH "TRICKING" USERS TO BUY SUBSCRIPTIONS 78 —

    @basthomas, SwiftConf, August 17, 2022
  79. DEMO 79 — @basthomas, SwiftConf, August 17, 2022

  80. 80 — @basthomas, SwiftConf, August 17, 2022

  81. ! 81 — @basthomas, SwiftConf, August 17, 2022

  82. 82 — @basthomas, SwiftConf, August 17, 2022

  83. TICKING LIKE (GERMAN) CLOCKWORK 83 — @basthomas, SwiftConf, August 17,

    2022
  84. 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
  85. EXPERIMENTS 85 — @basthomas, SwiftConf, August 17, 2022

  86. OPTIMIZATION* 86 — @basthomas, SwiftConf, August 17, 2022

  87. * HAPPY CUSTOMERS > SHORT TERM 87 — @basthomas, SwiftConf,

    August 17, 2022
  88. 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
  89. VERIFY, VERIFY, VERIFY 89 — @basthomas, SwiftConf, August 17, 2022

  90. ! 90 — @basthomas, SwiftConf, August 17, 2022

  91. THANK YOU! @BASTHOMAS 91 — @basthomas, SwiftConf, August 17, 2022