---
title: "Update confirmation"
description: "Update the preorder confirmation notification's email and SMS copy. The body is the GET shape: email{subject, preheader, heading, body, footer, button{text, background_color, text_color, radius}, colors{background, secti"
url: https://docs.stoqapp.com/v2-reference/preorders-templates/update-confirmation/
api: "API v2 reference"
method: PATCH
path: "/preorders/templates/confirmation"
---

# Update confirmation

`PATCH https://app.stoqapp.com/api/v2/external/preorders/templates/confirmation`

Update the preorder confirmation notification's email and SMS copy. The body is the GET shape: email{subject, preheader, heading, body, footer, button{text, background_color, text_color, radius}, colors{background, section, text}, radius, css, reviews{enabled, count, min_rating, title}, social{...}, klaviyo_flow_name} and sms{body, klaviyo_flow_name}. An optional body `locale` writes the copy in that language only; omit it for the shop default. Turning the email or SMS on or off is [`PATCH /preorders/notification_settings/confirmation`](https://docs.stoqapp.com/v2-reference/preorders-notification-settings/update-confirmation/).

**Note:** Deep partial: absent fields are unchanged, unknown or read-only keys are rejected; errors are 422 keyed &quot;template.&lt;path&gt;&quot;. Rejects HTML (except in email.css) and runs Template validations and callbacks, so sms.body must keep its required Liquid variables. Social links and the icon colour are shared: saving one sets it on every notification template of the shop. Returns the template.

## Headers

- `Idempotency-Key` (string): A fresh unique key for every write (a new UUID, say); reuse it only to retry that write. Keys are remembered for 1 hour: the same key and the same request within that hour returns the first result, with `Idempotent-Replayed: true`, without running again; the same key with a different method, path or body is refused (422 `idempotency_key_reused`); a retry while the first is still running gets 409 `idempotency_key_in_progress`. Keys are per store. Server errors and rate limits are not kept, so their retry runs.

## Request body

- `email` (object)
  - `subject` (string): Subject of the preorder confirmation email.
  - `preheader` (string): Pre-header -- the preview line after the subject in the inbox.
  - `heading` (string): Heading at the top of the email body.
  - `body` (string): Description -- the main body copy of the email.
  - `footer` (string): Cancel order link -- the text of the link that lets customers cancel their preorder. Only shown while &quot;Allow customers to cancel preorders&quot; is on.
  - `button` (object)
    - `text` (string): Button text on the email call to action.
    - `background_color` (string): Button -- Background colour of the email button. Hex.
    - `text_color` (string): Button -- Text colour of the email button. Hex.
    - `radius` (integer): Corner radius of the email button, in pixels.
  - `colors` (object)
    - `background` (string): Colors -- Background of the email, around the content. Hex, e.g. &quot;#F9F9F9&quot;.
    - `section` (string): Colors -- Background of the content section of the email. Hex.
    - `text` (string): Colors -- Text colour of the email. Hex.
  - `radius` (integer): Corner radius of the content section, in pixels.
  - `css` (string): Custom CSS added to the email. Applies to the standard email design. An empty string removes it.
  - `reviews` (object)
    - `enabled` (boolean): Show product reviews: adds the product's Judge.me star rating and top reviews to the preorder confirmation and shipping update emails. Paid plans only; shows only while Judge.me is connected (Settings &gt; Integrations).
    - `count` (integer): Number of reviews to show in the Judge.me reviews block, 1 to 3.
    - `min_rating` (integer): Only show reviews rated at least this many stars: 5, 4 or 3. One of: `5`, `4`, `3`.
    - `title` (string): Section title for the Judge.me reviews block on the email, e.g. &quot;What customers are saying&quot;.
  - `social` (object)
    - `facebook` (string): Facebook profile URL, without the https:// prefix. Shows as an icon in the email. Saving a social link sets it on every notification template of the shop. An empty string removes it.
    - `instagram` (string): Instagram profile URL, without the https:// prefix. Saving a social link sets it on every notification template of the shop.
    - `pinterest` (string): Pinterest profile URL, without the https:// prefix. Saving a social link sets it on every notification template of the shop.
    - `twitter` (string): X (Twitter) profile URL, without the https:// prefix. Saving a social link sets it on every notification template of the shop.
    - `tiktok` (string): TikTok profile URL, without the https:// prefix. Saving a social link sets it on every notification template of the shop.
    - `whatsapp` (string): WhatsApp link, without the https:// prefix. Saving a social link sets it on every notification template of the shop.
    - `youtube` (string): YouTube channel URL, without the https:// prefix. Saving a social link sets it on every notification template of the shop.
    - `icon_color` (string): Icon Color of the social icons: white (#FFFFFF) or black (#000000). Shared by every template. One of: `#FFFFFF`, `#000000`.
  - `klaviyo_flow_name` (string): Flow name to trigger in Klaviyo instead of sending the email here. Only used while the email platform is Klaviyo.
- `sms` (object)
  - `body` (string): SMS Body -- the text message sent instead of the email. Must keep its Liquid variables.
  - `klaviyo_flow_name` (string): Flow name to trigger in Klaviyo instead of sending the SMS here. Only used while the SMS platform is Klaviyo.
- `locale` (string): Language the translated fields are written in, such as 'fr' or 'pt-BR'. Omitted: the shop's default language. Untranslated fields ignore it.

Rate limit: this call costs 2 points ([rate limits](https://docs.stoqapp.com/docs/rate-limits/)).

## Example request

```sh
curl -X PATCH "https://app.stoqapp.com/api/v2/external/preorders/templates/confirmation" \
  -H "X-Auth-Token: $STOQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": {
      "subject": "string",
      "preheader": "string",
      "heading": "string",
      "body": "string",
      "footer": "string",
      "button": {
        "text": "Preorder now",
        "background_color": "#1A1A1A",
        "text_color": "#1A1A1A",
        "radius": 0
      },
      "colors": {
        "background": "string",
        "section": "string",
        "text": "Preorder now"
      },
      "radius": 0,
      "css": "string",
      "reviews": {
        "enabled": true,
        "count": 5,
        "min_rating": 5,
        "title": "string"
      },
      "social": {
        "facebook": "string",
        "instagram": "string",
        "pinterest": "string",
        "twitter": "string",
        "tiktok": "string",
        "whatsapp": "string",
        "youtube": "string",
        "icon_color": "#FFFFFF"
      },
      "klaviyo_flow_name": "Summer Sneaker Drop"
    },
    "sms": {
      "body": "string",
      "klaviyo_flow_name": "Summer Sneaker Drop"
    },
    "locale": "fr"
  }'
```

## 200

Success: the updated resource.

## 202

Saved. Returns the updated section, with also_changed for cascades.

## 401

Missing or invalid `X-Auth-Token`.

```json
{
  "errors": [
    "Invalid API key"
  ],
  "code": "auth_invalid",
  "details": [
    {
      "code": "auth_invalid",
      "message": "Invalid API key",
      "path": null,
      "value": null,
      "expected": null
    }
  ]
}
```

## 409

An earlier request with the same Idempotency-Key is still running. Wait, then resend the same request with the same key.

```json
{
  "errors": [
    "A request with this Idempotency-Key is still running"
  ],
  "code": "idempotency_key_in_progress",
  "details": [
    {
      "code": "idempotency_key_in_progress",
      "message": "A request with this Idempotency-Key is still running",
      "path": null,
      "value": null,
      "expected": null
    }
  ]
}
```

## 422

Invalid fields: one `details` entry per field error, its `path` the canonical section path. Nothing was saved.

```json
{
  "errors": [
    "widget.button.text_color must be a hex color"
  ],
  "code": "invalid_params",
  "details": [
    {
      "code": "invalid_params",
      "message": "must be a hex color",
      "path": "widget.button.text_color",
      "value": "blue",
      "expected": {
        "type": "string"
      }
    }
  ]
}
```

## 429

Rate limited: cost-weighted per token (read 1, write 2; 360 points / 60s). Check `Retry-After`.

```json
{
  "errors": [
    "Rate limit exceeded"
  ],
  "code": "rate_limited",
  "details": [
    {
      "code": "rate_limited",
      "message": "Rate limit exceeded",
      "path": null,
      "value": null,
      "expected": null
    }
  ]
}
```

