Core customer portal APIs for managing customer account settings, authentication, and portal configurations.
- Unskip a previously skipped order
Customer Portal APIs (0.0.1)
Comprehensive API documentation for the customer-facing subscription portal. These APIs enable customers to manage their subscriptions, update billing information, modify delivery schedules, and access their account details through your storefront.
Important: These APIs must be called from your shop's domain (e.g., https://www.myshop.com/apps/subscriptions/cp/api/**) and require customer authentication. Unauthenticated requests will return a 401 Unauthorized error.
Request
Reschedules the next billing date for an active subscription contract. This endpoint allows you to change when the next order will be created and processed.
Key Features:
- Updates the next billing date to the specified date
- Optionally reschedules all future orders based on the new date
- Syncs the updated date to Shopify
- Sends confirmation email to customer
The rescheduleFutureOrder Parameter:
- true (default): Updates the next billing date AND recalculates all future queued orders based on the new date. Use this to shift the entire billing schedule.
- false: Only updates the next billing date. Other queued orders remain unchanged. Use this for one-time date adjustments.
Important Notes:
- The new date must be in the future (with 10 minute grace period)
- Date is validated against the shop's timezone
- If anchor days are configured, future orders may align to those anchors
Process Flow:
- Validates the contract exists and belongs to the shop
- Validates the new date is not in the past
- Updates the billing attempt to the new date
- Syncs the updated nextBillingDate to Shopify
- If rescheduleFutureOrder=true, regenerates the queue from the new date
- Sends confirmation email to customer
- Records activity log entry
Date Format:
- Must be ISO 8601 format with timezone
- Examples:
2024-03-15T12:00:00Z,2024-03-15T12:00:00+05:30 - URL encode the date when passing as query parameter
Timezone Handling:
- The provided date is used as-is for the billing attempt
- Validation (past date check) uses the shop's configured timezone
- All dates in the response are in UTC (Z suffix)
Date Restrictions (Customer Portal Only): When called from customer portal context:
- Minimum days from today (skipDaysFromCurrentDate setting)
- Maximum days from today (billingDateRestrictToDays setting)
- External API calls bypass these restrictions
Authentication: Requires valid X-API-Key header
- https://www.myshop.com/apps/subscriptions/cp/api/subscription-contracts-update-billing-date
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PUT \
'https://www.myshop.com/apps/subscriptions/cp/api/subscription-contracts-update-billing-date?contractId=0&nextBillingDate=2019-08-24T14%3A15%3A22Z&rescheduleFutureOrder=true'{ "__typename": "SubscriptionContract", "id": "gid://shopify/SubscriptionContract/123456789", "status": "ACTIVE", "nextBillingDate": "2024-03-15T12:00:00Z", "updatedAt": "2024-02-15T10:30:00Z", "billingPolicy": { "interval": "MONTH", "intervalCount": 1 }, "customer": { "email": "customer@example.com", "displayName": "John Doe" } }
Request
Reverses a skip action on a billing attempt. The order will be restored to QUEUED status and will be processed on its scheduled date.
Important Notes:
- Only works on billing attempts with SKIPPED status
- Must be done before the scheduled billing date
- Cannot unskip after the billing date has passed
- Activity logs are created for audit trail
Use Cases:
- Customer changes their mind about skipping
- Correct accidental skip actions
- Restore delivery after resolving temporary issue
Authentication: Requires valid X-API-Key header
- https://www.myshop.com/apps/subscriptions/cp/api/subscription-billing-attempts/unskip-order/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PUT \
'https://www.myshop.com/apps/subscriptions/cp/api/subscription-billing-attempts/unskip-order/{id}?subscriptionContractId=0'Order successfully unskipped
{ "id": 0, "shop": "string", "billingAttemptId": "string", "status": "SUCCESS", "billingDate": "2019-08-24T14:15:22Z", "contractId": 0, "attemptCount": 0, "attemptTime": "2019-08-24T14:15:22Z", "graphOrderId": "string", "orderId": 0, "orderAmount": 0.1, "orderName": "string", "retryingNeeded": true, "transactionFailedEmailSentStatus": "SENT", "upcomingOrderEmailSentStatus": "SENT", "applyUsageCharge": true, "recurringChargeId": 0, "transactionRate": 0.1, "usageChargeStatus": "SUCCESS", "transactionFailedSmsSentStatus": "SENT", "upcomingOrderSmsSentStatus": "SENT", "billingAttemptResponseMessage": "string", "progressAttemptCount": 0, "orderNote": "string", "variantList": [ { … } ], "securityChallengeSentStatus": "SENT", "orderAmountUSD": 0.1, "orderCancelReason": "CUSTOMER", "orderCancelledAt": "2019-08-24T14:15:22Z", "orderClosed": true, "orderClosedAt": "2019-08-24T14:15:22Z", "orderConfirmed": true, "orderDisplayFinancialStatus": "PENDING", "orderDisplayFulfillmentStatus": "UNFULFILLED", "orderProcessedAt": "2019-08-24T14:15:22Z", "lastShippingUpdatedAt": "2019-08-24T14:15:22Z", "inventorySkippedAttemptCount": 0, "inventorySkippedRetryingNeeded": true, "orderAttributes": [ { … } ], "partialLinesSkipped": "INVENTORY_MANAGEMENT", "orderAmountContractCurrency": 0.1 }
Request
Skips the next scheduled billing attempt for a subscription contract without requiring the billing attempt ID. Automatically finds and skips the earliest QUEUED billing attempt.
Convenience Feature:
- No need to know the specific billing attempt ID
- Automatically finds the next order
- Ideal for "skip next order" functionality in customer portals
Use Cases:
- Simple "skip next delivery" button in customer portal
- Quick skip without looking up billing attempt details
- One-click skip functionality
Authentication: Requires valid X-API-Key header
- https://www.myshop.com/apps/subscriptions/cp/api/subscription-billing-attempts/skip-upcoming-order
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PUT \
'https://www.myshop.com/apps/subscriptions/cp/api/subscription-billing-attempts/skip-upcoming-order?subscriptionContractId=0'Next order successfully skipped
{ "id": 0, "shop": "string", "billingAttemptId": "string", "status": "SUCCESS", "billingDate": "2019-08-24T14:15:22Z", "contractId": 0, "attemptCount": 0, "attemptTime": "2019-08-24T14:15:22Z", "graphOrderId": "string", "orderId": 0, "orderAmount": 0.1, "orderName": "string", "retryingNeeded": true, "transactionFailedEmailSentStatus": "SENT", "upcomingOrderEmailSentStatus": "SENT", "applyUsageCharge": true, "recurringChargeId": 0, "transactionRate": 0.1, "usageChargeStatus": "SUCCESS", "transactionFailedSmsSentStatus": "SENT", "upcomingOrderSmsSentStatus": "SENT", "billingAttemptResponseMessage": "string", "progressAttemptCount": 0, "orderNote": "string", "variantList": [ { … } ], "securityChallengeSentStatus": "SENT", "orderAmountUSD": 0.1, "orderCancelReason": "CUSTOMER", "orderCancelledAt": "2019-08-24T14:15:22Z", "orderClosed": true, "orderClosedAt": "2019-08-24T14:15:22Z", "orderConfirmed": true, "orderDisplayFinancialStatus": "PENDING", "orderDisplayFulfillmentStatus": "UNFULFILLED", "orderProcessedAt": "2019-08-24T14:15:22Z", "lastShippingUpdatedAt": "2019-08-24T14:15:22Z", "inventorySkippedAttemptCount": 0, "inventorySkippedRetryingNeeded": true, "orderAttributes": [ { … } ], "partialLinesSkipped": "INVENTORY_MANAGEMENT", "orderAmountContractCurrency": 0.1 }