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
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Product UUID |
Request Body
All fields optional except draft_version on the overlay path.
| Parameter | Type | Required | Description |
|---|---|---|---|
logo_url | string | No | Checkout logo URL (max 2048 characters). Host first with Upload Product Media. Set to null to clear. |
logo_square_url | string | No | Square logo URL (max 2048 characters). Set to null to clear. |
show_logo | boolean | No | Whether the checkout logo is visible. Omit to leave unchanged. |
thank_you | object | No | Post-purchase thank-you. Sparse-merge. null clears the block. See Thank You Object. |
waitlist_thank_you | object | No | Waitlist thank-you. Sparse-merge. null clears the block. See Waitlist Thank You Object. |
confirmation_email | object | No | Confirmation email heading and content. Sparse-merge. null clears the block. See Confirmation Email Object. |
checkout_recovery | object | No | Abandoned-checkout recovery. See Checkout Recovery Object. |
draft_version | integer | Draft only | Current 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"
}