---
title: Changelog
sort: 99
tags: [reference]
---

# Changelog

Every change that touches the public API surface is recorded here, newest first. Internal changes that don't affect
integrators live in the [intranet release notes](../intranet/news/index.md) instead.

This document deliberately collects many small commits so the **Revisions** view on this page has
meaningful history to demonstrate — open the right-rail History panel.

## 2026-05-30 — Refunds API

`POST /v1/orders/{id}/refunds` now accepts a structured `reason` field. Allowed values:
`requested_by_customer`, `duplicate`, `fraudulent`. The previous free-text `note` field is
deprecated and will be removed in v2 (end of 2026); use `metadata.note` to carry context across.

## 2026-05-22 — Webhook delivery v2

Webhook deliveries now retry with exponential backoff up to 24 hours instead of the prior 4 hours.
The `X-ZephyrCart-Delivery-Attempt` header now starts at `1` (was `0`) for clarity.

## 2026-05-15 — Tax zones in Sweden

Added `tax_zone.se-*` for Swedish counties to support the new VAT reporting requirements that took
effect on May 1.

## 2026-05-08 — Stripe Tax handoff

When `payment_method.stripe.use_stripe_tax = true`, tax calculation is delegated to Stripe Tax
instead of ZephyrCart's internal engine. The order's `tax_calculation_source` field reflects which
engine ran.

## 2026-04-30 — Customer merge

`POST /v1/customers/{id}/merge` now consolidates carts, orders, and stored payment methods from
the target into the source customer. Previously only the email and shipping address were merged.

## 2026-04-22 — Bulk cart fetch

`GET /v1/carts?ids=...` supports up to 100 IDs per request (was 25). Useful for storefronts that
want to reconcile carts after a partial outage.

## 2026-04-14 — Idempotency keys

All `POST` endpoints now accept the `Idempotency-Key` header. Retries within 24 hours with the same
key return the original response instead of creating a duplicate resource.
