Skip to main content

Update Product Settings

Sparse-update checkout logos, thank-you pages, confirmation email, and recovery. Only the keys you send are changed. Unknown keys return 422.

Live writes return 409 when the product has has_draft: true — see Live writes while a draft exists. Updating a published product requires an active Easytools plan — see Active plan required. Drafts can always be updated. Overlay writes require draft_version and return it plus preview_url.

Nested thank_you, waitlist_thank_you, and confirmation_email sparse-merge; send null on that object to clear its fields. checkout_recovery sparse-merges enabled; coupon when sent replaces the pair. See Checkout appearance.

Request

Live:

PATCH /products/{id}/settings

Draft:

PATCH /products/{id}/draft/settings

Path Parameters

ParameterTypeRequiredDescription
idstringYesProduct UUID

Request Body

All fields optional except draft_version on the overlay path.

ParameterTypeRequiredDescription
logo_urlstringNoCheckout logo URL (max 2048 characters). Host first with Upload Product Media. Set to null to clear.
logo_square_urlstringNoSquare logo URL (max 2048 characters). Set to null to clear.
show_logobooleanNoWhether the checkout logo is visible. Omit to leave unchanged.
thank_youobjectNoPost-purchase thank-you. Sparse-merge. null clears the block. See Thank You Object.
waitlist_thank_youobjectNoWaitlist thank-you. Sparse-merge. null clears the block. See Waitlist Thank You Object.
confirmation_emailobjectNoConfirmation email heading and content. Sparse-merge. null clears the block. See Confirmation Email Object.
checkout_recoveryobjectNoAbandoned-checkout recovery. See Checkout Recovery Object.
draft_versionintegerDraft onlyCurrent overlay version from Get Product Draft. Minimum 1. A mismatch returns 409.

Do not send currency inside checkout_recovery.coupon — it is read-only. Product footer_text, redirect_url, redirect_time, add_redirect_params, and show_confetti stay on Update Product, not here.

Every URL in the body must start with http:// or https:// and include a host. See URL fields.

Example Request

curl -X PATCH "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb/settings" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"show_logo": false,
"thank_you": {
"heading": "Thanks for your order"
}
}'

Set a recovery coupon (amount in minor units). Do not send percent in the same object, and do not send currency:

curl -X PATCH "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb/settings" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"checkout_recovery": {
"enabled": true,
"coupon": {
"amount": 500,
"percent": null
}
}
}'

Clear the coupon and inherit the store recovery default:

curl -X PATCH "https://cart.easy.tools/api/v1/products/0632bef5-c308-42cd-9cba-89a7a4f722bb/settings" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"checkout_recovery": {
"enabled": null,
"coupon": null
}
}'

Draft update adds "draft_version": 11 to the body and uses /draft/settings.

Response

Success Response (200)

Live returns the Settings Object. Draft returns that object plus draft_version and preview_url.

{
"logo_url": null,
"logo_square_url": null,
"show_logo": false,
"thank_you": {
"heading": "Thanks for your order",
"text": null,
"button_text": null,
"button_url": null
},
"waitlist_thank_you": {
"heading": null,
"text": null,
"show_confetti": false,
"redirect_url": null,
"redirect_time": null,
"add_redirect_params": true,
"button_text": null,
"button_url": null
},
"confirmation_email": {
"heading": null,
"content": null
},
"checkout_recovery": {
"enabled": null,
"coupon": null
}
}

Error Responses

Bad Request (400)

{
"message": "Invalid product ID"
}

Product Not Found (404)

{
"message": "Product with ID 0632bef5-c308-42cd-9cba-89a7a4f722bb not found"
}

Conflict Error (409 — Unpublished Draft)

Live write while has_draft is true:

{
"message": "This product has an unpublished draft. Publish, unpublish, or delete the draft before making live changes."
}

Conflict Error (409 — Stale Draft Version)

Draft write when draft_version does not match:

{
"message": "The draft was edited elsewhere. GET the draft and retry with the current draft_version."
}

Validation Error (422 Unprocessable Entity)

{
"message": "The given data was invalid.",
"errors": {
"checkout_recovery.coupon": [
"Provide either amount or percent, not both."
]
}
}

Sending currency on the coupon, a coupon object with neither amount nor percent, or an unknown nested key also returns 422. See Checkout appearance.

Publishing Not Allowed (422 — No Active Plan)

Live write against a published product when the store has no active Easytools plan. Overlay writes are not gated this way.

{
"message": "Product cannot be published without an active Easytools plan"
}