Core customer portal APIs for managing customer account settings, authentication, and portal configurations.
- Update billing interval for a subscription contract
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
Updates the billing frequency (how often the customer is charged) for a subscription contract. This comprehensive operation recalculates billing dates, adjusts pricing, updates selling plans, and may also modify delivery intervals.
Key Features:
- Changes billing frequency while maintaining subscription continuity
- Automatically adjusts delivery interval when linked to billing
- Recalculates next billing date based on store settings
- Reprices all line items for the new frequency
- Finds and applies matching selling plans
- Handles anchor day adjustments for consistent billing
- Validates prepaid subscription constraints
Billing Interval Types:
- DAY: Daily billing (use with caution)
- WEEK: Weekly billing (e.g., every 1, 2, 3 weeks)
- MONTH: Monthly billing (e.g., every 1, 2, 3 months)
- YEAR: Annual billing
Validation Rules:
- Cannot set the same interval as current (no-op prevention)
- For prepaid subscriptions: billing interval must exceed delivery interval
- Example: Can't bill monthly if delivering weekly (would be paying for 1 delivery but receiving 4)
Next Billing Date Calculation: The system uses sophisticated logic to determine the new billing date:
- Starts from current or last successful billing date
- Applies store timezone and order time preferences
- Ensures date is in the future
- Respects day-of-week preferences if configured
- May keep current date if 'enableChangeFromNextBillingDate' is false
Side Effects:
- Delivery Interval: Updated if currently equal to billing interval
- Line Item Pricing: Recalculated based on new frequency multiplier
- Selling Plans: Finds and applies best matching plans for products
- Anchor Days: Updates billing anchor for consistent scheduling
- Email Notifications: Sends 'ORDER_FREQUENCY_UPDATED' to customer
- Activity Logs: Records both billing and delivery changes
Prepaid vs Pay-Per-Delivery:
- Pay-per-delivery: Billing and delivery intervals typically match
- Prepaid: Customer pays upfront for multiple deliveries
- This endpoint enforces prepaid logic to prevent undercharging
Authentication: Requires valid X-API-Key header
- https://www.myshop.com/apps/subscriptions/cp/api/subscription-contracts-update-billing-interval
- 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-interval?contractId=0&intervalCount=0&interval=DAY'{ "id": "gid://shopify/SubscriptionContract/123456789", "status": "ACTIVE", "nextBillingDate": "2024-04-01T12:00:00Z", "customer": { "id": "gid://shopify/Customer/987654321", "email": "customer@example.com" }, "billingPolicy": { "interval": "MONTH", "intervalCount": 2, "anchors": [ … ] }, "deliveryPolicy": { "interval": "MONTH", "intervalCount": 2 }, "lines": { "edges": [ … ] } }
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 }