---
title: "What's new | Customer's Canvas On-Premises"
canonical: "https://customerscanvas.com/docs/on-premises/preflight/whats-new/"
---

# What's new

> This topic includes new features, improvements, and bug fixes for the Preflight tool.

## 2.0.0 - May 26, 2026

Preflight now supports saving design states to **Asset Storage** with subsequent rendering through the rendering service.

### New Endpoint

[POST `api/product/save`](https://customerscanvas.com/docs/on-premises/preflight/web-api/save.md): Accepts a product object, `userId`, and `stateId`. Returns an array of origin file URLs and the `stateId`:

  ```json
  {
      "originUrls": [],
      "stateId": "4afcbe97-b51d-4f6f-b9db-70c55536b80a"
  }
  ```

- **`POST api/product/finish`** — Renders hi-res outputs. Now returns `403 Forbidden` when the `DisableFinishEndpoint` parameter is set to `true`.

### Configuration Parameters

Added [new parameters](https://customerscanvas.com/docs/on-premises/preflight/config-backend.md) for working with Asset Storage:

| Parameter | Description |
|---|---|
| `DisableFinishEndpoint` | If `true`, disables the `finish` endpoint and returns `403` on access. |
| `AssetProcessorEndpoint` | URL of the asset processor gateway in the current environment. |
| `AssetProcessorApiKey` | API key for the asset processor. |
| `SaveStateRetryCount` | Number of save retry attempts. Default: `3`. |
| `AssetStorageStates` | If `true`, saves the state file as a private asset in Asset Storage. If `false`, saves to disk (legacy behavior). |

### State Backups

If all retry attempts to save the state file to asset storage fail, the state is saved to disk at `basePath/backups/{userId}/{stateId}.st` for recovery and investigation.

### Recommended Usage

To use the new functionality, deploy Preflight 2.0.0, update the configuration, and adjust your pipeline:

1. **Approval step**: Call `$['preflight'].getPreviews()`. Previews are available in `$['preflight'].previews` for the gallery widget.
2. **Add to cart (finish widget)**: Call `$['preflight'].saveProduct()`, which returns the saved `stateId` and an array of origin file URLs.
3. **Order widget**: Remove hi-res resources and include the `stateId` from `$['preflight'].stateId`.

:::note
Calling the `finish` method directly is not recommended with the new flow.
:::
