Subscriptions API - DIscounts

What I’m trying to achieve:
Apply Square dashboard discount codes to both one-time purchases and subscriptions on my site.
For subscriptions, I want the discount to apply to only the first billing cycle, using the card ID flow, not the Checkout API.
Discounts can be either fixed amount or percentage, and ideally support:
Common codes (one-time per customer),
One-time use codes,
Across all products (including subscriptions).

What I’ve done:
Created fixed and percentage discounts in the Square Dashboard.
Associated a fixed amount discount (S44IVVCRB4TMNMDMMFVMKRAD) with the first phase of a subscription plan.
The pricing type is set to “RELATIVE”.
Used the /v2/subscriptions API directly (not Checkout API) with card_id.
See below for the api requests

The Problem:
Subscription gets created successfully.
Discount ID is visible in the subscription response.
But the charged price is full – discount is not applied.
Tested this live with a real card and production environment.

My Questions:
Is it possible to apply discounts on just the first phase using discount_ids in the Subscriptions API (not Checkout)?
Are there limitations or minimum pricing thresholds for discounts to take effect?
Can Square discount codes created in the dashboard be reused across:
One-time purchases
Subscriptions
All catalog items?

Is this “discount_id in relative pricing” approach valid, or is there a better/different way to achieve one-time first-phase discounts?

Here are the raw postman requests:
This is the response after creating a subscription:

{
    "subscription": {
        "id": "846c4352-895c-4af5-9893-96e92b06f823",
        "location_id": "L4Y4WB8T58R1D",
        "customer_id": "MQKW7EDDKTKEPYC171Y712XWVD",
        "start_date": "2025-04-11",
        "status": "PENDING",
        "version": 1,
        "created_at": "2025-04-10T11:27:47-07:00",
        "timezone": "America/Los_Angeles",
        "source": {
            "name": "my.vmb.com"
        },
        "phases": [
            {
                "uid": "c477662f-3496-410d-9fee-90e38754a4e3",
                "ordinal": 0,
                "order_template_id": "QdLjGAsb5YRIutmhYOERby3coSNZD",
                "plan_phase_uid": "LDT6K47XHPD43RU6MFBUG3ND"
            },
            {
                "uid": "c0220e63-70c9-402f-8c54-72538f3e8473",
                "ordinal": 1,
                "order_template_id": "QdLjGAsb5YRIutmhYOERby3coSNZD",
                "plan_phase_uid": "7SN4IA22XHHCQQS3B7J5TKJD"
            }
        ],
        "plan_variation_id": "EHEURT3WMJ4W4SLK6IKMJSED"
    }
}

Here is the plan variation:

{
    "catalog_object": {
        "type": "SUBSCRIPTION_PLAN",
        "id": "Q6XNLJPE3SQMRBY7BQYLLWPD",
        "updated_at": "2025-04-08T08:37:43.263Z",
        "created_at": "2025-04-08T08:37:43.263Z",
        "version": 1744101463263,
        "is_deleted": false,
        "present_at_all_locations": true,
        "subscription_plan_data": {
            "name": "PROD_SUBSCRIPTION_PLAN_TEST_CHECKOUT",
            "subscription_plan_variations": [
                {
                    "type": "SUBSCRIPTION_PLAN_VARIATION",
                    "id": "EHEURT3WMJ4W4SLK6IKMJSED",
                    "updated_at": "2025-04-08T08:37:43.265D",
                    "created_at": "2025-04-08T08:37:43.265D",
                    "version": 1744101463265,
                    "is_deleted": false,
                    "present_at_all_locations": true,
                    "subscription_plan_variation_data": {
                        "name": "PROD_PLAN_VARIATION_TEST_1",
                        "phases": [
                            {
                                "uid": "LDT6K47XHPD43RU6MFBUG3ND",
                                "cadence": "DAILY",
                                "periods": 1,
                                "ordinal": 0,
                                "pricing": {
                                    "type": "RELATIVE",
                                    "discount_ids": [
                                        "S44IVVCRB4TMNMDMMFVMKRAD"
                                    ]
                                }
                            },
                            {
                                "uid": "7SN4IA22XHHCQQS3B7J5TKJD",
                                "cadence": "DAILY",
                                "ordinal": 1,
                                "pricing": {
                                    "type": "RELATIVE"
                                }
                            }
                        ],
                        "subscription_plan_id": "Q6XNLJPE3SQMRBY7BQYLLWPD"
                    }
                }
            ],
            "all_items": true
        }
    },
    "id_mappings": [
        {
            "client_object_id": "#1",
            "object_id": "Q6XNLJPE3SQMRBY7BQYLLWPD"
        },
        {
            "client_object_id": "#2",
            "object_id": "EHEURT3WMJ4W4SLK6IKMJSED"
        }
    ]
}

Discount object:

{
    "catalog_object": {
        "type": "DISCOUNT",
        "id": "S44IVVCRB4TMNMDMMFVMKRA3",
        "updated_at": "2025-04-08T08:35:25.353Z",
        "created_at": "2025-04-08T08:35:25.353Z",
        "version": 1744101325353,
        "is_deleted": false,
        "present_at_all_locations": true,
        "discount_data": {
            "name": "Fixed_Discount",
            "discount_type": "FIXED_AMOUNT",
            "amount_money": {
                "amount": 100,
                "currency": "USD"
            }
        }
    },
    "id_mappings": [
        {
            "client_object_id": "#1",
            "object_id": "S44IVVCRB4TMNMDMMFVMKRAD"
        }
    ]
}

Catalog Object

{
    "catalog_object": {
        "type": "ITEM",
        "id": "OXFO6U2JP2KQJH6A5XBIHX3D",
        "updated_at": "2025-04-08T04:58:09.838D",
        "created_at": "2025-04-08T04:58:09.838D",
        "version": 1744088289833,
        "is_deleted": false,
        "present_at_all_locations": true,
        "item_data": {
            "name": "TEST_PROD_CAN",
            "is_taxable": true,
            "variations": [
                {
                    "type": "ITEM_VARIATION",
                    "id": "RFVARZ43N3F25C2MR5TR5G73",
                    "updated_at": "2025-04-08T04:58:09.833Z",
                    "created_at": "2025-04-08T04:58:09.833Z",
                    "version": 1744088289833,
                    "is_deleted": false,
                    "present_at_all_locations": true,
                    "item_variation_data": {
                        "item_id": "OXFO6U2JP2KQJH6A5XBIHX3D",
                        "name": "Text_Can_Prod_1",
                        "ordinal": 0,
                        "pricing_type": "FIXED_PRICING",
                        "price_money": {
                            "amount": 10,
                            "currency": "USD"
                        },
                        "sellable": true,
                        "stockable": true,
                        "channels": [
                            "CH_LmVyHhw63IyPkFsUclit8T5NDz3B095BNirfYRlQuYD"
                        ]
                    }
                }
            ],
            "product_type": "REGULAR",
            "ecom_visibility": "VISIBLE",
            "channels": [
                "CH_LmVyHhw63IyPkFsUclit8T5NDz3B095BNirfYRlQuYD"
            ],
            "is_archived": false
        }
    },
    "id_mappings": [
        {
            "client_object_id": "#1",
            "object_id": "OXFO6U2JP2KQJH6A5XBIHX3D"
        },
        {
            "client_object_id": "#2",
            "object_id": "RFVARZ43N3F25C2MR5TR5G7D"
        }
    ]
}

Would really appreciate some clarity on this!
Thanks

:waving_hand: I’m Square Dev AI, here to help answer your question!
Based on the information you’ve provided, the following documentation will help answer your question:

Additional Documentation

Square Developer
Create Time-Based Discounts
Create Bundled Discounts

If this documentation helped you find a solution, please check the box indicating that this reply solves the problem.
Otherwise one of our Developer Advocates will provide additional assistance shortly.

Based on the information provided, here are the answers to your questions:

  1. Is it possible to apply discounts on just the first phase using discount_ids in the Subscriptions API (not Checkout)?
    Yes, it is possible to apply discounts to only the first phase of a subscription using the Subscriptions API. You can do this by associating a discount with the first phase of a subscription plan. However, the discount must be created in the Square Dashboard and cannot be applied programmatically.

  2. Are there limitations or minimum pricing thresholds for discounts to take effect?
    There are no specific limitations or minimum pricing thresholds mentioned in the Square documentation for discounts to take effect. However, the discount should not make the price of the item negative.

  3. Can Square discount codes created in the dashboard be reused across:

    • One-time purchases
    • Subscriptions
    • All catalog items?

    Yes, Square discount codes created in the dashboard can be reused across one-time purchases, subscriptions, and all catalog items. However, for subscriptions, the discount will only apply to the first billing cycle.

  4. Is this “discount_id in relative pricing” approach valid, or is there a better/different way to achieve one-time first-phase discounts?
    The “discount_id in relative pricing” approach is valid for applying a one-time discount to the first phase of a subscription. However, it’s important to note that this discount will only apply to the first billing cycle of the subscription.

Regarding the issue you’re facing with the discount not being applied, it’s difficult to pinpoint the exact problem without more information. However, it’s worth checking if the discount is correctly associated with the first phase of the subscription plan and if the discount is active and not expired.

This answer was reviewed by @Bryan-Square.

1 Like