Returns the effective subscription offer for a product, optionally scoped to a specific variant. Variant-level offers take precedence over product-level offers. Returns is_subscription_available: false when no active offer exists.
GET /store/products/:id/subscription-offer
Path parameters
Query parameters
Optional variant ID. When provided, the response reflects the variant-level offer if one exists.
Response
is_subscription_available
Whether a subscription offer is available for this product or variant.
Resolved variant ID, or null when the offer applies at product level.
ID of the Plans & Offers record that sourced this offer.
Scope of the source offer: product or variant.
Cadences the customer can choose. Each item contains frequency_interval, frequency_value, label, and a discount object with type and value.
Global discount presentation rules for the offer, or null.
Minimum number of billing cycles required, or null.
Trial configuration with duration and terms, or null when no trial applies.
Response example — offer available
{
"subscription_offer" : {
"is_subscription_available" : true ,
"product_id" : "prod_123" ,
"variant_id" : "variant_123" ,
"source_offer_id" : "offer_456" ,
"source_scope" : "variant" ,
"allowed_frequencies" : [
{
"frequency_interval" : "month" ,
"frequency_value" : 1 ,
"label" : "Every month" ,
"discount" : {
"type" : "percentage" ,
"value" : 10
}
},
{
"frequency_interval" : "month" ,
"frequency_value" : 2 ,
"label" : "Every 2 months" ,
"discount" : {
"type" : "percentage" ,
"value" : 5
}
}
],
"discount_semantics" : null ,
"minimum_cycles" : null ,
"trial" : null
}
}
Response example — no offer
{
"subscription_offer" : {
"is_subscription_available" : false ,
"product_id" : "prod_789" ,
"variant_id" : null ,
"source_offer_id" : null ,
"source_scope" : null ,
"allowed_frequencies" : [],
"discount_semantics" : null ,
"minimum_cycles" : null ,
"trial" : null
}
}