Subscriptions Integration Guide

Last updated:August 6, 2026

This Subscription Integration guide describes how you can schedule subscription payments. Like recurring payments, the money gets auto-debited from consumer's bank account to the merchant account in fixed time periods (e.g. weekly, monthly, quarterly, yearly). Similarly, money can be auto-credited using payouts. Subscription businesses benefit from the flexibility of creating different plans and pricing structures to meet market demands.

A subscription payment can be scheduled as a pre-authorization (PA), debit (DB) or credit (CD) transaction. Consumers are not locked into the plan they started with: at any point they can move to a higher or lower value plan or a different billing frequency, and the merchant reschedules the existing subscription to match, no cancellation required.

The subscription plan, a simple journey
Plan starts
Amount & frequency
Plan changes
Upgrade, downgrade, anytime
One plan active
Checkable anytime
Recovery plan
If a payment declines
Plan ends
Cancelled

A scheduled payment can still decline, and when it does, MAC Scheduler can recover it on its own. Both plans above are ordinary SD/RS transactions, told apart only by their source field:

  • Subscription plan (source: SCHEDULER): the consumer's ongoing relationship with the merchant. Created, upgraded, downgraded, or rescheduled as many times as needed, always queryable to see which version is active right now.
  • Recovery plan (source: MACRETRY): tied to one declined payment. Created automatically when a scheduled attempt comes back with a retry-later MAC, existing only to give that payment another chance.

Different lifecycles, same intent: keep the subscription alive and recover the revenue.

See the MAC Scheduler guide for the full recovery mechanics.

To consider

Use cases

Start subscription

The merchant collects card data from the shopper and schedules a subscription payment. You can set the value of the transaction, the schedule for when the charges should occur, and the number of times the payment transaction should happen based on your subscription plan.

How it works

Store the payment data

Tokenize the customer payment information.

Schedule a payment

Send a schedule request using the token.

We execute the transaction for you

Execute the subscription payment at the scheduled time.

Optional

Review the subscription plan

Query the schedule to see the active plan.

Transactions created
RGToken registered
SDPlan created
DBFirst debit

1. Store the payment data

Collect the customer payment information via COMO World COPY&PAY or Server-to-Server. With any of the options, please consider having a card-on-file agreement with the shopper. It is best to tokenize the card during the cardholder (CIT) initiated payment so that a merchant (MIT) agreement is in place for the future subscription payments.

Sample request:

What this creates

The tokenization response returns a registrationId. Carry that id into the schedule request below, it is what links every future debit, reschedule, and cancellation back to this shopper's stored payment data.

2. Schedule a payment

Perform a server-to-server POST request with the registration id, payment type and the job schedule parameters which describes when and how often the transaction should be executed. For a complete reference of the scheduling job parameters, please check API Reference.

You can use the numerical allowed values to declare specific dates, months and days of the week for the subscription payment to be executed. The special characters allow for more advanced functionality. The table below outlines their general function and what their value means in each field.
[job.second] [job.minute] [job.hour] [job.dayOfMonth] [job.month] [job.dayOfWeek]
ValueDescriptionAllowed in
, List. Specify several values.

For example:
  • 1,3,5 OR MON,WED,FRI in the job.dayOfWeek field means the days Monday, Wednesday and Friday
  • 1,2,5 OR JAN,FEB,MAY in the job.month field means the months January, February and May
All fields
- Range. Specify a range of values.

For example:
  • 1-5 in the job.hour means the hours 1,2,3,4 and 5
  • 2-4 or MON-WED in the job.dayOfWeek means the days Monday, Tuesday and Wednesday
All fields
* Wildcard. Specify all valid values.

For example:
  • * in the job.minute means every minute
  • * in the job.hour means every hour
  • * in the job.month means every month
  • * in the job.dayOfWeek means every day of the week
All fields
? Question mark. Specify no value.

Can only be used in the dayOfMonth and dayOfWeek fields. Used when you wish to specify a particular value in one of those fields, but not the other. For example:
  • 15 in the job.dayOfMonth and ? in the job.dayOfWeek means the 15th day of the month, regardless of the day of the week
job.dayOfMonth
job.dayOfWeek
/ Step. Specify increments (value/value_to_increment).

For example:
  • 0/15 in the job.minute means the minutes 0, 15, 30 and 45
  • 3/6 in the job.hour means every 6 hours beginning of the third hour (i.e., 3, 9, 15, 21)
  • 4/3 in the job.month means every 3 months starting from April (i.e., April, July, October, January)
  • 1/5 in the job.dayOfMonth means every 5 days beginning on the first day of the month (i.e., 1, 6, 11, 16, 21, 26)
Note: Using */ means the value starts from the beginning of the respective time unit:
  • job.month=*/3: Every 3 months starting from January
  • job.minute=*/15: Every 15 minutes starting from minute 00
  • job.hour=*/6: Every 6 hours starting from hour 00
  • job.second=*/10: Every 10 seconds starting from second 00
  • job.dayOfMonth=*/5: Every 5 days starting from the 1st day of the month
This ensures job scheduling is based on the calendar time unit rather than the subscription initiation time.
All fields
L Last. Specify the last day of the month or week.

For example:
  • L in the job.dayOfMonth means the last day of the month, such as January 31 or February 28 (or 29 during a leap year)
  • 6L or FRIL in the job.dayOfWeek means the last Friday of the month
job.dayOfMonth
job.dayOfWeek
W Nearest weekday. Specify the weekday (Monday-Friday) nearest the given day.

For example:
  • 15W in the job.dayOfMonth means the nearest weekday to the 15th of the month. If the 15th is a Saturday, the payment will execute on Friday the 14th. If the 15th is a Sunday, it will execute on Monday the 16th. If the 15th is a Tuesday, then it will execute on that day.
  • 1W in the job.dayOfMonth means the nearest weekday to the 1st of the month
  • LW in the job.dayOfMonth means the last weekday of the month
job.dayOfMonth
# Weekday of the month. Specify "the nth Sun-Sat day of the month".

For example, the value of:
  • 6#3 or FRI#3 in the job.dayOfWeek means the third Friday of the month
  • 2#1 or MON#1 in the job.dayOfWeek means the first Monday of the month
  • 4#5 or WED#5 in the job.dayOfWeek means the fifth Wednesday of the month. If the month doesn't have the five Wednesdays, then no payment is executed.
job.dayOfWeek
Select trial period
Select schedule

Sample request:

3. We execute the transaction for you

The scheduled payment is executed automatically at the defined time using the stored payment information and subscription plan.

4. Review the subscription plan

Query the schedule using the schedule ID. Watch plan.active in the result: green means this plan is the active one, red means it has been replaced or cancelled.

Sample request:

Update subscription plan

A consumer can decide to change plans at any point during an active subscription, moving to a higher or lower value tier, or a more or less frequent billing cycle. Handle this with the RS (Reschedule) payment type, which updates the pricing, timing, or structure of the existing schedule in place, without cancelling it and starting over. Submit your updated plan to the /scheduling/v1/schedules/{id}/reschedule endpoint, referencing either the original schedule (SD) or your most recent reschedule (RS). Each update is recorded as a step in the same session, giving you a continuous history of how the plan has changed over time.

How it works

Reschedule an existing plan

Move the consumer to a new amount or frequency on the active schedule, without cancelling it.

We execute the transaction for you

Execute the updated subscription payment at the scheduled time.

Optional

Review the subscription plan

Query the schedule to see the updated plan.

Transactions created
SDExisting plan
RSPlan updated
DBContinues on new plan

1. Reschedule an existing plan

Submit your updated plan to the /scheduling/v1/schedules/{id}/reschedule endpoint using the RS payment type, referencing either the original schedule (SD) or your most recent reschedule (RS). The new plan takes effect immediately within the same active session, preserving the full change history without disrupting your customers' experience.

For example, a consumer on the Digital plan upgrades to Print & Digital, or asks to switch from monthly to quarterly billing. Either way, submit an RS request referencing the original schedule, no need to cancel and rebuild. You can chain multiple rescheduling requests in sequence, with each new RS referencing the previous one, for example if the consumer later downgrades again or changes frequency a second time.

Select plan
Select schedule

Sample request:

What this creates

The reschedule response returns a new id for the RS. Its plan.active becomes true, and the schedule it replaced (the original SD or an earlier RS) flips to plan.active: false, only one entry in the chain is ever the active plan at a time.

2. We execute the transaction for you

The scheduled payment is executed automatically at the defined time using the stored payment information and subscription plan.

3. Review the subscription plan

Query the reschedule ID to confirm the updated subscription plan is in effect. Watch plan.active in the result: green confirms the new plan is live, red means you're looking at a plan that has already been superseded.

Sample request:

Cancel subscription

The merchant scheduled one or multiple subscription payments. You can cancel any of the subscriptions.

How it works

Optional

List subscriptions

Send a query request to get all subscriptions active or cancelled.

Cancel the schedule

Cancel the subscription.

Transactions created
SD / RSExisting plan
DSPlan ends

1. List subscriptions

Perform a server-to-server GET request with the registration id to retrieve all scheduling records, including the original schedule (SD), any plan updates (RS), and cancellations (DS). Use this to identify the schedule ID you want to reference when cancelling.

Sample request:

What this shows

Only one record in the returned list has plan.active: true, that is the current, live plan. Reference that record's id (or any earlier SD/RS in the same chain) when you cancel.

2. Cancel the subscription

Send a de-scheduling (DS) request specifying any schedule ID belonging to the subscription, the original SD or any subsequent RS. Cancelling any one of them cancels the entire subscription and stops all future scheduled payments.

Sample request: