Recurring Billing
Manage Subscriptions
Manage subscription scenarios
Updating subscriptions
The following details can be updated for eligible Pending and Active subscriptions:
- Subscription ID
- Price
- Plan
- Payment method
- Add-on and discount details
- Number of billing cycles
- Merchant account
- Descriptor
- Java
SubscriptionRequest request = new SubscriptionRequest()
.id("new_id")
.paymentMethodToken("new_payment_method_token")
.price(new BigDecimal("14.00"))
.planId("new_plan")
.merchantAccountId("new_merchant_account");
Result<Subscription> result = gateway.subscription().update(
"a_subscription_id",
request
);
If the subscription can't be found, it will throw a NotFoundException
.
Plans
If you update a subscription's plan, the subscription will not inherit the new plan's price. Additionally, you can only update to a plan with the same billing cycle (e.g. you can't update from a yearly plan to a monthly plan and vice versa).
Payment methods
You can update the payment method associated with a Pending, Active, or Past Due subscription using either of the following:
*If you delete a payment method using its payment method token, all associated subscriptions will be canceled immediately and the customer will forfeit any remaining days they've already paid for.
When you update a Past Due subscription's payment method and you have proration enabled, the subscription will be automatically retried.
Add-ons and discounts
When updating a subscription, you can modify the add-ons and discounts in 3 ways:
- New add-ons/discounts can be added
- Existing add-ons/discounts associated with the subscription can be updated
- Existing add-ons/discounts associated with the subscription can be removed
- Java
SubscriptionRequest request = new SubscriptionRequest()
.addOns()
.add()
.inheritedFromId("add_on_id_1")
.amount(new BigDecimal("25.00"))
.done()
.update("add_on_id_2")
.amount(new BigDecimal("50.00"))
.done()
.remove("add_on_id_3")
.done()
.discounts()
.add()
.inheritedFromId("discount_id_1")
.amount(new BigDecimal("7.00"))
.done()
.update("discount_id_2")
.amount(new BigDecimal("15.00"))
.done()
.remove("discount_id_3")
.done();
Result<Subscription> result = gateway.subscription().update(
"the_subscription_id",
request
);
Proration
You can use proration to charge or credit a customer if a change is made to the subscription price in the middle of a billing cycle. Enabling proration adjusts the price based on how many days are left in the billing cycle, and charges the customer the newly-calculated rate immediately. Without proration enabled, any changes made to a customer's subscription mid-cycle will go into effect at the beginning of the next cycle.
Proration can be configured to run automatically on upgrades and/or downgrades in the Control Panel, or you can pass the option prorateCharges as true.
By default, if the transaction for the prorated amount fails, the update to the subscription no longer goes through. If you would like to continue with the update to the subscription and add the prorated amount to the balance even though the transaction failed, you can set this preference in the Control Panel or pass the option revertSubscriptionOnProrationFailure .
Proration with add-ons and discounts
Add-ons and discounts will only be prorated when you pass the option prorateCharges as true
. If existing add-ons or discounts were not originally passed with this option set to true
, they will not be prorated.
For example, if a request is sent to update an add-on's quantity
from 4
to 6
with prorateCharges set to true
, and the original add-ons did not also pass this option as true
, the subscriber will only be charged a prorated amount for the additional 2 add-ons.
Merchant accounts
Since merchantAccountId determines currency, updating the merchant account used to process transactions for a subscription may change which currency the subscription is processed in.
Past Due subscriptions
A subscription's balance represents the amount of outstanding charges associated with that subscription. If a customer's payment method fails or is declined, their subscription status will change to Past Due, and the subscription's balance is incremented by the amount of the transaction that failed. This amount includes the subscription base price as well as any associated add-ons and/or discounts.
If the subscription has add-ons and discounts with a specified number of billing cycles, the number of billing cycles are also reflected in the subscription's balance. For example, let's say that a subscription was created with these settings:
Subscription price: $12 for 12 billing cycles
Add-on price: $10 for 2 billing cycles
The subscription and the first add-on were charged successfully when it was created, but it is now 2 billing cycles past due. The balance is $34.
2 failed billing cycles, $12 each = $24
1 failed billing cycle for the add-on charge for $10
Total balance = $34
Since the add-on was designated to apply for 2 billing cycles and we already had one successful billing cycle, it will only count one billing cycle for the add-on in the balance. This same logic also applies to discounts.
The balance on Past Due subscriptions will continue to increase every billing cycle—either indefinitely or until the number of cycles in the subscription is reached.
Updating Past Due subscriptions
When updating a subscription that is Past Due, you can only update fields that do not change the price:
- Subscription ID
- Payment method
- Merchant account
- Descriptor
Retry logic
We will automatically attempt to charge past due subscriptions at the beginning of each new billing cycle. You can also customize our retry logic in the Control Panel if you would like to charge past due subscriptions in-between billing cycles. Depending on the processor response code, some declines are not retried because they suggest that it's unlikely the transaction will ever be successful.
A subscription's balance will only be adjusted by our retry logic at the beginning of a new billing cycle. In other words, if the automatic retry attempts during one billing cycle are not successful, the subscription's balance will increase in the next billing cycle to incorporate the missed payment.
You can also retry transactions manually, either on a one-off basis or as a part of your own recurring logic.
Negative balance
A negative balance indicates that credit is owed to the customer on that subscription. A subscription's balance can go into the negative if you have configured your processing options to allow proration on downgrades. If a subscription has a negative balance that is enough to cover the charge, the subscription will bill successfully without actually charging the payment method.
Retrying transactions manually
By default, we will use the subscription balance when retrying the transaction. If you would like to use a different amount you can optionally specify the amount for the transaction.
A successful manual retry of a past due subscription will always reduce the balance of that subscription to $0, regardless of the amount of the retry.
Submitting for settlement
When retrying a declined transaction via the API, pass [true
] in the argument to automatically submit the transaction for settlement if the retry request is successful:
- Java
Result<Transaction> retryResult = gateway.subscription().retryCharge(
subscription.getId(),
new BigDecimal("24.00"),
true
);
When the transaction is authorized, the subscription status will return to Active unless the number of billing cycles in the subscription has been reached. If the subscription has no further billing cycles, it will become Expired.
Refunding a subscription
Refunds for subscriptions work the same as refunds for individual transactions. You can only issue a refund against an existing sale transaction, and that transaction must have a status of settled or settling.
You can specify the refund amount if you don't want to refund the full amount of an existing sale transaction. If a customer has an annual subscription and you want to refund them for six months, issue a refund by reversing the original transaction for half the amount paid in a single transaction.
use Transaction: Refund
to issue a refund via the API. You can also issue a refund within the Control Panel. If you do not want to continue charging the customer for their subscription in the future, be sure to cancel the subscription as well.
See also
- Canceling subscriptions
- Searching for subscriptions
- Advanced recurring billing settings
- Subscription validations
- Subscription object
Next Page: Testing and Go Live →