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:

  1. Customer trigger — a class-based link you place on your site that opens the cart on a "Request withdrawal" form.
  2. Withdrawal form — collects the customer's order invoice number, email, and full name (the legally required "unequivocal statement" identifying who is making the request).
  3. Item-selection step — the customer can withdraw the entire order or pick specific items (partial withdrawal).
  4. Server-side validation — Snipcart matches the request against the order, refuses on email mismatch, and prevents duplicate concurrent requests.
  5. Customer confirmation email — a localized confirmation email with a confirmation number is sent automatically. Fully customizable per account (see Withdrawal Confirmation email template).
  6. Merchant notification — the merchant receives an email and the order is flagged in the dashboard.
  7. 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).
  8. Webhooksorder.withdrawal.created fires 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:

  1. 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).
  2. 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).
  3. Submission — on confirm, the customer sees a success page with a confirmation number (format WD-YYYYMMDD-XXXXXXXX) and the refund amount.
  4. 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.created webhook 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
Email Withdrawal Confirmation email template

What integrators see

Surface Reference
HTML class trigger class="snipcart-withdrawal" (above)
JavaScript SDK Snipcart.api.withdrawalvalidate(), 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

Was this article helpful?