LogoLogo
System Status
  • Digital River API
  • Getting started
  • Using our services
    • Local pricing
    • Item classification
    • Subscriptions
    • e-Invoicing
  • Integration options
    • Low-code checkouts
      • Implementing a Prebuilt Checkout
      • Implementing a Components checkout
      • Offering local pricing
      • Using a shipping endpoint
      • Processing subscription acquisitions
      • Adding custom fields
      • Offering store credit
      • Displaying policies and getting consent
      • Collecting e-invoice information
      • Handling completed checkout-sessions
    • Direct integrations
      • Standard flow
      • Building checkouts
        • Checking out guest and registered customers
        • Describing line items
          • Setting the price of an item
          • Managing items with shared SKU identifiers
        • Providing address information
        • Handling shipping choice
        • Tax identifiers
        • Applying a discount
        • Setting the customer type
        • Providing the IP address
        • Selecting a currency
        • Initiating a charge
        • Setting the purchase location
        • Configuring taxes
        • Accessing regulatory fee information
        • Localizing invoices and credit memos
        • Providing an upstream identifier
        • Applying store credit
        • Handling e-invoicing requirements
        • Landed cost
        • Tax calculation inputs
        • Selling entities
        • Payment sessions
        • Applying store credit (legacy)
        • Country specs
      • Building payment workflows
        • Handling redirect payment methods
        • Handling delayed payment methods
      • Subscription acquisitions
        • Handling subscription acquisitions
        • Handling external subscription acquisitions
        • Subscription information
      • Digital River coordinated fulfillments
        • Checking inventory levels
        • Using shipping quotes
        • Reserving inventory items
        • Managing a fulfillment order
        • Cancelling a fulfillment order
    • Connectors
  • Order management
    • Processing orders
    • Handling a rejected order
    • Accessing invoices and credit memos
    • Fulfilling goods and services
    • Capturing and cancelling charges
    • Payment reauthorizations
    • Handling reversals
      • Return basics
        • Digital River coordinated returns
        • Third party coordinated returns
      • Refund basics
        • Issuing refunds
        • Refunding asynchronous payment methods
      • Disputes and chargebacks
    • Customer notifications
    • Responding to events
      • Events
        • Key event types
        • All event types
      • Webhooks
        • Creating a webhook
        • Digital River API safelist
        • Digital River signature
      • Expanding events
      • Preventing webhooks from getting disabled
    • Distributor model
  • Subscription Management
    • Managing a subscription
    • Managing an external subscription
  • Payments
    • Payment solutions
      • Drop-in payments
        • How Drop-in payments work
        • Drop-in payments integration guide
      • DigitalRiver.js with Elements
        • Elements integration guide
        • Configuring payment methods
          • Configuring Afterpay
          • Configuring Alipay+ (cross-border)
          • Configuring Alipay (domestic)
          • Configuring Amazon Pay
          • Configuring Apple Pay
          • Configuring Bancontact
          • Configuring BNP Paribas
          • Configuring BLIK
          • Configuring CCAvenue
          • Configuring Clearpay
          • Configuring Credit Cards
          • Configuring FPX Online Banking
          • Configuring Google Pay
          • Configuring iDEAL
          • Configuring Klarna
          • Configuring Konbini
          • Configuring Online Banking (IBP)
          • Configuring Online Banking (Korea Bank Transfer)
          • Configuring PayCo
          • Configuring PayPal
          • Configuring SEPA Direct Debit
          • Configuring Trustly
          • Configuring Wire Transfer
          • Common payment sources
          • Common payment objects
    • Supported payment methods
      • Afterpay
      • Alipay (domestic)
      • Alipay+ (cross-border)
      • Amazon Pay
      • Apple Pay
      • Bancontact
      • BNP Paribas
      • BLIK
      • CCAvenue
      • Clearpay
      • Credit Cards
      • FPX Online Banking
      • Google Pay
      • iDEAL
      • Klarna
      • Konbini
      • Korea Bank Transfer (Online Banking)
      • Online Banking (IBP)
      • Pay with Installments France
      • PayCo
      • PayPal
      • PayPal Billing Agreement
      • PayPal Credit
      • PayPal Pay in 3
      • PayPal Pay in 4
      • PayPal RatenZahlung (Installment Payment)
      • SEPA Direct Debit
      • Trustly
      • Wire Transfer
    • Source basics
      • Managing sources
      • Handling credit card sources
      • Retrieving sources
    • Authorization declines
    • PSD2 and SCA
      • How to ensure SCA compliance
    • Payment testing scenarios
  • Product management
    • Product basics
    • Managing SKUs
    • Using product details
    • Grouping SKUs
    • SKU-inventory item pairs
    • Managing inventory items
    • Regulatory fees
      • What are regulatory fees?
        • Fees terminology
        • Regulatory fee management
        • European regulatory fees
        • Compliance obligations
        • WEEE directive requirements
        • Copyright directive requirements
        • Compliance challenges
      • Managing regulatory fees
  • Customer management
    • Customer basics
    • Creating and updating customers
    • Setting up tax exemptions
    • Recording a customer's request to be forgotten
  • Financial reporting
    • Financials basics
    • Sales transactions
      • Returning a list of sales transactions
      • Getting a sales transaction by ID
    • Sales summaries
      • Returning a list of sales summaries
      • Getting a sales summary by ID
    • Payouts
      • Returning a list of payouts
      • Getting a payout by ID
      • Get a list of transactions included in payout by ID
  • Developer resources
    • Digital River API reference
    • DigitalRiver.js reference
      • Including DigitalRiver.js
      • Initializing DigitalRiver.js
      • DigitalRiver object
      • Elements
        • Amazon Pay element
        • Apple Pay elements
        • Google Pay elements
        • IBAN element
        • iDEAL element
        • Konbini elements
        • Compliance element
        • Offline Refund elements
        • Online Banking elements
        • Tax Identifier element
        • Invoice attribute element
        • Delayed Payment Instructions element
        • PayPal elements
      • Guidelines for capturing payment details
      • Security
      • Digital River payment objects
      • Error types, codes, and objects
    • DigitalRiverCheckout.js reference
      • Including DigitalRiverCheckout.js
      • Initializing DigitalRiverCheckout.js
        • DigitalRiverCheckout configuration object
      • DigitalRiverCheckout object
        • Configuring Prebuilt Checkout
          • Performing actions
          • Defining experience
        • Components
          • Configuring components
          • Address component
          • Shipping component
          • Tax identifier component
          • Invoice component
          • Wallet component
          • Payment component
          • Compliance component
          • Order summary component
          • Thank you component
        • Rendering a checkout button
          • Performing actions on the checkout button
        • Determining the checkout's status
      • Accessing country and currency
    • DynamicPricing.js reference
    • Postman collection
  • administration
    • Sign in
    • Digital River Dashboard
      • Digital River Dashboard quick start guide
      • Key features
      • Reset your password
      • Test and production environments
      • Account
        • Adding an account
        • Switching accounts
        • Account access
      • Profile settings
        • Viewing your personal information
        • Changing your password
        • Updating your phone number
        • Enabling multi-factor authentication
      • Finance
        • Payouts
          • Viewing your payout details
          • Filtering your payouts
          • Exporting your payouts
        • Sales summaries
          • Viewing your sales summaries details
          • Filtering your sales summaries
          • Exporting your sales summaries
          • Exporting your sales summary details
        • Transactions
          • Viewing your transaction details
          • Filtering your transactions
          • Exporting your transactions
      • Order management
        • Orders
          • Searching for orders
          • Filtering your orders
          • Viewing the order details
          • Cancelling items
          • Fulfilling items
          • Downloading an invoice
          • Downloading a credit memo
          • Creating shipping labels
          • Recording a customer's request to be forgotten
          • Viewing returns and refunds
          • Creating a return
          • Accepting a return
          • Creating a refund
          • Viewing the order's timeline
        • Checkouts
          • Searching for checkouts
          • Filtering your checkouts
          • Viewing the checkout details
        • Prebuilt Checkout links
          • Generate Prebuilt Checkout links
          • View and work with Prebuilt Checkout link details
          • Add a customer during Prebuilt Checkout
          • Add a product during Prebuilt Checkout
      • Customers
        • Viewing customer details
        • Searching for customers
        • Filtering your customers
        • Editing account information
        • Adding a customer
        • Tax IDs and certificates
          • Adding a tax certificate
          • Adding a tax ID
          • Deleting a tax ID
        • Metadata
          • Adding metadata
          • Editing metadata
        • Manage subscriptions from the Customer Details page
        • Disabling a customer
        • Recording a customer's request to be forgotten
        • Deleting a customer
      • Catalog
        • SKUs
          • Viewing the SKU details
          • Searching for SKUs
          • Filtering your SKUs
          • Adding a SKU
          • Editing a SKU
          • Deleting a SKU
          • Adding a fee to a SKU
          • Editing a fee
          • Deleting a fee
          • Viewing product tariff codes
        • Managing customer subscriptions from Digital River Dashboard
      • Developers
        • API keys
          • Updating your API version
          • Getting your API keys
          • Changing the API version for your key
          • Creating a restricted key
          • Editing a restricted key
          • Deleting a restricted key
          • Rotating keys
        • Webhooks
          • Creating a webhook
          • Editing a webhook
          • Deleting a webhook
          • Rotating a webhook's secret
        • API logs
          • Filtering the API log
          • Viewing the API log details
        • Event logs
          • Filtering the events log
          • Viewing the event details
      • Settings
        • Users and roles
          • Roles
          • Searching for a user by name or email
          • Filtering your users and roles
          • Adding a user
          • Editing a user
          • Deleting a user
        • Prebuilt Checkout
        • Payment methods
          • Viewing your payment methods
          • Viewing payment method details
            • Enabling currencies
            • Managing countries
          • Enabling or disabling a payment method
  • General Resources
    • eCompass
    • eCompass documentation
    • Release notes
      • 2024
      • 2023
      • 2022
      • 2021
      • 2020
      • 2019
    • Standards and certifications
      • Certification process
      • Compliance requirements
      • Documentation requirements
      • Integration checklists
        • Admin portal
        • Products and SKUs
        • Customers and tax exemptions
        • Checkouts, payment sources, and orders
        • Disclosures, compliance statements, and emails
        • Fulfillments and cancellations
        • Customer portal
        • Order refund synchronization
        • Reversals
        • Error handling
      • Test and use cases
    • Commerce infrastructure
    • Versioning
    • Glossary
Powered by GitBook
On this page
  • Activating a subscription
  • Fulfilling the acquisition
  • Notifying customers of a subscription acquisition
  • Renewing subscriptions
  • Sending a reminder
  • Handling successful renewals
  • Handling failed renewals
  • Trial subscription management
  • Activating trial subscriptions
  • Handling trial conversions
  • Ending trial subscriptions
  • Extending free trial periods
  • Reverting to a free subscription
  • Modifying subscription payments
  • Update credit card information
  • Replace an existing source with a new source
  • Replace an existing source with a saved source
  • Cancelling subscriptions
  • Deleting subscriptions
  • Updating plans
  • Ending subscription reminders
  • Updating subscriptions
  • Handling chargebacks
  1. Subscription Management

Managing a subscription

If you're using Digital River's subscription service, gain a better understanding of how to manage subscriptions after the acquisition process is complete

PreviousDistributor modelNextManaging an external subscription

Last updated 2 months ago

If you're using , you must manage the subscription after completing the acquisition checkout process. On this page, you'll find information on how to:

Activating a subscription

After the moves to accepted, you can activate a . To do this, retrieve each items[].subscriptionInfo.subscriptionId from the of the with a of and send it as a path parameter in a .

If you're using the checkout solution, you could also get each items[].subscriptionInfo.subscriptionId from the body of the response.

In the body of the request, set state to active.

curl --location --request POST 'https://api.digitalriver.com/subscriptions/DR_3ce5dc58-6bba-4ee2-b8d1-e1b974a4fe93' \
...
--data-raw '{
    "state": "active"
}'

No other values can be sent in the body of this request. If you attempt to do so, then the following error is returned:

{
    "type": "conflict",
    "errors": [
        {
            "code": "restricted_update",
            "parameter": "metadata",
            "message": "Additional data cannot be updated when updating state to active."
        }
    ]
}
{
    "id": "47ce1ba0-a548-40a2-a601-a43c41fbe68f",
    "contractBindingUntil": "2023-02-09T17:40:56Z",
    "createdTime": "2022-02-09T17:40:21Z",
    "updatedTime": "2022-02-09T17:40:56Z",
    "stateTransitions": {
        "activated": "2022-02-09T17:40:56Z"
    },
    "billingAgreementId": "8f1ef7b9-e5c5-46d1-ac14-1c9d566f0f57",
    "customerId": "562799360336",
    "sourceId": "1fc4353a-e1ab-476b-8ebd-db181c1a21a7",
    "taxInclusive": false,
    "currency": "USD",
    "planId": "82cbf763-fa27-401a-aa69-5e6640539ce7",
    "state": "active",
    "items": [
        {
            "price": 100.0,
            "skuId": "865a15d2-4e00-4c09-8813-7b82a078491b",
            "quantity": 1
        }
    ],
    "currentPeriodEndDate": "2022-03-09T17:40:56Z",
    "nextInvoiceDate": "2022-03-04T17:40:56Z",
    "nextReminderDate": "2022-02-27T17:40:56Z",
    "liveMode": false
}

Fulfilling the acquisition

Notifying customers of a subscription acquisition

Renewing subscriptions

Sending a reminder

In invoice.items[].productDetails you can access the subscription's product data (such as name, description, image, and url) and pass this information to customers in the notification, informing them of what they're being billed for.

This is a reminder that your invoice.description subscription is set to renew on or after nextInvoiceDate. To ensure that your subscription continues without interruption, your creditCard.brand credit card ending in creditCard.lastFourDigits will be charged invoice.totalAmount in invoice.currency .

For digital services (such as SaaS), you might also want to include the date and time that customers activated their subscription:

You activated your subscription via our online store on stateTransitions.activated.

Handling successful renewals

You could handle subscription.extended by calling a function that moves the subscription in your system into a ready to fulfill state and then initiates the fulfillment process.

  • name and image in items[].productDetails: Reminds customers what products and/or services are included in the subscription.

  • totalAmount and totalTax: Informs customers how much they were charged and taxed. The event also contains similar amounts at the items[]-level.

Handling failed renewals

Invalid sources and lapsed subscriptions

Payment failures

  • Informs customers of the failed payment capture attempt. For example: We were unable to charge your creditCard.brand ending in creditCard.lastFourDigits.\

  • Provide your contact information. For example: If you have any questions, visit our support site at <web address>, contact us at <email address>, or call <phone number>.

If customers click the link, redirect them to a page where they can provide a new payment method.

curl --location --request POST 'https://api.digitalriver.com/subscriptions/9a1f34b3-a5f5-4c5d-ab04-9a021b97a26d' \
...
--header 'Authorization: Bearer <Your secret API key>' \
...
--data-raw '{
	"sourceId": "19f15727-0712-473a-8b78-cc627efc0dfc"
}'

Before the next billing attempt, Digital River will void the invoice we couldn't collect and create a new one using the subscription's updated source.

Subscription failures

For example, the notification might:

  • Inform customers of the failed renewal. Despite repeated attempts, we were unable to charge your designated payment method, and as a result, your subscription has been deactivated. \

  • Provide your contact information. If you have any questions, visit our support site at <web address>, contact us at <email address>, or call <phone number>.

Trial subscription management

In this section, you'll find information on:

Activating trial subscriptions

curl --location --request POST 'https://api.digitalriver.com/subscriptions/124eeee4-6cf4-40e9-94a6-cba64798fc42' \
...
--data-raw '{
	"state": "active"
}'
Subscription
{
    "id": "124eeee4-6cf4-40e9-94a6-cba64798fc42",
    "contractBindingUntil": "2022-02-18T15:03:12Z",
    "createdTime": "2022-02-11T15:01:31Z",
    "updatedTime": "2022-02-11T15:03:12Z",
    "stateTransitions": {
        "activatedFree": "2022-02-11T15:03:12Z"
    },
    "billingAgreementId": "6e4d986e-c054-43e0-a233-d6c1e9f60765",
    "customerId": "563089630336",
    "sourceId": "8687447b-a04d-4838-af6c-0de0810f23a7",
    "taxInclusive": false,
    "currency": "USD",
    "planId": "186cf07e-a1ea-4ec0-9d9a-8aa93b3af43a",
    "locale": "en_US",
    "state": "activeFree",
    "items": [
        {
            "price": 0.0,
            "skuId": "sku_3e5ab173-d52e-4d9e-8888-2a00f6bb188e",
            "quantity": 2
        }
    ],
    "currentPeriodEndDate": "2022-02-18T15:03:12Z",
    "nextInvoiceDate": "2022-02-18T15:03:12Z",
    "nextReminderDate": "2022-02-15T15:03:12Z",
    "liveMode": false
}

Updating the subscription's price and plan

POST/ subscriptions/{subscriptionId}
curl --location --request POST 'https://api.digitalriver.com/subscriptions/124eeee4-6cf4-40e9-94a6-cba64798fc42' \
...
--data-raw '{
    "planId": "f55d07a2-a78f-406a-b6c6-ad8e1cc1531b",
    "items": [
        {
            "price": 29.95,
            "skuId": "sku_3e5ab173-d52e-4d9e-8888-2a00f6bb188e",
            "quantity": 2
        }
    ]
}'
Subscription
{
    "id": "124eeee4-6cf4-40e9-94a6-cba64798fc42",
    "contractBindingUntil": "2022-02-18T15:03:12Z",
    "createdTime": "2022-02-11T15:01:31Z",
    "updatedTime": "2022-02-11T15:05:08Z",
    "stateTransitions": {
        "activatedFree": "2022-02-11T15:03:12Z"
    },
    "billingAgreementId": "6e4d986e-c054-43e0-a233-d6c1e9f60765",
    "customerId": "563089630336",
    "sourceId": "8687447b-a04d-4838-af6c-0de0810f23a7",
    "taxInclusive": false,
    "currency": "USD",
    "planId": "f55d07a2-a78f-406a-b6c6-ad8e1cc1531b",
    "locale": "en_US",
    "state": "activeFree",
    "items": [
        {
            "price": 29.95,
            "skuId": "sku_3e5ab173-d52e-4d9e-8888-2a00f6bb188e",
            "quantity": 2
        }
    ],
    "currentPeriodEndDate": "2022-02-18T15:03:12Z",
    "nextInvoiceDate": "2022-02-18T15:03:12Z",
    "nextReminderDate": "2022-02-15T15:03:12Z",
    "liveMode": false
}

Handling trial conversions

Sending a free trial expiration reminder

Sending a trial conversion notification

Ending trial subscriptions

Extending free trial periods

Reverting to a free subscription

Modifying subscription payments

curl --location --request GET 'https://api.digitalriver.com/subscriptions?customerId=f9acfc5b-42de-4807-8248-eb1cb8069a04' \
--header 'Authorization: Bearer <Secret API key>' \
...
{
    "hasMore": false,
    "data": [
        {
            "id": "eabd010b-26f5-44e7-a91d-1b3e23198310",
            "contractBindingUntil": "2022-03-02T16:15:15Z",
            "createdTime": "2022-01-31T16:14:10Z",
            "updatedTime": "2022-01-31T16:15:15Z",
            "stateTransitions": {
                "activatedFree": "2022-01-31T16:15:15Z"
            },
            "billingAgreementId": "fbeabcdd-52d4-48a9-9437-5b4ccf6f8df1",
            "customerId": "f9acfc5b-42de-4807-8248-eb1cb8069a04",
            "sourceId": "596245ab-8479-4df4-ae1c-853ed0e11073",
            "taxInclusive": false,
            "currency": "USD",
            "planId": "2919a6a2-c3ab-4a5b-8a6a-8f8a72a177a5",
            "locale": "en_US",
            "state": "activeFree",
            "items": [
                {
                    "price": 0.0,
                    "skuId": "7eee0e8c-b08e-4b9b-b241-8ba4e2a5876a",
                    "quantity": 1
                }
            ],
            "currentPeriodEndDate": "2022-04-28T16:15:15Z",
            "nextInvoiceDate": "2022-04-28T16:15:15Z",
            "nextReminderDate": "2022-04-27T16:15:15Z",
            "liveMode": false
        }
    ]

Update credit card information

{
    "id": "f9f73fd2-b56d-40d2-92fe-de4987671c34",
    ...
    "sourceId": "26ab35a7-64f7-4cf5-82e6-18cc444cd993",
    ...
    "state": "activeFree",
    ...
}
{
    "id": "26ab35a7-64f7-4cf5-82e6-18cc444cd993",
    "createdTime": "2022-02-11T15:44:33Z",
    "type": "creditCard",
    "currency": "USD",
    "amount": 7.0,
    "reusable": true,
    "state": "chargeable",
    "customerId": "563089660336",
    "owner": {
        "firstName": "Digital",
        "lastName": "Development",
        "email": "testdummy@digitalriver.com",
        "address": {
            "line1": "10380 Bren Road West",
            "city": "Minnetonka",
            "postalCode": "55343",
            "state": "MN",
            "country": "US"
        },
        "organization": "DR",
        "additionalAddressInfo": {
            "neighborhood": "Centro"
        }
    },
    "clientSecret": "26ab35a7-64f7-4cf5-82e6-18cc444cd993_4a4be490-2c12-4978-af07-3b2b6b184ba5",
    "creditCard": {
        "brand": "Visa",
        "expirationMonth": 3,
        "expirationYear": 2030,
        "lastFourDigits": "1111"
    },
    "liveMode": false
}

Billing address information

If customers edit their billing information, present them with a form to enter the full name, email, and address (line 1, line 2, city, state, country, postal code) associated with the credit card.

Card expiration date

Configuring the update source method

Replace an existing source with a new source

When customers want to change how they pay for a subscription, you can allow them to supply a new payment method.

The customer's billing information must be collected and stored first in both cases.

let digitalriverpayments = new DigitalRiver("pk_hc_a209389e4588433bb6e00b32466b82c3", {
    "locale": "en_GB"
});
                        
let configuration = {
    "options": {
        "flow": "managePaymentMethods",
        "showComplianceSection": true,
        "showTermsOfSaleDisclosure": true,
        "usage": "subscription"
    },
    "billingAddress": {
        "firstName": "John",
        "lastName": "Doe",
        "email": "test@test.com",
        "phoneNumber": "952-253-1234",
        "address": {
            "line1": "16 Byward St",
            "city": "London",
            "state": "England",
            "postalCode": "EC3R 5BA",
            "country": "GB"
        }
    },
    ...
}
                                    
let dropin = digitalriverpayments.createDropin(configuration);
dropin.mount("drop-in-container");
{
    "paymentMethodTypes": [
        "creditCard",
        "payPalBilling"
    ]
}

Each payment method and its disclosures will appear in the window. If customers click the button without accepting these agreements and terms, Drop-in blocks the transaction from proceeding.

  • Use the billing address country you collect from customers to set country

  • Both supportsStorage and supportsRecurring should be true

...
digitalriver.retrieveAvailablePaymentMethods({
    "currency": "EUR",
    "country": "FR",
    "supportsStorage": true,
    "supportsRecurring": true
}).then(function(result) {
    //do something with the result, this could include showing or hiding specific payment methods that are applicable to the display
});
...

If the request is successful, the response contains the transaction's eligible payment methods:

[
    {
        "type": "creditCard",
        "flow": "standard",
        "supportsRecurring": true,
        "supportsFreeTrial": true,
        "images": {
            "iconImage": "https://ui1.img.digitalrivercontent.net/Storefront/images/paymentMethodLogos/creditcard.png"
        },
        "supportsStorage": true,
        "defaultMandate": {
            "terms": "Yes, please save this account and payment information for future purchases."
        },
        "displayName": "Credit Card",
        "localizedDisplayName": "Credit Card"
    },
    {
        "type": "payPalBilling",
        "flow": "redirect",
        "supportsRecurring": true,
        "supportsFreeTrial": true,
        "images": {
            "iconImage": "https://ui1.img.digitalrivercontent.net/Storefront/images/paymentMethodLogos/paypalBilling.png"
        },
        "supportsStorage": true,
        "defaultMandate": {
            "terms": "Yes, please save this account and payment information for future purchases."
        }
        "displayName": "PayPal Billing",
        "localizedDisplayName": "PayPal"
    },
    {
        "type": "googlePay",
        "flow": "standard",
        "supportsRecurring": true,
        "supportsFreeTrial": true,
        "images": {
            "iconImage": "https://ui1.img.digitalrivercontent.net/Storefront/images/paymentMethodLogos/googlepay.png"
        },
        "supportsStorage": true,
        "defaultMandate": {
            "terms": "Yes, please save this account and payment information for future purchases."
        },
        "displayName": "Google Pay",
        "localizedDisplayName": "Google Pay"
    }
]

For each available payment method:

  • Retrieve defaultMandate.terms and display that text with some sort of acceptance control. Your code should be written so that customers must accept these terms before the transaction can proceed.

  • Set type to the payment method selected by the customer

  • Use that payment method's defaultMandate.terms to set mandate.terms

var payload = {
    "type": "creditCard",
    "futureUse": true,
    "usage": "subscription",
    "billingAddress": {
        "firstName": "John",
        "lastName": "Doe",
        "email": "test@test.com",
        "phoneNumber": "952-253-1234",
        "address": {
            "line1": "16 Byward St",
            "city": "London",
            "state": "England",
            "postalCode": "EC3R 5BA",
            "country": "GB"
        }
    },
    ...
    "mandate": {
        "terms": "Yes, please save this account and payment information for future purchases."
    }
}

digitalriver.createSource(payload).then(function(result) {
    if (result.error) {
        //handle errors
    } else {
        var source = result.source;
        //send source to back end
        sendToBackend(source);
    }
});
curl --location --request POST 'https://api.digitalriver.com/subscriptions/b8dc06d6-941e-483c-89a1-263874bff3b4' \
...
--data-raw '{
	"sourceId": "e4adbcac-1551-4743-9a3e-48dc3883241b"
} 

If you receive a 200 OK, notify customers that their subscription's designated payment method has been successfully updated.

Replace an existing source with a saved source

{
    "id": "533319260336",
    "createdTime": "2021-05-06T21:51:08Z",
    "email": "jackdoe@digitalriver.com",
    "shipping": {
        "address": {
            "line1": "123 Boulevard",
            "city": "Saint Paul",
            "postalCode": "55155",
            "state": "MN",
            "country": "US"
        },
        "name": "John Doe",
        "phone": "555-555-5555"
    },
    "defaultSourceId": "5e359d60-1d23-4234-84ee-e1c9b3ed7edc",
    "sources": [
        {
            "id": "19f47eba-418f-41b3-882c-462e335770e7",
            "createdTime": "2022-03-30T21:14:05Z",
            "type": "payPalBilling",
            "currency": "USD",
            "amount": 27.01,
            "reusable": true,
            "state": "chargeable",
            "owner": {
                "firstName": "Maya",
                "lastName": "Brown",
                "email": "null@digitalriver.com",
                "address": {
                    "line1": "10381 Bren Rd W",
                    "city": "Minnetonka",
                    "postalCode": "55343",
                    "state": "MN",
                    "country": "US"
                }
            },
            "paymentSessionId": "46206596-6559-4f86-9f27-2ccb4d0cc677",
            "clientSecret": "19f47eba-418f-41b3-882c-462e335770e7_cc871d23-474d-4a3f-9803-4e98fa39f2ee",
            "payPalBilling": {
                "token": "12345",
                "payerId": "payerId",
                "payerStatus": "verified",
                "redirectUrl": "https://api.digitalriver.com:443/payments/redirects/b9cd5136-8da3-4e00-97af-8b5fe4b70fdf?apiKey=pk_test_da4311e7b7384b7caf5384fb79808192",
                "returnUrl": "http://mypage.com",
                "offline": false
            }
        },
        {
            "id": "1e80940d-33d2-43d8-89c1-09c8076b2654",
            "createdTime": "2021-05-19T19:35:47Z",
            "type": "creditCard",
            "reusable": true,
            "state": "chargeable",
            "owner": {
                "firstName": "William",
                "lastName": "Brown",
                "email": "null@digitalriver.com",
                "address": {
                    "line1": "10381 Bren Rd W",
                    "city": "Minnetonka",
                    "postalCode": "55343",
                    "state": "MN",
                    "country": "US"
                }
            },
            "clientSecret": "1e80940d-33d2-43d8-89c1-09c8076b2654_3ada8e16-3938-4495-af72-5f793ff649c8",
            "creditCard": {
                "brand": "Visa",
                "expirationMonth": 7,
                "expirationYear": 2027,
                "lastFourDigits": "1111"
            }
        },
        ...
}
curl --location --request POST 'https://api.digitalriver.com/subscriptions/b8dc06d6-941e-483c-89a1-263874bff3b4' \
...
--data-raw '{
	"sourceId": "e4adbcac-1551-4743-9a3e-48dc3883241b"
} 

If you receive a 200 OK, notify customers that their subscription's designated payment method has been successfully updated.

Cancelling subscriptions

curl --location --request POST 'https://api.digitalriver.com/subscriptions/895554f1-0568-4387-8405-551ddb533ff8' \
...
--data-raw '{
        "state": "cancelled"
}'

No other values can be passed in the body of a cancellation request. If you attempt to do so, the following error is returned:

{
    "type": "conflict",
    "errors": [
        {
            "code": "restricted_update",
            "parameter": "metadata",
            "message": "Additional data cannot be updated when updating state to cancelled."
        }
    ]
}

Deleting subscriptions

Only subscriptions whose state is draft can be deleted. If you attempt to delete a non-draft subscription, then the following error is thrown:

409 Conflict
{
    "type": "conflict",
    "errors": [
        {
            "code": "invalid_state",
            "parameter": "state",
            "message": "Subscription c090749a-8f8f-43a5-8e9c-9b434a710b1c is active, so it cannot be deleted."
        }
    ]
}Java

Deactivating a plan terminates all subscriptions that belong to that plan.

Updating plans

Ending subscription reminders

curl --location 'https://api.digitalriver.com/plans/490bf585-26e0-4413-9263-ed68af3a6cc3' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <Secret API key>' \
...
--data '{
  "reminderOffsetDays": -1
}'
{
    "id": "818c1ab7-5970-4dba-a49e-6e0a394c321a",
    "createdTime": "2024-01-22T16:27:25Z",
    "updatedTime": "2024-01-24T19:36:48Z",
    "terms": "Terms of the plan",
    "contractBindingDays": 365,
    "interval": "week",
    "intervalCount": 1,
    "name": "A plan to manage subs that bill once per week",
    "billingOptimization": true,
    "billingOffsetDays": 1,
    "collectionPeriodDays": 1,
    "state": "active",
    "stateTransitions": {
        "activated": "2024-01-22T16:27:25Z"
    },
    "metadata": {
        "key1": "value1",
        "key2": "value2"
    },
    "liveMode": false
}

Updating subscriptions

Associated plan

Associated payment source

SKUs and product details

In an update subscription request, you can either pass items[].skuId or items[].productDetails.

A common use case for this operation is when upgrading or downgrading a customer's subscription service. For example, customers might want to migrate from basic to professional offerings.

Price

Digital River's standardized autorenewal terms allow you to make price or aggregatePrice changes to any of a subscription's line items. You must, however, provide customers advance notification (typically by email) of the change, along with instructions on how to cancel the subscription if they don't agree to the price increase.

Quantity

For each of a subscription's items[] , the default quantity is 1. So, unless you specify quantity when updating a line item in a subscription, its value is automatically set to 1 .

Any updates to quantity typically require the customer's consent.

Handling chargebacks

You can activate a subscription any time after an state moves to accepted. For example, if you're selling a digital service subscription that requires no provisioning, you might build your integration so that the activation request is immediately submitted. In other scenarios, such as when a customer must install and initialize a device, you may decide to build a delay into the activation process.

When you activate the subscription, we search the acquisition for the , retrieve its identifier, and assign that value to sourceId in the . We will on the and attempt to using this reusable source.

After activation, the following are populated: contractBindingUntil, nextReminderDate, currentPeriodEndDate, nextInvoiceDate, and activated.

Every subscription contains a billingAgreementId that references a . For compliance purposes, we continue to associate this billing agreement with the subscription throughout the .

Once the state is , you should fulfill the goods and then .

Once a subscription is successfully acquired, you can use the with a of to trigger an .

On a , make sure you . Your integration should also handle both and billing attempts.

Before attempting to collect a recurring payment, our subscription service determines whether the necessary preconditions are met. If they are, the service opens a and, on the subscription's, creates an with a of .

You can configure when you receive this event by setting the plan's .

The event's contains the along with an .

Use the event's data to obtain the customer's contact information and populate your . This notification (typically an email) should include the subscription's name and a description of its goods, the amount the customer will be charged, and the upcoming billing date.

The article (refer to for access information) includes a complete list of renewal reminder requirements.

For details, refer to .

There are numerous ways to build your notification. However, we suggest converting any into a more human-readable form. The following are some (partial) examples of what you might add:

Additionally, we suggest you use the reminder event to determine whether the subscription's designated credit card will expire before the . If this is the case, remind customers to update their payment information and provide a link to the appropriate page on your site. For example:

We noticed that your credit card ending in lastFourDigits is set to expire expirationMonth , expirationYear. This expiration date is prior to your next recurring payment on nextInvoiceDate. To avoid disruptions to your subscription, please visit your and update your payment information.

To be notified of a successful billing attempt, to listen for the with a of .

The event's contains the along with the used to capture. Since settlement has successfully occurred, the invoice's is paid.

The event should also trigger a sent to the customer. The following is a partial list of the data you might retrieve from the event and pass in this notification:

orderId: Gives customers access to the identifier of the transaction's .

nextInvoiceDate: Provides customers with the date of the .

payment.sources[]: Contains data that you can share with customers so they have basic information on the payment method funding the subscription.

The article (refer to for access information) provides a comprehensive list of the information you must include in the renewal notification.

To be notified of renewal problems, you can to listen for:

If Digital River can't create a billing because there's a problem with the saved (in the case of credit cards, this is often an invalid expiration date), then we create an with a of .

We recommend handling it by informing shoppers that their subscription is at risk of cancellation, requesting a different payment method from them, and then, assuming they provide this information, .

If you don't make this update during the grace period (i.e., the of the subscription’s ), then Digital River moves the subscription’s to lapsed and creates .

Since this is a terminal state, reactivating the isn't possible, so you'll likely want to discontinue customers' access to the service and provide instructions on restoring it.

An with a of indicates that Digital River's failed to .

The event's contains both the subscription and the invoice.

The most likely stems from changes to the subscription's . For example, if a funds a subscription, its billing address could have changed, the customer might have cancelled it, or it might have reached its credit limit.

However, since the of the remains activePendingInvoice, you might still be able to collect payment.

Whatever the structure of your , we recommend you handle by using the event's data.object to construct a that:

Provides a link to a page on your site where customers can resolve the issue. For example: To avoid disruptions to your subscription, please visit your .\

For details, refer to on the page.

Once you create a new or , you must .

You'll also need to pass the source's identifier in the body of an .

An with a of indicates that our autorenewal service could not during the . As a result, the has become uncollectible and the has moved into a terminally state.

We recommend you handle by setting the subscription status in your system to failed as well.

You should also that allows them to reactivate their subscription. If customers select this option, you'll need to take them through the acquisition process again.

Provide a link to the page on your site where customers can resolve the issue. To reactivate your subscription, please visit your . \

You can use the same process to activate both trial and non-trial subscriptions. For details, refer to .

Once activated, a free trial subscription's transitions from draft to activeFree and the activatedFree timestamp is populated.

Immediately following a successful , we recommend that your integration use a POST /subscriptions/{id} to (1) update the subscription's planId so that it references a and (2) for each items[], set the price or aggregatePrice equal to the post-trial period amount that customers agreed to pay during the subscription acquisition process.

After you submit this request, the planId references the . However, until elapses, the trial period plan controls the subscription's behavior.

On the , Digital River creates an whose is and whose contains an in a state.

Assuming you updated the items[].price or items[].aggregatePrice, the invoice's totalAmount will be greater than zero and equal to the aggregated price of all the subscription's items[], plus taxes and fees calculated by Digital River.

This totalAmount is how much customers will be charged for the subscriptions , which (if you configured your correctly) should be the same as the . In other words, customers won't be charged until the free trial period is over.

You should before a trial converts to a paid subscription. After a successful conversion occurs, make sure you also .

We recommend that you use to trigger an email (or some other type of notification) to the customer. In the event's payload, currentPeriodEndDate, nextInvoiceDate, and totalAmount provide the data you need to inform customers (1) on what date their free trial is scheduled to expire, (2) when their first payment is scheduled, and (3) in what amount.

On the , Digital River moves the to and the to and then attempts to collect payment for the number of days specified by the collectionPeriodDays.

If any of these collection attempts are successful, Digital River marks the invoice as and the as , populates the activated timestamp and creates an whose is .

You should use subscription.extended as a trigger to .

If payment capture fails, the becomes , and the moves into a state. To learn more, refer to .

Customers may cancel their during its trial period to avoid getting charged. In these cases, you have two options:

If the subscription's is draft (i.e., you haven't activated it yet), you should .

If you (i.e., its state is activeFree) then .

Sometimes, you might want to extend a customer's free trial period or keep customers at a no-charge level indefinitely. To do this, after you , do not update its price. By not performing this operation, a items[] will have a price or aggregatePrice of 0.0on the nextInvoiceDate, and, as a result, Digital River doesn't make any invoice collection attempts, and the subscription's state remains activeFree.

You can also push an subscription back into an state. Offering various subscription pricing tiers is useful, and customers can ask to downgrade their access to the basic or free level.

To do this, send a request that updates the price or aggregatePrice of each of the subscription's items[] to 0.0 and the planId to an appropriate . On the , the subscription's reverts to activeFree.

For more details on how to modify subscriptions, refer to .

When customers want to manage their subscriptions, you can associated with their record:

For each subscription, access its payment by passing sourceId in a request.

To modify a payment , its must be active, activeFree, or activePendingInvoice. If you meet this precondition, you can:

If a sourceId references a with a type of creditCard, you can provide customers with the ability to update that card's billing information or expiration date.

If you want to display the card's current billing information and card information to customers, you can retrieve that data from the owner and creditCard blocks.

If customers opt to edit their credit card's expiration date, use a to provide them with an input field.

Once customers enter and save their changes, pass the submitted data to . Make sure you configure the appropriate version of the method, depending on whether customers submit updated (a) billing address information, (b) card expiration information, or (c) both. In both versions, you need to add the id and clientSecret to the method's configuration object.

How you replace a current with a new source depends on whether you're using or .

Build the createDropin() method's :

In , set:

to managePaymentMethods

to subscription

to true

to true

Since this is an , you can't use the checkout's to set sessionId. As a result, you must pass the billing information you collect from customers in .

Pass the configuration object to . If the request is successful, the event contains the transaction's eligible payment methods:

If customers accept the terms, submit their information, and the resulting create source request is successful, the event contains a that is and .

For more details, refer to the and the .

Configure using the following filters:

Set currency to the same value as the currency

to collect the customer's sensitive payment information.

When customers submit their information, configure and call the method:

Set to subscription and futureUse to true

Since this is an , you can't provide a checkout's . As a result, you must pass the billing information you collect from customers in billingAddress.

If the create source request is successful, the response contains a that is and .

For more details, refer to the .

Send the , , and identifiers to your backend.

Use a to attach the source to the customer. It flips the source's attribute to true.

To update the subscription, send its identifier as a path parameter in a . In the body of the request, specify the new sourceId.

When customers want to change how they pay for a subscription, you can give them the option of selecting one of their saved payment .

To access these sources, send the identifier in a request. From the response, you can retrieve any of the sources[], since, by default, they're all and .

Use a selection control to display these saved sources to customers. With credit cards, you can retrieve brand, expirationMonth, expirationYear, and lastFourDigits and display this information to customers so they can identify the card. If the customer uses a saved , retrieve its unique identifier.

To , send its identifier as a path parameter in a and, in the request body, specify the selected sourceId.

When you either (1) receive a request from the customer to cancel a subscription, and the request adheres to the terms of the agreement (or you grant the customer a waiver), or (2) you decide to cancel the subscription, send a with state set to cancelled in the request's payload.

Only active , activeFree, and activePendingInvoice subscriptions can be cancelled. When you cancel an subscription, the underlying invoice is moved into a state.

A successful cancellation request returns a 200 OK, moves the subscription into a state and prevents billing from occurring on the .

On your site's subscription management page, include a cancellation button that, when clicked, sends this cancellation request to Digital River. When you receive a successful response, send the customer a and indicate that no future billing will occur.

To delete a subscription, retrieve its unique identifier, and pass it as a path parameter in a request.

A successful request results in the creation of an with a of .

If you want to stop recurring payments on an , you can or .

changes the behavior of all the it controls. As a result, we generally recommend only using the POST /plans/{planId} operation to optimize or phase it out.

For details on how changing a state affects a , refer to .

To stop renewal reminders from getting generated on a , you need to by assigning a negative integer to .

When a on that moves into its next billing period, Digital River deletes its . As a result, the with a of does not get created.

If you make this update to a reminderOffSetDays, then the billing behavior of all of its remains unchanged.

A request allows you to both and as well as make updates to any of its following attributes:

A successful request results in the creation of an with a of .

For details on handling subscription updates in free trials, refer to in the section.

To successfully update a , its must be draft, active, activeFree, or activePendingInvoice.

When Digital River opens an invoice on , we move the subscription's state to activePendingInvoice and implement a blackout period. As a result, any updates you make to the subscription during this period won't take effect until the next billing cycle.

Therefore, performing a or can't be used to identify a subscription's current state. Instead, these requests return the scheduled settings for the next renewal.

In most cases, if you make a subscription update, we recommend you notify customers (typically by email) of the change. In the email, include a link to the customer's subscription management page, and on that same page, make sure you install a cancellation button that, when clicked, sends a to Digital River.

If you want to modify the timing of a subscription's , when billing is initiated, or the length of the payment collection period, you must associate the subscription with a different planId. If you move an active subscription to a different , the new settings are applied to future billing periods.

Always acquire the customer's consent before changing a subscription's billing frequency. In most cases, we recommend you create a new subscription. Since billing frequency is defined by a plan's , and these attributes can't be modified in a , you'd need to associate the subscription with a different plan, which can potentially cause issues.

For example, you might have a subscription on an annually renewing plan. If you use a to associate the subscription with a different, monthly-billing plan, then the subscription will remain on its current annual plan until the end of the . Not until that point will the subscription switch to the monthly plan.

For details, refer to the section.

For details, refer to or .

When any of your receive an whose is , parse its payload to determine whether the contains a subscriptionId. If it does, you should cancel the subscription to avoid further chargebacks and fees.

account management page
source
configure a webhook(s)
event
payment source
credit card
account management page
account management page
Drop-in payments integration guide
Drop-in payments builder tool
DigitalRiver.js Quick start guide
Managing SKUs
Using product details
Invalid sources and lapsed subscriptions
Payment failures
Subscription failures
updating the subscription's source
Activating trial subscriptions
Handling trial conversions
Ending trial subscriptions
Extending free trial periods
Reverting to a free subscription
Activating a subscription
send customers an expiration reminder
send a conversion notification
activated the subscription
cancel the subscription
Updating subscriptions
Update basic credit card information
Replace the existing source with a new source
Replace the existing source with a saved source
Associated plan
Payment source
SKUs and product details
Product price
Product quantity
updating the subscription's price and plan
Trial management
subscription cancellation request
Modifying subscription payments
data.object
Digital River's subscription service
Direct Integrations
Activate the subscription
Fulfill the goods
Notify customers of a successful acquisition
Renew subscriptions
Manage trial subscriptions
Modify a subscription's payment source
data.object
type
PSD2 and SCA
submit the payment capture request
event
type
Subscription Notifications
configure a webhook
event
type
Subscription Notifications
source
event
type
event
type
dunning process
Building payment workflows
event
type
Drop-in payments
DigitalRiver.js with Elements
event
type
event
type
webhook endpoints
order.chargeback
type
send a renewal reminder to customers
successful
failed
activation request
Handling failed renewals
delete the subscription
activate the subscription
update the subscription
activated subscription
cancel the subscription
activate a subscription
cancel a subscription
renewal reminder event
type
data.object
data.object
type
data.object
type
type
How Digital River returns product data
event
accepted
billing agreement
Learning tools
Learning tools
chargeable
chargeable
reusable
chargeable
reusable
renewal reminder notification
renewal confirmation message
send customers a failure notification
notify customers that the trial has been converted into a paid subscription
subscription cancellation confirmation email
acquisition confirmation notification
billing failed notification
paid period plan
deactivate its plan
paid period plan
trial period plan
trial period plan's
configuration object
options
flow
usage
showTermsOfSaleDisclosure
showComplianceSection
createDropin()
onReady
date-time values
order's
key subscription attributes
subscription's lifecycle
order's
subscription's
nextReminderDate
reminderOffsetDays
subscription
invoice
nextInvoiceDate
subscription
invoice
payment
state
order
next billing attempt
subscription
state
subscription
update subscription request
state
subscription's
currentPeriodEndDate
subscription's
nextInvoiceDate
currentPeriodEndDate
nextInvoiceDate
invoice
open
subscription
activePendingInvoice
invoice
uncollectible
subscription
failed
subscription
state
subscription's
active
activeFree
POST /subscriptions/{id}
plan
nextInvoiceDate
state
retrieve a list of subscriptions
source
GET /sources/{sourceId}
subscription's
source
state
subscription's
source
source's
subscription's
source
onSuccess
readyForStorage
source
subscription's
readyForStorage
source
source
customer
subscription
POST /customers/{customerId}/sources/{sourceId}
POST /subscriptions/{subscriptionId}
sources
customer's
GET /customers/{customerId}
source
POST/ subscriptions/{subscriptionId}
POST /subscriptions/{subscriptionId}
activePendingInvoice
open
void
cancelled
nextInvoiceDate
draft
DELETE /subscriptions/{id}
Updating a plan
subscriptions
plan's
subscription
Lifecycle of a plan
subscription
update its plan
reminderOffSetDays
plan's
subscriptions
POST /subscriptions/{subscriptionId}
subscription
state
nextInvoiceDate
GET /subscriptions
GET /subscriptions/{id}
plan
interval and intervalCount
POST /plans/{planId}
POST /subscriptions/{subscriptionId}
contract binding period
event
order
billingAddress
order's
state
subscription
event
POST /subscriptions/{subscriptionId}
POST/ orders
order
subscription object
create a charge
next invoice date
capture payment
event
draft invoice
nextReminderDate
invoice
subscription's
collectionPeriodDays
plan
state
autorenewal service
capture payment
source
capture payment
designated collection period
invoice
subscription
failed
nextReminderDate
invoice
draft
paid
subscription
active
subscription's
event
source's
subscription
plan
nextReminderDate
event
cardexpiration element
updateSource()
retrieveAvailablePaymentMethods()
Create the appropriate elements
createSource()
usage
primary payment source
authenticate an existing source
associate it with the customer
Account management flows
account management flow
payment session identifier
account management flow
payment session identifier
order.accepted
order.accepted
subscription.reminder
subscription.extended
subscription.invalid_source
subscription.lapsed
subscription.payment_failed
subscription.payment_failed
subscription.failed
subscription.failed
subscription.reminder
subscription.reminder
subscription.extended
subscription.deleted
subscription.reminder
subscription.updated