EU Right to Withdrawal
Availability: This feature requires Snipcart cart widget v3.9.0 or later. Older widget versioned install on a merchant site will not surface the withdrawal flow until the merchant updates their
<script>tag.
Snipcart's right-to-withdrawal flow lets your customers exercise the cancellation right granted by EU Directive 2011/83 ("Consumer Rights Directive"). Within a 14-day period after delivery (or after the contract is concluded for digital/services purchases), an EU consumer is entitled to withdraw from a distance contract without giving any reason. This page describes what Snipcart provides out of the box and how to enable it on your storefront.
If you sell to EU consumers, this is a legal obligation, not an optional feature.
What Snipcart provides
A complete end-to-end withdrawal workflow:
- Customer trigger — a class-based link you place on your site that opens the cart on a "Request withdrawal" form.
- Withdrawal form — collects the customer's order invoice number, email, and full name (the legally required "unequivocal statement" identifying who is making the request).
- Item-selection step — the customer can withdraw the entire order or pick specific items (partial withdrawal).
- Server-side validation — Snipcart matches the request against the order, refuses on email mismatch, and prevents duplicate concurrent requests.
- Customer confirmation email — a localized confirmation email with a confirmation number is sent automatically. Fully customizable per account (see Withdrawal Confirmation email template).
- Merchant notification — the merchant receives an email and the order is flagged in the dashboard.
- Merchant resolution flow — the merchant reviews each request and either accepts (then issues a refund through the standard refund flow) or declines with a reason (which is sent to the customer).
- Webhooks —
order.withdrawal.createdfires on every successful withdrawal, including supersessions. See Order webhooks.
Adding the trigger to your storefront
The cart widget watches for clicks on any element with the class snipcart-withdrawal. The simplest possible integration is a single link in your site footer:
<a href="#" class="snipcart-withdrawal">Request withdrawal</a>That's it — no JavaScript, no event handlers, no SDK call. When the customer clicks the link, the cart opens on the withdrawal form. The element does not need to be an <a> — any element accepts the class.
You are free to place the trigger anywhere on your site. Common placements:
- Footer, near the "Terms of service" / "Refund policy" links.
- Order-history or account pages, alongside other order actions.
- Inline on a "Right of withdrawal" legal-information page.
The class-based trigger works as soon as the Snipcart cart script loads on the page. No configuration is required in the merchant dashboard to enable it.
Customer flow
Once the customer triggers the form:
- Withdrawal Form — the customer enters:
- Their order invoice number (matches the number printed on their order receipt).
- The email address they used at checkout.
- Their full name (used as the legal unequivocal statement).
- Item-selection step — Snipcart validates the request and opens a confirmation step showing the order. The customer chooses:
- Withdraw all items (full withdrawal, refund equals the order total).
- Select specific items (partial withdrawal, refund equals the sum of selected line items).
- Submission — on confirm, the customer sees a success page with a confirmation number (format
WD-YYYYMMDD-XXXXXXXX) and the refund amount. - Confirmation email — the customer receives the Withdrawal Confirmation email with the request details.
If the request is submitted after the 14-day window, the form still accepts it and flags it for the merchant — the merchant decides whether to honour it. Snipcart does not silently reject late requests, since rejection criteria vary by jurisdiction (some EU member states extend the period for missing or incomplete pre-contract information).
Validation rules
The validate step rejects the request and shows a generic error message when:
- The order is not found, or the email does not match the order's email.
- The order is in a state that prevents withdrawal (cancelled, fully refunded, or already in withdrawal flow).
- An earlier withdrawal request is already pending merchant resolution on the same order.
For security reasons, the error message does not differentiate between these cases — the response is a generic "could not validate" so a third party cannot probe for valid order numbers. The specific reason is logged on Snipcart's side for support diagnostics.
Merchant flow
When a withdrawal request comes in, the merchant is notified by email and the order surfaces a Withdrawal Requested indicator in the dashboard. From the order detail page, the merchant sees a Withdrawal section with the customer's name, request date, requested items, and the resulting refund amount.
The merchant has two actions:
- Accept — confirms the withdrawal. The standard refund flow is then used to issue the actual refund (Snipcart automatically links the resulting refund to the accepted withdrawal). Once the refund posts, the order moves to Cancelled (full withdrawal) or Processed (partial withdrawal), and the regular
order.refund.createdwebhook fires (now also carrying the withdrawal correlation id — see Order webhooks. - Decline — requires a free-text reason. The reason is sent to the customer as a notification message; no automated email template is used (the merchant supplies the explanatory text directly).
EU 14-day deadline
Article 13 of EU Directive 2011/83 requires the merchant to refund within 14 days of being informed of a valid withdrawal request. Snipcart surfaces the request prominently in the dashboard but does not enforce the deadline automatically — that responsibility remains with the merchant.
Alternative trigger: customer-dashboard button
If you display Snipcart's customer dashboard on your site, you can replace the standalone form with a per-order Request withdrawal button that uses the customer's already-authenticated identity. The customer skips re-entering their order number, email, and name. See Customizing the customer dashboard for the override-slot pattern.
What the customer sees, end to end
| Step | Component |
|---|---|
| Trigger click | Your <a class="snipcart-withdrawal"> element |
| Withdrawal Form | Cart route /withdrawal |
| Item selection | Cart route /withdrawal-confirm |
| Success | Cart route /withdrawal-success |
| Withdrawal Confirmation email template |
What integrators see
| Surface | Reference |
|---|---|
| HTML class trigger | class="snipcart-withdrawal" (above) |
| JavaScript SDK | Snipcart.api.withdrawal — validate(), confirm(), openConfirmation() |
| Webhook | order.withdrawal.created |
| REST API order fields | hasPendingWithdrawal, withdrawals[] on the Order object |
| Customer-dashboard slot | <overridable name="order" section="withdrawal-action"> (see Customizing the customer dashboard) |
| Email template | Withdrawal Confirmation (overridable per account) |
Cross-references
- Customizing the customer dashboard — for the in-dashboard "Request withdrawal" button alternative.
- Order webhooks —
order.withdrawal.createdpayload, supersession behaviour,withdrawalIdonorder.refund.created. - Order REST API —
hasPendingWithdrawalboolean andwithdrawals[]array on the order object. - JavaScript SDK reference —
Snipcart.api.withdrawalmethods and events. - Withdrawal Confirmation email template — variables, override mechanism, default content.