dodopayments 2.26.0 → 2.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/README.md +1 -1
  4. data/lib/dodopayments/client.rb +4 -0
  5. data/lib/dodopayments/internal/type/union.rb +15 -5
  6. data/lib/dodopayments/models/balance_ledger_entry.rb +9 -1
  7. data/lib/dodopayments/models/balance_retrieve_ledger_params.rb +2 -0
  8. data/lib/dodopayments/models/blocklist/block_by_customer_id.rb +18 -0
  9. data/lib/dodopayments/models/blocklist/block_by_email.rb +18 -0
  10. data/lib/dodopayments/models/blocklist/block_identifier.rb +21 -0
  11. data/lib/dodopayments/models/blocklist/blocked_customer.rb +128 -0
  12. data/lib/dodopayments/models/blocklist/blocked_customer_source.rb +22 -0
  13. data/lib/dodopayments/models/blocklist/create_blocked_customer_request.rb +66 -0
  14. data/lib/dodopayments/models/blocklist/customer_create_params.rb +16 -0
  15. data/lib/dodopayments/models/blocklist/customer_delete_params.rb +22 -0
  16. data/lib/dodopayments/models/blocklist/customer_list_params.rb +64 -0
  17. data/lib/dodopayments/models/blocklist/customer_retrieve_params.rb +22 -0
  18. data/lib/dodopayments/models/blocklist/customers/blocked_customer_note.rb +44 -0
  19. data/lib/dodopayments/models/blocklist/customers/note_create_params.rb +24 -0
  20. data/lib/dodopayments/models/blocklist/customers/note_request.rb +19 -0
  21. data/lib/dodopayments/models/blocklist/customers/note_update_params.rb +30 -0
  22. data/lib/dodopayments/models/checkout_session_preview_response.rb +10 -1
  23. data/lib/dodopayments/models/credit_entitlements/balance_create_ledger_entry_params.rb +1 -1
  24. data/lib/dodopayments/models/credit_entitlements/balance_create_ledger_entry_response.rb +21 -1
  25. data/lib/dodopayments/models/credit_entitlements/credit_ledger_entry.rb +2 -7
  26. data/lib/dodopayments/models/customer.rb +22 -1
  27. data/lib/dodopayments/models/customers/email_body.rb +57 -0
  28. data/lib/dodopayments/models/customers/email_failure_code.rb +27 -0
  29. data/lib/dodopayments/models/customers/email_list_params.rb +39 -0
  30. data/lib/dodopayments/models/customers/email_log_item.rb +121 -0
  31. data/lib/dodopayments/models/customers/email_log_status.rb +24 -0
  32. data/lib/dodopayments/models/customers/email_policies.rb +45 -0
  33. data/lib/dodopayments/models/customers/email_retrieve_body_params.rb +28 -0
  34. data/lib/dodopayments/models/dunning_recovered_webhook_event.rb +1 -0
  35. data/lib/dodopayments/models/dunning_started_webhook_event.rb +1 -0
  36. data/lib/dodopayments/models/manual_retry.rb +76 -0
  37. data/lib/dodopayments/models/manual_retry_state.rb +50 -0
  38. data/lib/dodopayments/models/payment_retrieve_retry_state_params.rb +20 -0
  39. data/lib/dodopayments/models/payment_retry_params.rb +20 -0
  40. data/lib/dodopayments/models/price.rb +95 -27
  41. data/lib/dodopayments/models/subscription.rb +10 -1
  42. data/lib/dodopayments/models/subscription_active_webhook_event.rb +32 -4
  43. data/lib/dodopayments/models/subscription_cancelled_webhook_event.rb +33 -4
  44. data/lib/dodopayments/models/subscription_create_response.rb +10 -1
  45. data/lib/dodopayments/models/subscription_expired_webhook_event.rb +32 -4
  46. data/lib/dodopayments/models/subscription_failed_webhook_event.rb +32 -4
  47. data/lib/dodopayments/models/subscription_list_params.rb +1 -0
  48. data/lib/dodopayments/models/subscription_list_response.rb +10 -1
  49. data/lib/dodopayments/models/subscription_on_hold_webhook_event.rb +32 -4
  50. data/lib/dodopayments/models/subscription_past_due_webhook_event.rb +68 -0
  51. data/lib/dodopayments/models/subscription_paused_webhook_event.rb +32 -4
  52. data/lib/dodopayments/models/subscription_plan_changed_webhook_event.rb +33 -4
  53. data/lib/dodopayments/models/subscription_renewed_webhook_event.rb +32 -4
  54. data/lib/dodopayments/models/subscription_status.rb +1 -0
  55. data/lib/dodopayments/models/subscription_unpaused_webhook_event.rb +32 -4
  56. data/lib/dodopayments/models/subscription_update_params.rb +1 -0
  57. data/lib/dodopayments/models/subscription_update_payment_method_webhook_event.rb +34 -4
  58. data/lib/dodopayments/models/subscription_updated_webhook_event.rb +32 -4
  59. data/lib/dodopayments/models/unsafe_unwrap_webhook_event.rb +3 -1
  60. data/lib/dodopayments/models/unwrap_webhook_event.rb +3 -1
  61. data/lib/dodopayments/models/webhook_event_type.rb +1 -0
  62. data/lib/dodopayments/models/webhook_payload.rb +19 -1
  63. data/lib/dodopayments/models.rb +12 -0
  64. data/lib/dodopayments/resources/blocklist/customers/notes.rb +68 -0
  65. data/lib/dodopayments/resources/blocklist/customers.rb +107 -0
  66. data/lib/dodopayments/resources/blocklist.rb +18 -0
  67. data/lib/dodopayments/resources/credit_entitlements/balances.rb +1 -0
  68. data/lib/dodopayments/resources/customers/emails.rb +76 -0
  69. data/lib/dodopayments/resources/customers.rb +4 -0
  70. data/lib/dodopayments/resources/payments.rb +36 -0
  71. data/lib/dodopayments/resources/webhooks.rb +2 -2
  72. data/lib/dodopayments/version.rb +1 -1
  73. data/lib/dodopayments.rb +31 -1
  74. data/rbi/dodopayments/client.rbi +3 -0
  75. data/rbi/dodopayments/models/balance_ledger_entry.rbi +16 -0
  76. data/rbi/dodopayments/models/balance_retrieve_ledger_params.rbi +10 -0
  77. data/rbi/dodopayments/models/blocklist/block_by_customer_id.rbi +32 -0
  78. data/rbi/dodopayments/models/blocklist/block_by_email.rbi +32 -0
  79. data/rbi/dodopayments/models/blocklist/block_identifier.rbi +30 -0
  80. data/rbi/dodopayments/models/blocklist/blocked_customer.rbi +161 -0
  81. data/rbi/dodopayments/models/blocklist/blocked_customer_source.rbi +55 -0
  82. data/rbi/dodopayments/models/blocklist/create_blocked_customer_request.rbi +143 -0
  83. data/rbi/dodopayments/models/blocklist/customer_create_params.rbi +34 -0
  84. data/rbi/dodopayments/models/blocklist/customer_delete_params.rbi +40 -0
  85. data/rbi/dodopayments/models/blocklist/customer_list_params.rbi +88 -0
  86. data/rbi/dodopayments/models/blocklist/customer_retrieve_params.rbi +40 -0
  87. data/rbi/dodopayments/models/blocklist/customers/blocked_customer_note.rbi +66 -0
  88. data/rbi/dodopayments/models/blocklist/customers/note_create_params.rbi +45 -0
  89. data/rbi/dodopayments/models/blocklist/customers/note_request.rbi +30 -0
  90. data/rbi/dodopayments/models/blocklist/customers/note_update_params.rbi +50 -0
  91. data/rbi/dodopayments/models/checkout_session_preview_response.rbi +10 -0
  92. data/rbi/dodopayments/models/credit_entitlements/balance_create_ledger_entry_params.rbi +2 -2
  93. data/rbi/dodopayments/models/credit_entitlements/balance_create_ledger_entry_response.rbi +8 -0
  94. data/rbi/dodopayments/models/credit_entitlements/credit_ledger_entry.rbi +2 -6
  95. data/rbi/dodopayments/models/customer.rbi +20 -0
  96. data/rbi/dodopayments/models/customers/email_body.rbi +88 -0
  97. data/rbi/dodopayments/models/customers/email_failure_code.rbi +70 -0
  98. data/rbi/dodopayments/models/customers/email_list_params.rbi +68 -0
  99. data/rbi/dodopayments/models/customers/email_log_item.rbi +157 -0
  100. data/rbi/dodopayments/models/customers/email_log_status.rbi +46 -0
  101. data/rbi/dodopayments/models/customers/email_policies.rbi +68 -0
  102. data/rbi/dodopayments/models/customers/email_retrieve_body_params.rbi +48 -0
  103. data/rbi/dodopayments/models/dunning_recovered_webhook_event.rbi +5 -0
  104. data/rbi/dodopayments/models/dunning_started_webhook_event.rbi +5 -0
  105. data/rbi/dodopayments/models/manual_retry.rbi +93 -0
  106. data/rbi/dodopayments/models/manual_retry_state.rbi +65 -0
  107. data/rbi/dodopayments/models/payment_retrieve_retry_state_params.rbi +38 -0
  108. data/rbi/dodopayments/models/payment_retry_params.rbi +38 -0
  109. data/rbi/dodopayments/models/price.rbi +124 -25
  110. data/rbi/dodopayments/models/subscription.rbi +10 -0
  111. data/rbi/dodopayments/models/subscription_active_webhook_event.rbi +53 -6
  112. data/rbi/dodopayments/models/subscription_cancelled_webhook_event.rbi +53 -6
  113. data/rbi/dodopayments/models/subscription_create_response.rbi +10 -0
  114. data/rbi/dodopayments/models/subscription_expired_webhook_event.rbi +53 -6
  115. data/rbi/dodopayments/models/subscription_failed_webhook_event.rbi +53 -6
  116. data/rbi/dodopayments/models/subscription_list_params.rbi +5 -0
  117. data/rbi/dodopayments/models/subscription_list_response.rbi +10 -0
  118. data/rbi/dodopayments/models/subscription_on_hold_webhook_event.rbi +53 -6
  119. data/rbi/dodopayments/models/subscription_past_due_webhook_event.rbi +114 -0
  120. data/rbi/dodopayments/models/subscription_paused_webhook_event.rbi +53 -6
  121. data/rbi/dodopayments/models/subscription_plan_changed_webhook_event.rbi +53 -6
  122. data/rbi/dodopayments/models/subscription_renewed_webhook_event.rbi +53 -6
  123. data/rbi/dodopayments/models/subscription_status.rbi +2 -0
  124. data/rbi/dodopayments/models/subscription_unpaused_webhook_event.rbi +53 -6
  125. data/rbi/dodopayments/models/subscription_update_params.rbi +5 -0
  126. data/rbi/dodopayments/models/subscription_update_payment_method_webhook_event.rbi +58 -6
  127. data/rbi/dodopayments/models/subscription_updated_webhook_event.rbi +53 -6
  128. data/rbi/dodopayments/models/unsafe_unwrap_webhook_event.rbi +1 -0
  129. data/rbi/dodopayments/models/unwrap_webhook_event.rbi +1 -0
  130. data/rbi/dodopayments/models/webhook_event_type.rbi +5 -0
  131. data/rbi/dodopayments/models/webhook_payload.rbi +37 -3
  132. data/rbi/dodopayments/models.rbi +14 -0
  133. data/rbi/dodopayments/resources/blocklist/customers/notes.rbi +50 -0
  134. data/rbi/dodopayments/resources/blocklist/customers.rbi +88 -0
  135. data/rbi/dodopayments/resources/blocklist.rbi +15 -0
  136. data/rbi/dodopayments/resources/credit_entitlements/balances.rbi +2 -1
  137. data/rbi/dodopayments/resources/customers/emails.rbi +60 -0
  138. data/rbi/dodopayments/resources/customers.rbi +3 -0
  139. data/rbi/dodopayments/resources/payments.rbi +26 -0
  140. data/rbi/dodopayments/resources/webhooks.rbi +2 -0
  141. data/sig/dodopayments/client.rbs +2 -0
  142. data/sig/dodopayments/models/balance_ledger_entry.rbs +9 -0
  143. data/sig/dodopayments/models/balance_retrieve_ledger_params.rbs +4 -0
  144. data/sig/dodopayments/models/blocklist/block_by_customer_id.rbs +15 -0
  145. data/sig/dodopayments/models/blocklist/block_by_email.rbs +15 -0
  146. data/sig/dodopayments/models/blocklist/block_identifier.rbs +15 -0
  147. data/sig/dodopayments/models/blocklist/blocked_customer.rbs +87 -0
  148. data/sig/dodopayments/models/blocklist/blocked_customer_source.rbs +20 -0
  149. data/sig/dodopayments/models/blocklist/create_blocked_customer_request.rbs +71 -0
  150. data/sig/dodopayments/models/blocklist/customer_create_params.rbs +17 -0
  151. data/sig/dodopayments/models/blocklist/customer_delete_params.rbs +25 -0
  152. data/sig/dodopayments/models/blocklist/customer_list_params.rbs +53 -0
  153. data/sig/dodopayments/models/blocklist/customer_retrieve_params.rbs +25 -0
  154. data/sig/dodopayments/models/blocklist/customers/blocked_customer_note.rbs +44 -0
  155. data/sig/dodopayments/models/blocklist/customers/note_create_params.rbs +30 -0
  156. data/sig/dodopayments/models/blocklist/customers/note_request.rbs +17 -0
  157. data/sig/dodopayments/models/blocklist/customers/note_update_params.rbs +36 -0
  158. data/sig/dodopayments/models/checkout_session_preview_response.rbs +5 -0
  159. data/sig/dodopayments/models/credit_entitlements/balance_create_ledger_entry_response.rbs +5 -0
  160. data/sig/dodopayments/models/customer.rbs +10 -0
  161. data/sig/dodopayments/models/customers/email_body.rbs +42 -0
  162. data/sig/dodopayments/models/customers/email_failure_code.rbs +30 -0
  163. data/sig/dodopayments/models/customers/email_list_params.rbs +38 -0
  164. data/sig/dodopayments/models/customers/email_log_item.rbs +82 -0
  165. data/sig/dodopayments/models/customers/email_log_status.rbs +20 -0
  166. data/sig/dodopayments/models/customers/email_policies.rbs +37 -0
  167. data/sig/dodopayments/models/customers/email_retrieve_body_params.rbs +30 -0
  168. data/sig/dodopayments/models/dunning_recovered_webhook_event.rbs +2 -1
  169. data/sig/dodopayments/models/dunning_started_webhook_event.rbs +2 -1
  170. data/sig/dodopayments/models/manual_retry.rbs +55 -0
  171. data/sig/dodopayments/models/manual_retry_state.rbs +40 -0
  172. data/sig/dodopayments/models/payment_retrieve_retry_state_params.rbs +23 -0
  173. data/sig/dodopayments/models/payment_retry_params.rbs +23 -0
  174. data/sig/dodopayments/models/price.rbs +52 -17
  175. data/sig/dodopayments/models/subscription.rbs +5 -0
  176. data/sig/dodopayments/models/subscription_active_webhook_event.rbs +16 -4
  177. data/sig/dodopayments/models/subscription_cancelled_webhook_event.rbs +16 -4
  178. data/sig/dodopayments/models/subscription_create_response.rbs +5 -0
  179. data/sig/dodopayments/models/subscription_expired_webhook_event.rbs +16 -4
  180. data/sig/dodopayments/models/subscription_failed_webhook_event.rbs +16 -4
  181. data/sig/dodopayments/models/subscription_list_params.rbs +2 -0
  182. data/sig/dodopayments/models/subscription_list_response.rbs +5 -0
  183. data/sig/dodopayments/models/subscription_on_hold_webhook_event.rbs +16 -4
  184. data/sig/dodopayments/models/subscription_past_due_webhook_event.rbs +47 -0
  185. data/sig/dodopayments/models/subscription_paused_webhook_event.rbs +16 -4
  186. data/sig/dodopayments/models/subscription_plan_changed_webhook_event.rbs +16 -4
  187. data/sig/dodopayments/models/subscription_renewed_webhook_event.rbs +16 -4
  188. data/sig/dodopayments/models/subscription_status.rbs +9 -1
  189. data/sig/dodopayments/models/subscription_unpaused_webhook_event.rbs +16 -4
  190. data/sig/dodopayments/models/subscription_update_params.rbs +2 -0
  191. data/sig/dodopayments/models/subscription_update_payment_method_webhook_event.rbs +16 -4
  192. data/sig/dodopayments/models/subscription_updated_webhook_event.rbs +16 -4
  193. data/sig/dodopayments/models/unsafe_unwrap_webhook_event.rbs +1 -0
  194. data/sig/dodopayments/models/unwrap_webhook_event.rbs +1 -0
  195. data/sig/dodopayments/models/webhook_event_type.rbs +2 -0
  196. data/sig/dodopayments/models/webhook_payload.rbs +16 -4
  197. data/sig/dodopayments/models.rbs +12 -0
  198. data/sig/dodopayments/resources/blocklist/customers/notes.rbs +24 -0
  199. data/sig/dodopayments/resources/blocklist/customers.rbs +36 -0
  200. data/sig/dodopayments/resources/blocklist.rbs +9 -0
  201. data/sig/dodopayments/resources/customers/emails.rbs +22 -0
  202. data/sig/dodopayments/resources/customers.rbs +2 -0
  203. data/sig/dodopayments/resources/payments.rbs +10 -0
  204. data/sig/dodopayments/resources/webhooks.rbs +2 -0
  205. metadata +92 -2
@@ -28,10 +28,6 @@ module Dodopayments
28
28
  sig { returns(Dodopayments::Currency::OrSymbol) }
29
29
  attr_accessor :currency
30
30
 
31
- # Discount applied to the price, represented as a percentage (0 to 100).
32
- sig { returns(Integer) }
33
- attr_accessor :discount
34
-
35
31
  # The payment amount, in the smallest denomination of the currency (e.g., cents
36
32
  # for USD). For example, to charge $1.00, pass `100`.
37
33
  #
@@ -43,6 +39,24 @@ module Dodopayments
43
39
  sig { returns(Symbol) }
44
40
  attr_accessor :type
45
41
 
42
+ # Deprecated: use `discount_bps` instead.
43
+ #
44
+ # Discount applied to the price, represented as a percentage (0 to 100). A
45
+ # response rounds this value to the nearest whole percent. Defaults to `0`.
46
+ sig { returns(T.nilable(Integer)) }
47
+ attr_reader :discount
48
+
49
+ sig { params(discount: Integer).void }
50
+ attr_writer :discount
51
+
52
+ # Discount applied to the price, in basis points. 100 basis points make one
53
+ # percent, so `1250` is a discount of 12.5%.
54
+ #
55
+ # Use this field for a discount with a fraction of a percent. A request that sends
56
+ # this field ignores `discount`. A value of `0` gives no discount.
57
+ sig { returns(T.nilable(Integer)) }
58
+ attr_accessor :discount_bps
59
+
46
60
  # Indicates whether the customer can pay any amount they choose. If set to `true`,
47
61
  # the [`price`](Self::price) field is the minimum amount.
48
62
  sig { returns(T.nilable(T::Boolean)) }
@@ -74,8 +88,9 @@ module Dodopayments
74
88
  sig do
75
89
  params(
76
90
  currency: Dodopayments::Currency::OrSymbol,
77
- discount: Integer,
78
91
  price: Integer,
92
+ discount: Integer,
93
+ discount_bps: T.nilable(Integer),
79
94
  pay_what_you_want: T::Boolean,
80
95
  purchasing_power_parity: T::Boolean,
81
96
  suggested_price: T.nilable(Integer),
@@ -86,14 +101,23 @@ module Dodopayments
86
101
  def self.new(
87
102
  # The currency in which the payment is made.
88
103
  currency:,
89
- # Discount applied to the price, represented as a percentage (0 to 100).
90
- discount:,
91
104
  # The payment amount, in the smallest denomination of the currency (e.g., cents
92
105
  # for USD). For example, to charge $1.00, pass `100`.
93
106
  #
94
107
  # If [`pay_what_you_want`](Self::pay_what_you_want) is set to `true`, this field
95
108
  # represents the **minimum** amount the customer must pay.
96
109
  price:,
110
+ # Deprecated: use `discount_bps` instead.
111
+ #
112
+ # Discount applied to the price, represented as a percentage (0 to 100). A
113
+ # response rounds this value to the nearest whole percent. Defaults to `0`.
114
+ discount: nil,
115
+ # Discount applied to the price, in basis points. 100 basis points make one
116
+ # percent, so `1250` is a discount of 12.5%.
117
+ #
118
+ # Use this field for a discount with a fraction of a percent. A request that sends
119
+ # this field ignores `discount`. A value of `0` gives no discount.
120
+ discount_bps: nil,
97
121
  # Indicates whether the customer can pay any amount they choose. If set to `true`,
98
122
  # the [`price`](Self::price) field is the minimum amount.
99
123
  pay_what_you_want: nil,
@@ -115,9 +139,10 @@ module Dodopayments
115
139
  override.returns(
116
140
  {
117
141
  currency: Dodopayments::Currency::OrSymbol,
118
- discount: Integer,
119
142
  price: Integer,
120
143
  type: Symbol,
144
+ discount: Integer,
145
+ discount_bps: T.nilable(Integer),
121
146
  pay_what_you_want: T::Boolean,
122
147
  purchasing_power_parity: T::Boolean,
123
148
  suggested_price: T.nilable(Integer),
@@ -142,10 +167,6 @@ module Dodopayments
142
167
  sig { returns(Dodopayments::Currency::OrSymbol) }
143
168
  attr_accessor :currency
144
169
 
145
- # Discount applied to the price, represented as a percentage (0 to 100).
146
- sig { returns(Integer) }
147
- attr_accessor :discount
148
-
149
170
  # Number of units for the payment frequency. For example, a value of `1` with a
150
171
  # `payment_frequency_interval` of `month` represents monthly payments.
151
172
  sig { returns(Integer) }
@@ -172,6 +193,24 @@ module Dodopayments
172
193
  sig { returns(Symbol) }
173
194
  attr_accessor :type
174
195
 
196
+ # Deprecated: use `discount_bps` instead.
197
+ #
198
+ # Discount applied to the price, represented as a percentage (0 to 100). A
199
+ # response rounds this value to the nearest whole percent. Defaults to `0`.
200
+ sig { returns(T.nilable(Integer)) }
201
+ attr_reader :discount
202
+
203
+ sig { params(discount: Integer).void }
204
+ attr_writer :discount
205
+
206
+ # Discount applied to the price, in basis points. 100 basis points make one
207
+ # percent, so `1250` is a discount of 12.5%.
208
+ #
209
+ # Use this field for a discount with a fraction of a percent. A request that sends
210
+ # this field ignores `discount`. A value of `0` gives no discount.
211
+ sig { returns(T.nilable(Integer)) }
212
+ attr_accessor :discount_bps
213
+
175
214
  # Opts this price in to purchasing power parity. The business must also enable
176
215
  # purchasing power parity. The discount percentage per country is always
177
216
  # business-wide. Defaults to `false`.
@@ -195,6 +234,13 @@ module Dodopayments
195
234
  sig { returns(T.nilable(T::Boolean)) }
196
235
  attr_accessor :trial_apply_discounts
197
236
 
237
+ # Let a customer start a free trial with no card. Defaults to false.
238
+ sig { returns(T.nilable(T::Boolean)) }
239
+ attr_reader :trial_payment_method_optional
240
+
241
+ sig { params(trial_payment_method_optional: T::Boolean).void }
242
+ attr_writer :trial_payment_method_optional
243
+
198
244
  # Number of days for the trial period. A value of `0` indicates no trial period.
199
245
  sig { returns(T.nilable(Integer)) }
200
246
  attr_reader :trial_period_days
@@ -202,29 +248,38 @@ module Dodopayments
202
248
  sig { params(trial_period_days: Integer).void }
203
249
  attr_writer :trial_period_days
204
250
 
251
+ # Let a customer start a subscription with no card, when the amount due today is
252
+ # `0` (a native `0` price, or a 100% discount). Defaults to false.
253
+ sig { returns(T.nilable(T::Boolean)) }
254
+ attr_reader :zero_amount_payment_method_optional
255
+
256
+ sig { params(zero_amount_payment_method_optional: T::Boolean).void }
257
+ attr_writer :zero_amount_payment_method_optional
258
+
205
259
  # Recurring price details.
206
260
  sig do
207
261
  params(
208
262
  currency: Dodopayments::Currency::OrSymbol,
209
- discount: Integer,
210
263
  payment_frequency_count: Integer,
211
264
  payment_frequency_interval: Dodopayments::TimeInterval::OrSymbol,
212
265
  price: Integer,
213
266
  subscription_period_count: Integer,
214
267
  subscription_period_interval: Dodopayments::TimeInterval::OrSymbol,
268
+ discount: Integer,
269
+ discount_bps: T.nilable(Integer),
215
270
  purchasing_power_parity: T::Boolean,
216
271
  tax_inclusive: T.nilable(T::Boolean),
217
272
  trial_amount: T.nilable(Integer),
218
273
  trial_apply_discounts: T.nilable(T::Boolean),
274
+ trial_payment_method_optional: T::Boolean,
219
275
  trial_period_days: Integer,
276
+ zero_amount_payment_method_optional: T::Boolean,
220
277
  type: Symbol
221
278
  ).returns(T.attached_class)
222
279
  end
223
280
  def self.new(
224
281
  # The currency in which the payment is made.
225
282
  currency:,
226
- # Discount applied to the price, represented as a percentage (0 to 100).
227
- discount:,
228
283
  # Number of units for the payment frequency. For example, a value of `1` with a
229
284
  # `payment_frequency_interval` of `month` represents monthly payments.
230
285
  payment_frequency_count:,
@@ -238,6 +293,17 @@ module Dodopayments
238
293
  subscription_period_count:,
239
294
  # The time interval for the subscription period (e.g., day, month, year).
240
295
  subscription_period_interval:,
296
+ # Deprecated: use `discount_bps` instead.
297
+ #
298
+ # Discount applied to the price, represented as a percentage (0 to 100). A
299
+ # response rounds this value to the nearest whole percent. Defaults to `0`.
300
+ discount: nil,
301
+ # Discount applied to the price, in basis points. 100 basis points make one
302
+ # percent, so `1250` is a discount of 12.5%.
303
+ #
304
+ # Use this field for a discount with a fraction of a percent. A request that sends
305
+ # this field ignores `discount`. A value of `0` gives no discount.
306
+ discount_bps: nil,
241
307
  # Opts this price in to purchasing power parity. The business must also enable
242
308
  # purchasing power parity. The discount percentage per country is always
243
309
  # business-wide. Defaults to `false`.
@@ -250,8 +316,13 @@ module Dodopayments
250
316
  # Whether discount codes reduce the trial charge. Defaults to false. Only
251
317
  # meaningful when a paid trial is configured.
252
318
  trial_apply_discounts: nil,
319
+ # Let a customer start a free trial with no card. Defaults to false.
320
+ trial_payment_method_optional: nil,
253
321
  # Number of days for the trial period. A value of `0` indicates no trial period.
254
322
  trial_period_days: nil,
323
+ # Let a customer start a subscription with no card, when the amount due today is
324
+ # `0` (a native `0` price, or a 100% discount). Defaults to false.
325
+ zero_amount_payment_method_optional: nil,
255
326
  type: :recurring_price
256
327
  )
257
328
  end
@@ -260,7 +331,6 @@ module Dodopayments
260
331
  override.returns(
261
332
  {
262
333
  currency: Dodopayments::Currency::OrSymbol,
263
- discount: Integer,
264
334
  payment_frequency_count: Integer,
265
335
  payment_frequency_interval: Dodopayments::TimeInterval::OrSymbol,
266
336
  price: Integer,
@@ -268,11 +338,15 @@ module Dodopayments
268
338
  subscription_period_interval:
269
339
  Dodopayments::TimeInterval::OrSymbol,
270
340
  type: Symbol,
341
+ discount: Integer,
342
+ discount_bps: T.nilable(Integer),
271
343
  purchasing_power_parity: T::Boolean,
272
344
  tax_inclusive: T.nilable(T::Boolean),
273
345
  trial_amount: T.nilable(Integer),
274
346
  trial_apply_discounts: T.nilable(T::Boolean),
275
- trial_period_days: Integer
347
+ trial_payment_method_optional: T::Boolean,
348
+ trial_period_days: Integer,
349
+ zero_amount_payment_method_optional: T::Boolean
276
350
  }
277
351
  )
278
352
  end
@@ -293,10 +367,6 @@ module Dodopayments
293
367
  sig { returns(Dodopayments::Currency::OrSymbol) }
294
368
  attr_accessor :currency
295
369
 
296
- # Discount applied to the price, represented as a percentage (0 to 100).
297
- sig { returns(Integer) }
298
- attr_accessor :discount
299
-
300
370
  # The fixed payment amount. Represented in the lowest denomination of the currency
301
371
  # (e.g., cents for USD). For example, to charge $1.00, pass `100`.
302
372
  sig { returns(Integer) }
@@ -323,6 +393,24 @@ module Dodopayments
323
393
  sig { returns(Symbol) }
324
394
  attr_accessor :type
325
395
 
396
+ # Deprecated: use `discount_bps` instead.
397
+ #
398
+ # Discount applied to the price, represented as a percentage (0 to 100). A
399
+ # response rounds this value to the nearest whole percent. Defaults to `0`.
400
+ sig { returns(T.nilable(Integer)) }
401
+ attr_reader :discount
402
+
403
+ sig { params(discount: Integer).void }
404
+ attr_writer :discount
405
+
406
+ # Discount applied to the price, in basis points. 100 basis points make one
407
+ # percent, so `1250` is a discount of 12.5%.
408
+ #
409
+ # Use this field for a discount with a fraction of a percent. A request that sends
410
+ # this field ignores `discount`. A value of `0` gives no discount.
411
+ sig { returns(T.nilable(Integer)) }
412
+ attr_accessor :discount_bps
413
+
326
414
  sig { returns(T.nilable(T::Array[Dodopayments::AddMeterToPrice])) }
327
415
  attr_accessor :meters
328
416
 
@@ -344,12 +432,13 @@ module Dodopayments
344
432
  sig do
345
433
  params(
346
434
  currency: Dodopayments::Currency::OrSymbol,
347
- discount: Integer,
348
435
  fixed_price: Integer,
349
436
  payment_frequency_count: Integer,
350
437
  payment_frequency_interval: Dodopayments::TimeInterval::OrSymbol,
351
438
  subscription_period_count: Integer,
352
439
  subscription_period_interval: Dodopayments::TimeInterval::OrSymbol,
440
+ discount: Integer,
441
+ discount_bps: T.nilable(Integer),
353
442
  meters: T.nilable(T::Array[Dodopayments::AddMeterToPrice::OrHash]),
354
443
  purchasing_power_parity: T::Boolean,
355
444
  tax_inclusive: T.nilable(T::Boolean),
@@ -359,8 +448,6 @@ module Dodopayments
359
448
  def self.new(
360
449
  # The currency in which the payment is made.
361
450
  currency:,
362
- # Discount applied to the price, represented as a percentage (0 to 100).
363
- discount:,
364
451
  # The fixed payment amount. Represented in the lowest denomination of the currency
365
452
  # (e.g., cents for USD). For example, to charge $1.00, pass `100`.
366
453
  fixed_price:,
@@ -374,6 +461,17 @@ module Dodopayments
374
461
  subscription_period_count:,
375
462
  # The time interval for the subscription period (e.g., day, month, year).
376
463
  subscription_period_interval:,
464
+ # Deprecated: use `discount_bps` instead.
465
+ #
466
+ # Discount applied to the price, represented as a percentage (0 to 100). A
467
+ # response rounds this value to the nearest whole percent. Defaults to `0`.
468
+ discount: nil,
469
+ # Discount applied to the price, in basis points. 100 basis points make one
470
+ # percent, so `1250` is a discount of 12.5%.
471
+ #
472
+ # Use this field for a discount with a fraction of a percent. A request that sends
473
+ # this field ignores `discount`. A value of `0` gives no discount.
474
+ discount_bps: nil,
377
475
  meters: nil,
378
476
  # Opts this price in to purchasing power parity. The business must also enable
379
477
  # purchasing power parity. The discount percentage per country is always
@@ -390,7 +488,6 @@ module Dodopayments
390
488
  override.returns(
391
489
  {
392
490
  currency: Dodopayments::Currency::OrSymbol,
393
- discount: Integer,
394
491
  fixed_price: Integer,
395
492
  payment_frequency_count: Integer,
396
493
  payment_frequency_interval: Dodopayments::TimeInterval::OrSymbol,
@@ -398,6 +495,8 @@ module Dodopayments
398
495
  subscription_period_interval:
399
496
  Dodopayments::TimeInterval::OrSymbol,
400
497
  type: Symbol,
498
+ discount: Integer,
499
+ discount_bps: T.nilable(Integer),
401
500
  meters: T.nilable(T::Array[Dodopayments::AddMeterToPrice]),
402
501
  purchasing_power_parity: T::Boolean,
403
502
  tax_inclusive: T.nilable(T::Boolean)
@@ -48,6 +48,11 @@ module Dodopayments
48
48
  end
49
49
  attr_writer :customer
50
50
 
51
+ # Whether a payment method is on file. False while a card-optional subscription
52
+ # waits for the customer to add one.
53
+ sig { returns(T::Boolean) }
54
+ attr_accessor :has_payment_method
55
+
51
56
  # Additional custom data associated with the subscription
52
57
  sig { returns(T::Hash[Symbol, Dodopayments::MetadataItem::Variants]) }
53
58
  attr_accessor :metadata
@@ -201,6 +206,7 @@ module Dodopayments
201
206
  T::Array[Dodopayments::CreditEntitlementCartResponse::OrHash],
202
207
  currency: Dodopayments::Currency::OrSymbol,
203
208
  customer: Dodopayments::CustomerLimitedDetails::OrHash,
209
+ has_payment_method: T::Boolean,
204
210
  metadata: T::Hash[Symbol, Dodopayments::MetadataItem::Variants],
205
211
  meter_credit_entitlement_cart:
206
212
  T::Array[Dodopayments::MeterCreditEntitlementCartResponse::OrHash],
@@ -255,6 +261,9 @@ module Dodopayments
255
261
  currency:,
256
262
  # Customer details associated with the subscription
257
263
  customer:,
264
+ # Whether a payment method is on file. False while a card-optional subscription
265
+ # waits for the customer to add one.
266
+ has_payment_method:,
258
267
  # Additional custom data associated with the subscription
259
268
  metadata:,
260
269
  # Meter credit entitlement cart settings for this subscription
@@ -338,6 +347,7 @@ module Dodopayments
338
347
  T::Array[Dodopayments::CreditEntitlementCartResponse],
339
348
  currency: Dodopayments::Currency::TaggedSymbol,
340
349
  customer: Dodopayments::CustomerLimitedDetails,
350
+ has_payment_method: T::Boolean,
341
351
  metadata: T::Hash[Symbol, Dodopayments::MetadataItem::Variants],
342
352
  meter_credit_entitlement_cart:
343
353
  T::Array[Dodopayments::MeterCreditEntitlementCartResponse],
@@ -15,11 +15,16 @@ module Dodopayments
15
15
  sig { returns(String) }
16
16
  attr_accessor :business_id
17
17
 
18
- # Response struct representing subscription details
19
- sig { returns(Dodopayments::Subscription) }
18
+ # Subscription payload sent on a webhook. It carries every field of
19
+ # `SubscriptionResponse`, plus the grace-period deadline.
20
+ sig { returns(Dodopayments::SubscriptionActiveWebhookEvent::Data) }
20
21
  attr_reader :data
21
22
 
22
- sig { params(data: Dodopayments::Subscription::OrHash).void }
23
+ sig do
24
+ params(
25
+ data: Dodopayments::SubscriptionActiveWebhookEvent::Data::OrHash
26
+ ).void
27
+ end
23
28
  attr_writer :data
24
29
 
25
30
  # The timestamp of when the event occurred
@@ -33,7 +38,7 @@ module Dodopayments
33
38
  sig do
34
39
  params(
35
40
  business_id: String,
36
- data: Dodopayments::Subscription::OrHash,
41
+ data: Dodopayments::SubscriptionActiveWebhookEvent::Data::OrHash,
37
42
  timestamp: Time,
38
43
  type: Symbol
39
44
  ).returns(T.attached_class)
@@ -41,7 +46,8 @@ module Dodopayments
41
46
  def self.new(
42
47
  # The business identifier
43
48
  business_id:,
44
- # Response struct representing subscription details
49
+ # Subscription payload sent on a webhook. It carries every field of
50
+ # `SubscriptionResponse`, plus the grace-period deadline.
45
51
  data:,
46
52
  # The timestamp of when the event occurred
47
53
  timestamp:,
@@ -54,7 +60,7 @@ module Dodopayments
54
60
  override.returns(
55
61
  {
56
62
  business_id: String,
57
- data: Dodopayments::Subscription,
63
+ data: Dodopayments::SubscriptionActiveWebhookEvent::Data,
58
64
  timestamp: Time,
59
65
  type: Symbol
60
66
  }
@@ -62,6 +68,47 @@ module Dodopayments
62
68
  end
63
69
  def to_hash
64
70
  end
71
+
72
+ class Data < Dodopayments::Models::Subscription
73
+ OrHash =
74
+ T.type_alias do
75
+ T.any(
76
+ Dodopayments::SubscriptionActiveWebhookEvent::Data,
77
+ Dodopayments::Internal::AnyHash
78
+ )
79
+ end
80
+
81
+ # Time when the grace period ends. The subscription moves to `on_hold` or to
82
+ # `cancelled` at this time.
83
+ #
84
+ # Read in the same query as the rest of the payload, so it always comes from the
85
+ # row snapshot that produced `status`. It is set whenever the subscription sits in
86
+ # a window at that moment. A delayed event of another type therefore carries the
87
+ # deadline too, next to a `past_due` status.
88
+ sig { returns(T.nilable(Time)) }
89
+ attr_accessor :past_due_ends_at
90
+
91
+ # Subscription payload sent on a webhook. It carries every field of
92
+ # `SubscriptionResponse`, plus the grace-period deadline.
93
+ sig do
94
+ params(past_due_ends_at: T.nilable(Time)).returns(T.attached_class)
95
+ end
96
+ def self.new(
97
+ # Time when the grace period ends. The subscription moves to `on_hold` or to
98
+ # `cancelled` at this time.
99
+ #
100
+ # Read in the same query as the rest of the payload, so it always comes from the
101
+ # row snapshot that produced `status`. It is set whenever the subscription sits in
102
+ # a window at that moment. A delayed event of another type therefore carries the
103
+ # deadline too, next to a `past_due` status.
104
+ past_due_ends_at: nil
105
+ )
106
+ end
107
+
108
+ sig { override.returns({ past_due_ends_at: T.nilable(Time) }) }
109
+ def to_hash
110
+ end
111
+ end
65
112
  end
66
113
  end
67
114
  end
@@ -15,11 +15,16 @@ module Dodopayments
15
15
  sig { returns(String) }
16
16
  attr_accessor :business_id
17
17
 
18
- # Response struct representing subscription details
19
- sig { returns(Dodopayments::Subscription) }
18
+ # Subscription payload sent on a webhook. It carries every field of
19
+ # `SubscriptionResponse`, plus the grace-period deadline.
20
+ sig { returns(Dodopayments::SubscriptionCancelledWebhookEvent::Data) }
20
21
  attr_reader :data
21
22
 
22
- sig { params(data: Dodopayments::Subscription::OrHash).void }
23
+ sig do
24
+ params(
25
+ data: Dodopayments::SubscriptionCancelledWebhookEvent::Data::OrHash
26
+ ).void
27
+ end
23
28
  attr_writer :data
24
29
 
25
30
  # The timestamp of when the event occurred
@@ -33,7 +38,7 @@ module Dodopayments
33
38
  sig do
34
39
  params(
35
40
  business_id: String,
36
- data: Dodopayments::Subscription::OrHash,
41
+ data: Dodopayments::SubscriptionCancelledWebhookEvent::Data::OrHash,
37
42
  timestamp: Time,
38
43
  type: Symbol
39
44
  ).returns(T.attached_class)
@@ -41,7 +46,8 @@ module Dodopayments
41
46
  def self.new(
42
47
  # The business identifier
43
48
  business_id:,
44
- # Response struct representing subscription details
49
+ # Subscription payload sent on a webhook. It carries every field of
50
+ # `SubscriptionResponse`, plus the grace-period deadline.
45
51
  data:,
46
52
  # The timestamp of when the event occurred
47
53
  timestamp:,
@@ -54,7 +60,7 @@ module Dodopayments
54
60
  override.returns(
55
61
  {
56
62
  business_id: String,
57
- data: Dodopayments::Subscription,
63
+ data: Dodopayments::SubscriptionCancelledWebhookEvent::Data,
58
64
  timestamp: Time,
59
65
  type: Symbol
60
66
  }
@@ -62,6 +68,47 @@ module Dodopayments
62
68
  end
63
69
  def to_hash
64
70
  end
71
+
72
+ class Data < Dodopayments::Models::Subscription
73
+ OrHash =
74
+ T.type_alias do
75
+ T.any(
76
+ Dodopayments::SubscriptionCancelledWebhookEvent::Data,
77
+ Dodopayments::Internal::AnyHash
78
+ )
79
+ end
80
+
81
+ # Time when the grace period ends. The subscription moves to `on_hold` or to
82
+ # `cancelled` at this time.
83
+ #
84
+ # Read in the same query as the rest of the payload, so it always comes from the
85
+ # row snapshot that produced `status`. It is set whenever the subscription sits in
86
+ # a window at that moment. A delayed event of another type therefore carries the
87
+ # deadline too, next to a `past_due` status.
88
+ sig { returns(T.nilable(Time)) }
89
+ attr_accessor :past_due_ends_at
90
+
91
+ # Subscription payload sent on a webhook. It carries every field of
92
+ # `SubscriptionResponse`, plus the grace-period deadline.
93
+ sig do
94
+ params(past_due_ends_at: T.nilable(Time)).returns(T.attached_class)
95
+ end
96
+ def self.new(
97
+ # Time when the grace period ends. The subscription moves to `on_hold` or to
98
+ # `cancelled` at this time.
99
+ #
100
+ # Read in the same query as the rest of the payload, so it always comes from the
101
+ # row snapshot that produced `status`. It is set whenever the subscription sits in
102
+ # a window at that moment. A delayed event of another type therefore carries the
103
+ # deadline too, next to a `past_due` status.
104
+ past_due_ends_at: nil
105
+ )
106
+ end
107
+
108
+ sig { override.returns({ past_due_ends_at: T.nilable(Time) }) }
109
+ def to_hash
110
+ end
111
+ end
65
112
  end
66
113
  end
67
114
  end
@@ -32,6 +32,11 @@ module Dodopayments
32
32
  sig { returns(String) }
33
33
  attr_accessor :payment_id
34
34
 
35
+ # False when the customer can start this subscription with no card. True for every
36
+ # other subscription.
37
+ sig { returns(T::Boolean) }
38
+ attr_accessor :payment_method_required
39
+
35
40
  # Tax will be added to the amount and charged to the customer on each billing
36
41
  # cycle
37
42
  sig { returns(Integer) }
@@ -86,6 +91,7 @@ module Dodopayments
86
91
  customer: Dodopayments::CustomerLimitedDetails::OrHash,
87
92
  metadata: T::Hash[Symbol, Dodopayments::MetadataItem::Variants],
88
93
  payment_id: String,
94
+ payment_method_required: T::Boolean,
89
95
  recurring_pre_tax_amount: Integer,
90
96
  subscription_id: String,
91
97
  client_secret: T.nilable(String),
@@ -111,6 +117,9 @@ module Dodopayments
111
117
  metadata:,
112
118
  # First payment id for the subscription
113
119
  payment_id:,
120
+ # False when the customer can start this subscription with no card. True for every
121
+ # other subscription.
122
+ payment_method_required:,
114
123
  # Tax will be added to the amount and charged to the customer on each billing
115
124
  # cycle
116
125
  recurring_pre_tax_amount:,
@@ -143,6 +152,7 @@ module Dodopayments
143
152
  customer: Dodopayments::CustomerLimitedDetails,
144
153
  metadata: T::Hash[Symbol, Dodopayments::MetadataItem::Variants],
145
154
  payment_id: String,
155
+ payment_method_required: T::Boolean,
146
156
  recurring_pre_tax_amount: Integer,
147
157
  subscription_id: String,
148
158
  client_secret: T.nilable(String),
@@ -15,11 +15,16 @@ module Dodopayments
15
15
  sig { returns(String) }
16
16
  attr_accessor :business_id
17
17
 
18
- # Response struct representing subscription details
19
- sig { returns(Dodopayments::Subscription) }
18
+ # Subscription payload sent on a webhook. It carries every field of
19
+ # `SubscriptionResponse`, plus the grace-period deadline.
20
+ sig { returns(Dodopayments::SubscriptionExpiredWebhookEvent::Data) }
20
21
  attr_reader :data
21
22
 
22
- sig { params(data: Dodopayments::Subscription::OrHash).void }
23
+ sig do
24
+ params(
25
+ data: Dodopayments::SubscriptionExpiredWebhookEvent::Data::OrHash
26
+ ).void
27
+ end
23
28
  attr_writer :data
24
29
 
25
30
  # The timestamp of when the event occurred
@@ -33,7 +38,7 @@ module Dodopayments
33
38
  sig do
34
39
  params(
35
40
  business_id: String,
36
- data: Dodopayments::Subscription::OrHash,
41
+ data: Dodopayments::SubscriptionExpiredWebhookEvent::Data::OrHash,
37
42
  timestamp: Time,
38
43
  type: Symbol
39
44
  ).returns(T.attached_class)
@@ -41,7 +46,8 @@ module Dodopayments
41
46
  def self.new(
42
47
  # The business identifier
43
48
  business_id:,
44
- # Response struct representing subscription details
49
+ # Subscription payload sent on a webhook. It carries every field of
50
+ # `SubscriptionResponse`, plus the grace-period deadline.
45
51
  data:,
46
52
  # The timestamp of when the event occurred
47
53
  timestamp:,
@@ -54,7 +60,7 @@ module Dodopayments
54
60
  override.returns(
55
61
  {
56
62
  business_id: String,
57
- data: Dodopayments::Subscription,
63
+ data: Dodopayments::SubscriptionExpiredWebhookEvent::Data,
58
64
  timestamp: Time,
59
65
  type: Symbol
60
66
  }
@@ -62,6 +68,47 @@ module Dodopayments
62
68
  end
63
69
  def to_hash
64
70
  end
71
+
72
+ class Data < Dodopayments::Models::Subscription
73
+ OrHash =
74
+ T.type_alias do
75
+ T.any(
76
+ Dodopayments::SubscriptionExpiredWebhookEvent::Data,
77
+ Dodopayments::Internal::AnyHash
78
+ )
79
+ end
80
+
81
+ # Time when the grace period ends. The subscription moves to `on_hold` or to
82
+ # `cancelled` at this time.
83
+ #
84
+ # Read in the same query as the rest of the payload, so it always comes from the
85
+ # row snapshot that produced `status`. It is set whenever the subscription sits in
86
+ # a window at that moment. A delayed event of another type therefore carries the
87
+ # deadline too, next to a `past_due` status.
88
+ sig { returns(T.nilable(Time)) }
89
+ attr_accessor :past_due_ends_at
90
+
91
+ # Subscription payload sent on a webhook. It carries every field of
92
+ # `SubscriptionResponse`, plus the grace-period deadline.
93
+ sig do
94
+ params(past_due_ends_at: T.nilable(Time)).returns(T.attached_class)
95
+ end
96
+ def self.new(
97
+ # Time when the grace period ends. The subscription moves to `on_hold` or to
98
+ # `cancelled` at this time.
99
+ #
100
+ # Read in the same query as the rest of the payload, so it always comes from the
101
+ # row snapshot that produced `status`. It is set whenever the subscription sits in
102
+ # a window at that moment. A delayed event of another type therefore carries the
103
+ # deadline too, next to a `past_due` status.
104
+ past_due_ends_at: nil
105
+ )
106
+ end
107
+
108
+ sig { override.returns({ past_due_ends_at: T.nilable(Time) }) }
109
+ def to_hash
110
+ end
111
+ end
65
112
  end
66
113
  end
67
114
  end