ℹ️ For upgrade instructions, read the UPGRADE guide
- Remove forgery protection check for Stripe controller
- Use
ActionController::APIas base for webhooks. This removes the need to skip forgery protection and improves performance. - Use
inheritance_columninstead of hardcodedtypecolumn in case users modify migrations - Use
attr_reader :support_emailsince we define a customer setter - Use
skip_forgery_protectionto be more compatible with Rails 8.2+
- Automatically sync Stripe charge if
objectis nil to ease upgrading.
- Stripe v18 #1209
- Fix `Pay::PaymentMethod.make_default! #1207
-
Sync
Invoicediscount sources so they can be rendered in receipts without additional API calls See: https://docs.stripe.com/changelog/clover/2025-09-30/add-discount-source-property?changelog-sdk=ruby#impactYou may need to re-sync Stripe charges to have the latest copy after this update.
Pay::Stripe::Charge.find_each { it.sync! }
- Stripe v17 #1202
- Fix payment method syncing when customer is deleted #1201
- Include
stripe_accountinset_payment_processorandadd_payment_processorqueries #1198
- Fix Stripe
subscriptions.renewingwebhook to use the correct account when retrieving the price
- Replace
ownerassociation withdelegatesincehas_one :throughdoesn't work with polymorphic belongs_to without asource_type
- Add
has_one :owner, through: :customerassocation toPay::Charge,Pay::SubscriptionandPay::PaymentMethodfor convenience.
- Fix Stripe
Charge#refund!to allow no arguments and default to refunding the full amount.
- Fix Stripe InvoicePayment syncing for old Charges without
payment_intentattribute #1183
- Add
retrytoPay::Stripe.sync_checkout_sessionSubscriptions aren't instantly attached to a Checkout Session, so this retry gives a chance for completion. This helps build a more seamless experience when redirecting after a successful checkout so the next page knows the user has subscribed successfully.
- Add text parts to emails
- Fix release
-
[Breaking] Renames
pay_customerassociations forchargesandsubscriptionsto prevent conflicts To upgrade, add thepay_prefix when referencing associations.@user.pay_subscriptions @user.pay_charges
-
on_trial?andtrial_ended?now consider if aPay::Subscriptionwas canceled. #1172 -
Stripe
cancel_now!no longer setstrial_ends_atwhen there was no trial #1172 -
Stripe
cancelandcancel_now!set values from the API response to match the values when syncing via webhooks. #1172 -
Stripe
Subscription#syncnow setstrial_ends_attonilif the API response is also nil. #1172 Previously, it would leave the value unmodified in the database but this ensures the value is always in sync with the Stripe API. -
Braintree subscriptions that
cancel_now!now consider their trial ended immediately to match.
- Fix Stripe payment controller rescue
- Stripe
payment_action_requiredwebhooks now have to retrieve the InvoicePayments to send the email
- Handle Stripe errors if invalid payment intent ID is used for /payments
- Allow nil with delegate to Stripe Charge object
- Add
charge.updatedwebhook for Stripe Charges Whencharge.succeededfires, the associatedbalance_transactionisn't always present. Adding this webhooks allows us to be notified when the balance_transaction is set. - Makes
Pay::FakeProcessor::Customer.subscribea bit more compatible with other payment processors by ignoring all attributes that aren't database columns. #1155
- Replace
pay_customer.upcoming_invoicewithpay_customer.preview_invoice - Support options to
pay_customer.preview_invoice()to
- Expand
payment_intentandrefunds.data.balance_transactionforStripe::Charge - Expand
scheduleforStripe::Subscription
- Update Stripe
invoice.payment_failedandinvoice.payment_action_requiredevents
- Update
invoice.upcomingStripe webhook for new JSON format
- Fix receipts for non-Stripe processors
- Fix Stripe Invoice line item amount on receipts and invoices
-
[Breaking] Stripe version upgrade including breaking changes. See https://docs.stripe.com/changelog#2025-03-31.basil Requires
stripegem~> 15 -
[Breaking] Stripe
Pay::Customer#upcoming_invoicehas been renamed toPay::Customer#preview_invoice -
[Breaking] Moved Stripe charge attributes to
pay_charge.stripe_invoiceto simplify integrations and provide access to more dataThis requires re-syncing Pay charges and subscriptions to update the cached data. Receipts and invoices expect to be able to access these details in the new format. We recommend syncing records either in task after deployment or before the data is displayed in a request.
-
[Breaking] Removed
pay_subscription.proratevirtual attribute. Pass proration options directly to actions instead. -
[Breaking] Drops Rails 6.1 support
- Fix Stripe Charge
balance_transactionsyncing
- [Breaking] Remove default
typefor Stripe Merchant Account creation - Refactor
Pay.sync(params)into a Hash for easily extending
Pay::SYNC_HANDLERS[:foo] = ->(id) { Pay::Foo.sync_checkout(id) }
# Pay.sync(params) calls lambda if params[:foo] is present- Add
balance_transactionto Stripe Charges for accessing conversion rates - Skip subscription renewing webhook for Stripe subscriptions that are set to
send_invoice
- Ignore Stripe
payment_failedandpayment_action_requiredwebhooks onincompletesubscriptions as these are already handled by the JavaScript in-browser. #1121 - Add
FakeProcessor::Subscription#sync#1120
- Compatibility with frozen string literals
- Add
metato LemonSqueezy webhook objects. LemonSqueezy does not store metadata and they're only temporarily accessible via the webhook meta.
- FakeProcessor subscriptions can be marked as nonresumable. This is helpful for giving users a limited subscription.
pay_customer.subscribe(ends_at: 1.year.from_now, data: {resumable: false})- Raise
Pay::Errorinstead ofStandardErrorconsistently
- Allow proration mode argument for Paddle Billing subscriptions
- Fix Lemon Squeezy sync subscription
- Fix typo in Paddle Billing customer
api_record
- Fix
retry_failed_paymentfor Stripe subscriptions #1084
- Stripe v13
- Remove OpenStruct dependency
- [Breaking] Remove
pay_customer.payment_method_tokenvirtual attribute. Use@pay_customer.update_payment_method(token)instead. - [Breaking] Rename
customertoapi_record - [Breaking] Rename
update_customer!toupdate_api_record - [Breaking] Rename
Pay::PaymentMethod#typetoPay::PaymentMethod#payment_method_type - [Breaking] Remove Stripe
checkout_buttonpartial. Use the Checkout Sessionurldirectly in a link or server-side redirect. - Add Lemon Squeezy support Supports one-time payments and subscriptions
- Add
Pay.sync(params)for automatically syncing Stripe Checkout Sessions and Paddle Billing transactions. - Lock Pay::Customer record when creating or updating Stripe customer to handle race conditions. #1027
- LemonSqueezy & Paddle Billing will now find Customers by email since they do not allow duplicates. #1043
- Add
Pay::Stripe::Customer#customer_sessionfor creating pricing tables, etc
- Stripe v12
- Accept Stripe Connect live and test webhooks in production #1001
- Only sync Stripe Checkout Session charge if it exists
- Use empty string to resume / unpause Stripe subscriptions. #992
- Add devcontainer for easier development #988
- Stripe 11.x #980
- Update Paddle billing payment method sync #946
- Improve compatibility for fake processor charge with other payment processors by ignoring any non-attribute params. #965
- Update
trial_ends_atwhen Paddle Billing & Classic subscriptions change toactiveorpast_due#936
- Add
pay_amount_to_currencyview helper
-
[Breaking] Rails secrets are no longer supported. Please use Rails credentials or environment variables.
-
[Breaking] Stripe now syncs the
default_payment_methodassociation to Pay::Subscriptionsrails g migration AddPaymentMethodToPaySubscriptions payment_method_id
-
[Breaking] Paddle Classic is now
paddle_classicand Paddle Billing ispaddle_billing.To migrate, existing Paddle customers should be updated to
paddle_classicPay::Customer.where(processor: :paddle).update_all(processor: :paddle_classic)
Rename webhooks for
paddle.*topaddle_classic.* -
[Breaking]
stripe_accounthas been moved from thedata:jsoncolumn to a dedicated columnTo migrate, create a migration to add the stripe_account column.
add_column :pay_customers, :stripe_account, :string add_column :pay_subscriptions, :stripe_account, :string add_column :pay_payment_methods, :stripe_account, :string add_column :pay_charges, :stripe_account, :string
Then copy the data over to the column:
Pay::Customer.find_each{ |c| c.update(stripe_account: c.data&.dig("stripe_account")) } Pay::Subscription.find_each{ |c| c.update(stripe_account: c.data&.dig("stripe_account")) } Pay::PaymentMethod.find_each{ |c| c.update(stripe_account: c.data&.dig("stripe_account")) } Pay::Charge.find_each{ |c| c.update(stripe_account: c.data&.dig("stripe_account")) }
-
[Breaking] Subscriptions with
status: :canceledandends_at: futureare now considered canceled. Previously, these were considered active to accomodate canceling a Braintree subscription during trial (and allowing the user to continue using until the end of the trial). -
[Breaking] Subscriptions with
status: :past_duewill be canceled immediately whencancelis called. -
Updated Stripe Payment confirmation page to use PaymentElement instead of CardElement
- [Stripe] Skip sync if object is not attached to a customer. Fixes #842
- Update to Stripe
2023-08-16API version - [Stripe] Add
pay_customer.create_payment_intentfor creating payment intents without immediate confirmation - [Stripe] Add
pay_customer.terminal_chargefor creating Stripe Terminal payments
- Allow configurable Stripe API version
- Only include success_url and cancel_url for checkout when not embedded mode
- Fix payments#show redirect_to not falling back to root_path properly
- Add
currencyandinvoice_credit_balanceto Stripe Pay::Customer #825 - @nachiket87 - Safely handle Rails 7.2's removal of secrets. #834 @heliocola
- Fix Paddle PayPal payment method details not recording
- Add
Pay::Stripe.to_client_reference_id(User.first)method to generate client_reference_id for use with Stripe's CheckoutSession, Pricing Tables, etc #823 Unfortunately with theclient_reference_idrequirements, we cannot use Signed GlobalIDs and have to implement our own IDs and validation. If Stripe relaxes their requirements in the future, we could replace this implementation with SGIDs. - Skip Stripe
customer.deletedwebhook processing if customer is not in the database. #818 - Refactor
on_grace_period?to be implemented separately by each payment processor - Add default value of
nilto the token param ofPay::Paddle::Billable#add_payment_method - Fix
Pay::Paddle::Billable#add_payment_method. Passpay_customer: pay_customeras keyword arg / value tosynccall insidePay::Paddle::Billable#add_payment_methodmethod body. #821 - Remove Rails 6.0 from CI now that it is EOL
- Add new configuration option named
send_emailswhich can be used to disable the sending of all current and future emails. This option can be set to a boolean value or a proc/lambda that returns a boolean value. - @cjilbert504
-
Introduce
:payload hook - @excid3 Rails no longer allows autoloading during the initialization process. The on_load hook allows you to run code after autoloading, so we can register webhook listeners once autoloading is available.To use this, wrap your webhook subscribe calls in the
on_load(:pay)hook:ActiveSupport.on_load(:pay) do Pay::Webhooks.delegator.subscribe "stripe.charge.succeded", ChargeSucceeded end
- Import Stimulus.js from dist folder on unpkg
- Fix
swap_and_invoice - Support passing options through
swapon Stripe
- [SECURITY] Fix XSS vulnerability in back parameter on Stripe payment page
Previously, an attacker could inject Javascript or redirect the user to any URL by changing the
backparameter in the URL. Thebackparameter is now sanitized and restricted to relative paths. - Remove unused attributes for
planandquantityinapp/models/pay/customer.rb. - Add explicit requires for
active_supportandaction_mailerinlib/pay.rb. This should provide better errors for anyone not requiring all of Rails.
- Fix
retry_past_due_subscriptionsto now callpay_open_invoices
- Add
payment_failedemail to notify customers of failed payments and update their billing information This can be disabled withPay.emails.payment_failed = trueif you already use a dunning email service subscriptionnow sorts bycreated_atto find the latest subscription. This adds compatibility for UUID primary keys on pay tables.- Add
unpaidscope to Pay::Subscription - Add
pay_open_invoicesto Pay::Stripe::Subscription If you have a subscription with open invoices (like an unpaid metered billing subscription), you can use this method to pay the open invoices and allow the user to resume the subscription
- Set
created_aton Braintree charges to match transaction created_at - Sync Braintree payment method during subscription sync since we already have to look it up
- Handle missing Braintree subscription when syncing charge
- Fix
Pay::Charge.payment_processorscopes to join the customers table
- Fix Braintree PaymentMethod sync reference to gateway
- Fix
pause_active?for stripe incorrectly returningtrue - Refactor Braintree cancel / cancel_now to use sync
- Use
paid_through_dateforends_atwith canceled subscriptions
- Add
Pay::Braintree::Subscription.sync - Add
Pay::Braintree::Charge.sync - Switch Braintree webhooks to use
sync - Automatically save first charge when subscribing with Braintree
- Add
emailfor PayPal charges andusernamefor Venmo charges on Braintree
- Fix
refundsmissing on checkout session completed event.
- Cast
Pay.support_emailtoMail::Addressinstead of string. This allows us to easily parse out the address, name, etc for use in Receipts and other places. - Update Stripe
checkout_session.completedwebhook to synclatest_chargefor compatibility with Stripe API2022-11-15changes
- Swapping Braintree subscriptions previously had a bug where if a user had an existing plan and was attempting to switch to a new plan, we would cancel their current plan before subscribing them to the new plan. If subscribing to the new plan failed however, the user would then no longer have any plan at all. This has now been resolved by attempting to subscribe to the new plan first, which if fails will raise an error and preserve the users current plan.
- Switch
business_nametoapplication_nameto receipt & mailers The business name is included on receipts & refunds, but emails should show theapplication_nameinstead in case a business has multiple applications / products - Use
instance_execformail_argumentsandmail_toso lambda/proc has access to all mailer features - Add
application_nameto email subjects - Add links to root_url in emails
- Validate PaymentIntent on
swapandretry_failed_payment
- Retrieve PaymentIntent via API to ensure it always matches the Pay Stripe API verison
- Handle ActiveRecord::RecordNotUnique error during sync and retry
- Add retries to Stripe PaymentMethod.sync
- Fix deprecation warning in tests #735
- [Breaking] Require Stripe 8.x
- [Breaking] Update Stripe API to 2022-11-15
- [Breaking]
paddle_paused_fromis nowpause_starts_at:datetimecolumn - [Breaking]
activescope no longer includes paused subscriptions - [Breaking] Stripe paused subscriptions have changed:
pause_behavior=voidsubscriptions are now consideredactive?until the end of the current period. This is intended for not providing services for a certain period of time.pause_behavior=mark_uncollectibleis considered active. This is intended for offering services for free.pause_behavior=keep_as_draftis considered active. This is intended for offering serivces for free but collecting payments later. - [Breaking] Stripe subscriptions now
always_invoicewhen swapping plans. Previously, swap would useproration_behavior: "create_prorations". This caused some confusion when users upgraded plans and weren't charged until the next period. The default will now automatically invoice immediately. - Adds
pause_behavior:stringcolumn - Adds
pause_resumes_at:datetimecolumn - Adds
metered:booleancolumn for easier querying / indexing - Adds
active_or_pausedscope to retrieve active or paused subscriptions - Remove
off_session: truedefault for Stripesubscribe. - @excid3 Removing this allows Stripe to attach the PaymentMethod to the Customer once confirmed. You can still pass this option in when subscribing if needed. New subscriptions typically are initiated by users, which shouldn't provide this parameter as true. - Add
Pay::Stripe::PaymentMethod.sync_payment_intentto sync PaymentMethod from PaymentIntent objects - Add
Pay::Stripe::PaymentMethod.sync_setup_intentto sync PaymentMethod from SetupIntent objects - Add
Pay::Subscription#retry_failed_paymentfor retryingpast_duesubscriptions with failed payments - Fix
swapfrom always setting status toactive. Failed swaps with Stripe will be set topast_due.
-
Prepend Pay webhook listeners so they run before user-defined webhook listeners - @excid3 @cjilbert504 This is important because a user might define a webhook listener that expects a subscription to be deleted and if the Pay webhook hasn't run yet, the subscription would not be canceled when the user-defined webhook runs.
-
Fix Webhook delegator unsubscribe - @excid3 @cjilbert504
-
Fix non-deterministic subscription - @feliperaul @excid3
- Old Pay::Subscription records may have
nilor[]for subscription_items. In those cases, we will set the quantity on the Stripe Subscription directly - @excid3
- Add
metered_subscription_itemto Pay::Subscriptions to easily retrieve the metered subscription item for Stripe subscriptions - @excid3 - Add
not_fake_processorscope to Pay::Customer - @excid3
- Fix typo in Stripe API version - @excid3
- Upgrade to Stripe API
2022-08-01andstriperubygem v7 - @excid3
- Ensure Customer is created before creating a setup intent - @excid3 @cjilbert504
- ℹ️ Add
"paused"into.activescope and#active?onPay::Subscription. Stripe marks paused subscriptions withstatus: :activeandpause_behaviornot null. Paddle marks paused subscriptions withstatus: :paused. This change allows Pay to treat them both the same. - @cjilbert504 @excid3 - Add
active_without_pausedscope onPay::Subsctiption. This filters out paused subscriptions from theactivescope. - @cjilbert504 @GALTdea - Add
status: :pausedto update call inPay::Paddle::Subscription#pause. - @cjilbert504 @excid3 - Change
#paused?inPay::Paddle::Subscriptionto checkpay_subscription.status == "paused"instead of#paddle_paused_from. - @cjilbert504 @excid3 If webhooks have not been utilized, you should run query for anyPay::Subscriptionswherestatus: :activeandpaddle_paused_fromis not null and update tostatus: "paused".
- Expand Stripe discounts and taxes when loading a subscription - @excid3
- Store Stripe refunds on the Charge - @excid3
- Include line for each refund in the receipt - @excid3
- Fix recording first charge for a subscription - @excid3
- Fix tax amounts and skip $0 tax lines in Stripe receipts - @excid3
- Support
client_reference_idon Stripe Checkout Sessions - @excid3 @cjilbert504 This is helpful when using the Stripe Pricing Table or any Checkout Session. Requires a Signed GlobalID as the value to prevent tampering.
::Stripe::Checkout::Session.create(
mode: "payment",
client_reference_id: current_user.to_sgid,
...
)- Stripe
checkout.session.completednow syncs payment intents - @excid3
- Update
refund!method instripe/charge.rbto handle multiple refunds on the same charge. - @cjilbert504 @kyleschmolze - Add configuration options for mailer - @excid3 @le-doude @cjilbert504
Pay.setup do |config|
# Change parent mailer for Pay::UserMailer
config.parent_mailer = "MyCustomMailer"
# Change the mailer for Pay
config.mailer = "MyCustomMailer"- [Breaking] Replaced
subscriptionandchargeemail params topay_subscriptionandpay_chargerespectively. - @cjilbert504 - [Breaking] Replaced
send_emailswithemailsconfig. This allows you to customize which emails can be sent independently. - @cjilbert504
Pay.setup do |config|
# Set value to boolean
config.emails.receipt = true
# Or set value to a lambda that returns a boolean
config.emails.subscription_renewing = ->(pay_subscription, price) {
(price&.type == "recurring") && (price.recurring&.interval == "year")
}
end-
Numericality validation on
Pay::Subscriptionhas been updated from beinggreater_than_or_equal_to: 1togreater_than_or_equal_to: 0. This is because metered billing subscriptions do not have a quantity. -
Stripe Tax support
Using
pay_customer stripe_attributes: :method_name, you can add an Address toStripe::Customerobjects which will be used for calculating taxes. We now recordtotal_tax_amountstoPay::Chargerecords. This includes details for each tax applied to the charge.@user.payment_processor.subscribe(plan: "growth", automatic_tax: { enabled: true })
-
Stripe Metered Billing support Removes
quantitywhen creating a new subscription (metered billing prices do not allow quantity) Addscreate_usage_recordtoPay::Subscriptionfor reporting usage on metered billing plans Addsmetered_items?helper toPay::Subscriptionto easily check if a subscription has any metered billing items AddsPay::Subscription.with_metered_itemsmethod to query for subscriptions with metered billing items -
Raise error when dependencies are not supported versions. This makes sure you're using supported versions of libraries with Pay. Currently supported versions:
stripe ~> 6.0braintree ~> 4.7paddle_pay ~> 0.2receipts ~> 2.0
-
Add
credit_note!to Stripe charges - @excid3 -
refund!now issues a Stripe::CreditNote if an invoice is present - @excid3Refunds of charges associated with an Invoice don’t reduce your overall tax liability and don’t show up in Stripe Tax reporting. https://stripe.com/docs/tax/faq#how-do-refunds-work In most cases, you should use credit notes instead of refunds. Credit notes reduce your overall tax liability and show up in Stripe Tax reporting. https://stripe.com/docs/tax/faq#how-do-you-handle-credit-notes
-
Stripe.max_network_retries is now set to 2 by default. - @excid3 This adds idempotency keys automatically to each request so that they can be safely retried.
-
Stripe Subscriptons can now be paused and resumed - @excid3
-
Separate authorize and capture is now supported on Stripe - @excid3
pay_charge = pay_customer.authorize(75_00) pay_charge.capture pay_charge.capture(amount_to_capture: 50_00) # or with an amount
-
Store
stripe_receipt_urlon Pay::Charge - @mguidetti -
Replace
update_email!withupdate_customer!- @excid3 -
Add options for
cancel_now!to supportinvoice_nowandprorateflags for Stripe - @excid3 -
Adds
add_payment_processorto add a payment processor without making it the default - @excid3 -
Setting
pay_namein Stripe Subscription metadata will be used as thenameon thePay::Subscription- @excid3 -
pay_customernow supports astripe_attributes:option to add attributes to Stripe::Customers - @excid3 -
pay_customernow supports abraintree_attributes:option to add attributes to Braintree::Customers - @excid3 -
pay_customernow supports adefault_payment_processoroption to automatically create a Pay::Customer record - @excid3 -
Added
enabled_processorsto Pay config. This lets you choose exactly which processors will be enabled. - @cjilbert504 -
Add
sync!method to Pay::Subscription instances - @excid3 -
Ignore Stripe charges that don't have a customer ID - @excid3
- Make payment method and charges consistent for Fake procsesor - @excid3
- Merge Stripe Checkout
session_idparam intosuccess_urlautomatically - @excid3
- Update to
@hotwired/stimulusfor payments view - @excid3 - Update test/dummy app to Pay 3 - @excid3
- Add
update_customermethods for SyncCustomer job - @excid3
- Safely handle receipts for users without
extra_billing_info- @excid3
- Correctly handle cancelling a paused Paddle subscription - @excid3
- Add
generic_trial?toPay::Subscriptionfor checking if fake processor trial - @excid3 - Charge succeeded should send email even when receipts gem isn't available - @excid3
- Update mailers to use
Pay::Customer#customer_name- @excid3 - Use
pay_customerinstead ofbillablein mailers - @excid3 - Remove payment methods when cancelling Paddle subscription - @excid3
- Convert
paddle_paused_fromto Time - @excid3
- Remove hardcoded currency in emails - @excid3
- Accept options for
Pay::Currency.format- @excid3
- Add
amount_with_currencytoPay::Payment- @excid3
- Add
Pay::Currencyfor formatting amounts with currency - @excid3 - Add
amount_with_currencyandamount_refunded_with_currencytoPay::Charge- @excid3 - Safer pay processor lookup when processor is blank - @excid3
- Store
stripe_accountwhen syncing Stripe payment methods - @excid3
- Add
CHECKOUT_SESSION_IDto checkout URLs by default and document how to add them - @excid3 - Fix invoice bill_to to use
customer.ownerinstead ofowner- @excid3
- Fix Stripe charge.refunded webhook - @excid3
- Fix Pay::Subscription charges association - @excid3
- Remove Pay::Charge default sort - @excid3
- Fix translation key - @excid3
- Better invoice line items format - @excid3
- Namespace locales under
pay- @excid3 - I18n receipt and invoice dates - @excid3
- Add
business_logoconfig - @excid3 - Add
refunded?partial_refund?andfull_refund?methods toPay::Charge- @excid3
- Fix payment method sync on customer updated - @excid3
- Fix Stripe customer.updated webhook - @excid3
- Add retries for payment method sync in case of rate limiting - @excid3
- Add
on_generic_trial?to Pay::Customer for easier checking - @excid3
Yanked
- Add payment methods to Pay::Charge
charged_tohelper - @excid3 - Improve
swaperror message - @excid3
- Add
rake pay:payment_methods:sync_defaulttask for easily upgrading to Pay 3 - @excid3
See the UPGRADE guide for steps on upgrading from Pay 2.x.
- Requires Rails 6+
- Migrates
processorandprocessor_idfrom models toPay::Customermodel - Replaces include Pay::Billable with pay_customer method
- Replaces include Pay::Merchant with pay_merchant method
- Changes Pay::Charge to associate with Pay::Customer instead of
owner{polymorphic} - Changes Pay::Subscription to associate with
Pay::Customerinstead ofowner{polymorphic} - Migrates card fields from models to
Pay::PaymentMethodmodel - Queues webhooks in
Pay::Webhookfor processing with ActiveJob to handle large volumes of webhooks - Subscriptions are automatically canceled when a Pay::Subscription deleted - @stevepolitodesign
- Active subscriptions are canceled when a Pay::Customer's owner is deleted - @stevepolitodesign
- Add
invoiceto Pay::Charge
- Don't validate SetupIntent for trialing subscriptions - @archonic
- Validate uniqueness of charges and subscriptions - @excid3
- Better handle out of order webhooks and race conditions - @excid3
- Refactor Stripe webhooks to always retrieve latest records - @excid3
- Associate charges with subscriptions if possible - @excid3
- Add
Pay::Merchantand Stripe Connect functionality - @excid3 - Save
currencyon Pay::Charge records - @excid3
- Add
subscriptionmethod to payment processor classes for direct access to the processor subscription object. The owner is not guaranteed to be on the same payment processor, which can cause problems. - @excid3
- Improve the Stripe Checkout URLs so your Rails app doesn't need a
root_url#309 - @excid3 - Fix
currencywith Stripe Checkout #308 - @excid3
- Update Stripe & Braintree default card automatically when the customer is accessed (ie. on charge, subscribe, etc) #300 - @excid3
- Add passthrough fallback for paddle payment succeeded webhook #302 - @nm
- Add Stripe
payment_intent.succeededwebhook listener
- Improve error wrappers to delegate message to original cause
- [NEW] Raise error if payment processor name is nil
- [FIX] Pay::Error now uses the correct message in to_s
- Create braintree customer on update_card if needed
- [NEW] Fake payment processor for testing and giving users free access to your application
- [FIX] Delegate trial_ends_at for subscriptions - @archonic
- [FIX] Default to empty hash when default_url_options is nil so proper error is raised
- [FIX] Fix inquiry when processor is nil
- [FIX] Correctly handle updating payment method in Stripe
- [NEW] Add Stripe Customer Billing Portal - @excid3
- Include
customeron Stripe Checkout sessions - @excid3
- [NEW] Stripe Checkout support - @excid3
- [BREAKING] Webhooks that can't be verified respond with 400 instead of 200 - @excid3
- [BREAKING] Remove StripeEvent dependency - excid3
- [BREAKING] Remove old configuration for mailer subjects in favor of locales - @excid3
- [NEW] Add
Pay::Webhook.delegatorfor subscribing to webhooks - @excid3
- [Fix] Fixed missing require for version file - @excid3
- Add Stripe app info and join the Stripe Partner program for better support for Pay! - @excid3
- [FIX] Update migration to check for symobl keys on ActiveRecord adapter with Rails 6.1 - @excid3
- [FIX] Move Paddle logic into paddle methods - @excid3
- [BREAKING] Use locales for email subjects and remove configuration - @excid3
- [FIX] Subject for payment action required emails referenced an invalid config - @excid3
- Add
datajson column to Charge and Subscription models - @excid3
To add the new migrations to your app, run:
rails pay:install:migrations
- Add Paddle initial support - @nm
Pay.model_parent_classdefaults toApplicationRecord- @excid3- Test suite now runs against sqlite, mysql, and postgresql - @excid3
- [FIX] Lookup billable on invoice.payment_action_required events - @excid3
- Bugfixes
- [NEW] Allow passing
?back=/path/to/itemfor customizing the back link for SCA payments page
Stripe API 2020-08-27 changes:
- Use
proration_behaviorinstead ofproratefor Stripe subscription changes - Switch to
::Stripe::Subscription.createinstead ofcustomer.subscriptionsas Stripe no longer includes this by default for performance - Set Stripe API version for easier gem management
- Add support for
quantityoption onsubscribefor subscription quantities - Added
Pay::BraintreeAuthorizationErrorto catch Braintree actions with malformed data or unauthorized API access.
- [FIX] Remove old billable migration
- [FIX] The
chargemethod now raisesPay::BraintreeErrorwhen a charge fails. This makes it work consistently with the Stripe implementation which raises an error on charge failure.
-
[BREAKING] Subscription & Charge associations to
ownerare now polymorphic.Requires adding
owner_type:stringto both Pay::Charge and Pay::Subscription models and setting the value for all existing records to your model name.
class AddOwnerTypeToPay < ActiveRecord::Migration[6.0]
def change
add_column :pay_charges, :owner_type, :string
add_column :pay_subscriptions, :owner_type, :string
# Backfill owner_type column to match your Billable model
Pay::Charge.update_all owner_type: "User"
Pay::Subscription.update_all owner_type: "User"
end
endPay.billable_class is now deprecated and will be removed in a future version. You should also update your existing Pay migrations to reference the :users table rather than Pay.billable_class and any other code you may have that references this method.
- [FIX] Stripe subscription cancel shouldn't change status
- [FIX] Stripe test payment methods should now work (ie.
pm_card_visa)
- [FIX] Styling tweaks for payment intent page
- [FIX] Stripe Refund and Charge references weren't matching the right class
- [NEW] Stripe SCA support
- [BREAKING] Requires using PaymentMethods instead of Source and Tokens
- [BREAKING] Drops Ruby 2.4 support
- [BREAKING]
automount_webhook_routesconfig option has been renamed toautomount_routes - [BREAKING]
webhooks_pathconfig option has been renamed toroutes_path - Added
statuscolumn to payments to keep in sync with Stripe. We're also adding statuses to Braintree subscriptions to keep them in sync as best we can. - Added
payments#showroute to handle SCA payments that require action - Added webhook handler for payments that require action
- Added
trial_period_dayswhen creating a subscription that works the same on Stripe and Braintree
- Set default from email to
Pay.support_email
- Add
on_trial_or_subscribed?convenience method
- Removed Rails HTML Sanitizer dependency since it wasn't being used
- Add
stripe?,braintree?, andpaypal?to Pay::Charge - Add webhook mounting and path options
- Makes
stripe?,braintree?, andpaypal?helper methods always available on Billable.
- Update migration to reference Billable instead of Users
- Check ENV first when looking up keys to allow for overrides