# Update minimum cycles for a subscription contract Updates the minimum number of billing cycles (orders) that a customer must complete before they can cancel their subscription. This creates a commitment period that helps with customer retention and business predictability. What are Minimum Cycles? Minimum cycles represent a commitment period where: - Customers must complete a specified number of orders - Cancellation is blocked until the minimum is met - Often tied to special pricing or promotional offers - Counted from the subscription start date Key Features: - Updates commitment period for existing subscriptions - Can increase or decrease minimum cycles - Setting to null removes the minimum commitment - Preserves all other subscription settings - Automatically handles invalid discount codes - Updates future billing queue after change Common Use Cases: - Promotional Offers: '3-month minimum for 50% off' - Hardware Subsidies: '12-month commitment with free device' - Loyalty Programs: Reduce minimum after customer proves loyalty - Seasonal Campaigns: Temporary commitment requirements - Contract Adjustments: Customer service exceptions Impact on Customers: - Cannot cancel via portal until minimum cycles complete - Pause/resume typically still allowed (check settings) - Shows commitment status in customer portal - No automatic notification sent (consider sending separately) Cycle Counting: - Only successful billing attempts count toward minimum - Failed payments don't increment the cycle count - Skipped orders (if allowed) don't count - Current cycle = successful past orders + 1 Interaction with Max Cycles: - Min cycles must be less than or equal to max cycles - If max cycles exist, subscription auto-cancels after maximum - Common pattern: 3 min cycles, 12 max cycles Best Practices: - Clearly communicate commitment terms upfront - Consider grandfathering existing customers - Use reasonable minimums (typically 3-12 cycles) - Document reason for changes in activity logs - Send customer notification for transparency Important Notes: - Changes apply immediately to cancellation logic - Doesn't affect past or in-progress orders - Customer portal respects this setting automatically - Activity log tracks old and new values - Consider legal requirements in your jurisdiction Authentication: Requires valid X-API-Key header Endpoint: PUT /api/external/v2/subscription-contracts-update-min-cycles Version: 0.0.1 ## Query parameters: - `contractId` (integer, required) Contract ID - `api_key` (string) API Key (Deprecated - Use Header X-API-Key instead) - `minCycles` (integer,null) Minimum Number of Orders. The minimum number of billing cycles a customer must complete before being allowed to cancel. Set to null to remove the minimum commitment. Common values: - 3: Three-month commitment - 6: Six-month commitment - 12: Annual commitment - null: No commitment Example: 6 ## Header parameters: - `X-API-Key` (string) ## Response 200 fields (application/json): - `get__typename` (string) - `id` (string) - `createdAt` (object) - `updatedAt` (object) - `nextBillingDate` (object) - `status` (string) Enum: "ACTIVE", "PAUSED", "CANCELLED", "EXPIRED", "FAILED", "$UNKNOWN" - `deliveryPrice` (object) - `deliveryPrice.amount` (object) - `deliveryPrice.currencyCode` (string) Enum: "USD", "EUR", "GBP", "CAD", "AFN", "ALL", "DZD", "AOA", "ARS", "AMD", "AWG", "AUD", "BBD", "AZN", "BDT", "BSD", "BHD", "BIF", "BYN", "BZD", "BMD", "BTN", "BAM", "BRL", "BOB", "BWP", "BND", "BGN", "MMK", "KHR", "CVE", "KYD", "XAF", "CLP", "CNY", "COP", "KMF", "CDF", "CRC", "HRK", "CZK", "DKK", "DJF", "DOP", "XCD", "EGP", "ERN", "ETB", "FKP", "XPF", "FJD", "GIP", "GMD", "GHS", "GTQ", "GYD", "GEL", "GNF", "HTG", "HNL", "HKD", "HUF", "ISK", "INR", "IDR", "ILS", "IRR", "IQD", "JMD", "JPY", "JEP", "JOD", "KZT", "KES", "KID", "KWD", "KGS", "LAK", "LVL", "LBP", "LSL", "LRD", "LYD", "LTL", "MGA", "MKD", "MOP", "MWK", "MVR", "MRU", "MXN", "MYR", "MUR", "MDL", "MAD", "MNT", "MZN", "NAD", "NPR", "ANG", "NZD", "NIO", "NGN", "NOK", "OMR", "PAB", "PKR", "PGK", "PYG", "PEN", "PHP", "PLN", "QAR", "RON", "RUB", "RWF", "WST", "SHP", "SAR", "RSD", "SCR", "SLL", "SGD", "SDG", "SOS", "SYP", "ZAR", "KRW", "SSP", "SBD", "LKR", "SRD", "SZL", "SEK", "CHF", "TWD", "THB", "TJS", "TZS", "TOP", "TTD", "TND", "TRY", "TMT", "UGX", "UAH", "AED", "UYU", "UZS", "VUV", "VES", "VND", "XOF", "YER", "ZMW", "USDC", "BYR", "STD", "STN", "VED", "VEF", "XXX", "$UNKNOWN" - `lastPaymentStatus` (string) Enum: "SUCCEEDED", "FAILED", "$UNKNOWN" - `billingPolicy` (object) - `billingPolicy.interval` (string) Enum: "DAY", "WEEK", "MONTH", "YEAR", "$UNKNOWN" - `billingPolicy.intervalCount` (integer) - `billingPolicy.anchors` (array) - `billingPolicy.anchors.cutoffDay` (integer) - `billingPolicy.anchors.day` (integer) - `billingPolicy.anchors.month` (integer) - `billingPolicy.anchors.type` (string) Enum: "WEEKDAY", "MONTHDAY", "YEARDAY", "$UNKNOWN" - `billingPolicy.maxCycles` (integer) - `billingPolicy.minCycles` (integer) - `deliveryPolicy` (object) - `lines` (object) - `lines.nodes` (array) - `lines.nodes.sellingPlanId` (string) - `lines.nodes.sellingPlanName` (string) - `lines.nodes.productId` (string) - `lines.nodes.sku` (string) - `lines.nodes.title` (string) - `lines.nodes.variantId` (string) - `lines.nodes.quantity` (integer) - `lines.nodes.customAttributes` (array) - `lines.nodes.customAttributes.key` (string) - `lines.nodes.customAttributes.value` (string) - `lines.nodes.lineDiscountedPrice` (object) - `lines.nodes.variantImage` (object) - `lines.nodes.variantImage.transformedSrc` (object) - `lines.nodes.variantTitle` (string) - `lines.nodes.currentPrice` (object) - `lines.nodes.discountAllocations` (array) - `lines.nodes.discountAllocations.discount` (object) - `lines.nodes.pricingPolicy` (object) - `lines.nodes.pricingPolicy.basePrice` (object) - `lines.nodes.pricingPolicy.cycleDiscounts` (array) - `lines.nodes.pricingPolicy.cycleDiscounts.afterCycle` (integer) - `lines.nodes.pricingPolicy.cycleDiscounts.computedPrice` (object) - `lines.nodes.pricingPolicy.cycleDiscounts.adjustmentType` (string) Enum: "PERCENTAGE", "FIXED_AMOUNT", "PRICE", "$UNKNOWN" - `lines.nodes.pricingPolicy.cycleDiscounts.adjustmentValue` (object) - `lines.nodes.taxable` (boolean) - `lines.pageInfo` (object) - `lines.pageInfo.hasPreviousPage` (boolean) - `lines.pageInfo.hasNextPage` (boolean) - `lines.pageInfo.startCursor` (string) - `lines.pageInfo.endCursor` (string) - `customerPaymentMethod` (object) - `customerPaymentMethod.instrument` (object) - `customerPaymentMethod.revokedAt` (object) - `customerPaymentMethod.revokedReason` (string) Enum: "AUTHORIZE_NET_GATEWAY_NOT_ENABLED", "AUTHORIZE_NET_RETURNED_NO_PAYMENT_METHOD", "FAILED_TO_UPDATE_CREDIT_CARD", "STRIPE_API_AUTHENTICATION_ERROR", "STRIPE_API_INVALID_REQUEST_ERROR", "STRIPE_GATEWAY_NOT_ENABLED", "STRIPE_RETURNED_NO_PAYMENT_METHOD", "STRIPE_PAYMENT_METHOD_NOT_CARD", "BRAINTREE_API_AUTHENTICATION_ERROR", "BRAINTREE_GATEWAY_NOT_ENABLED", "BRAINTREE_RETURNED_NO_PAYMENT_METHOD", "BRAINTREE_PAYMENT_METHOD_NOT_CARD", "PAYMENT_METHOD_VERIFICATION_FAILED", "THREE_D_SECURE_FLOW_IN_VERIFICATION_NOT_IMPLEMENTED", "MANUALLY_REVOKED", "FAILED_TO_RETRIEVE_BILLING_ADDRESS", "MERGED", "CUSTOMER_REDACTED", "TOO_MANY_CONSECUTIVE_FAILURES", "CVV_ATTEMPTS_LIMIT_EXCEEDED", "$UNKNOWN" - `deliveryMethod` (object) - `originOrder` (object) - `originOrder.name` (string) - `originOrder.fulfillmentOrders` (object) - `customer` (object) - `customer.displayName` (string) - `customer.firstName` (string) - `customer.lastName` (string) - `customer.email` (string) - `customer.phone` (string) - `discounts` (object) - `note` (string) - `billingAttempts` (object) ## Response 400 fields ## Response 401 fields ## Response 403 fields ## Response 404 fields ## Response 422 fields