Customer dashboard
You can integrate the customer dashboard on your site if you want customers to register and sign in to your site via Snipcart’s modal.
When enabled, customers will be able to place orders faster: when logged in, their billing and shipping information will be pre-filled automatically whenever they check out. Customers will also be able to consult their orders history.
Getting started
By default, the Sign in/Register/Sign out functions are available inside Snipcart's modal.
Whether in their cart or their checkout flow, customers will be able to Sign in/Register:


If you don't want to offer the customer dashboard feature to customers: in your merchant dashboard, go to Store configurations → Checkout & cart, and mark the "Allow Guests only" box.
To integrate the customer dashboard to your site directly, add a button anywhere in your site markup with the CSS class: snipcart-customer-signin.
Here's a more concrete example:
<!DOCTYPE html>
<html>
<body>
<header>
<button class="snipcart-customer-signin">My account</button>
</header>
</body>When customers click on this button, they will be prompted to sign in, with an option to register if they aren't already connected, and a way to recover their password in case they forgot it:

If they click on Register, they will be able to open an account:

If they click on Forgot your password, they will be able to recover it by entering the email they used to create their account:

If customers are signed in, they will have access to their orders history:

Customers can Sign out either in the cart modal by hitting "My account", or by accessing their account via a button implemented on your site.
Adding a "Request withdrawal" button to a customer's order
Availability: This override slot requires Snipcart cart widget v3.9.0 or later. Older widget versions installed on a merchant site do not expose the
withdrawal-actionsection.
You can add a custom withdrawal button directly to each order in the customer dashboard by overriding the order template's withdrawal-action section. This skips the standard withdrawal form (where the customer would otherwise re-type their order number, name, and email) and goes straight to the confirmation page using their authenticated identity.
For background on what a withdrawal request is and the broader merchant-side flow, see the EU Right to Withdrawal feature guide.
Override the withdrawal-action section
Inside your Snipcart templates container, add:
<snipcart-customer-dashboard-order section="withdrawal-action">
<button
type="button"
class="my-withdrawal-button"
v-if="!hasPendingWithdrawal && ['Processed', 'Shipped', 'Delivered'].includes(status)"
@click="snipcart.api.withdrawal.openConfirmation({
orderInvoiceNumber: invoiceNumber,
email: customerEmail,
customerName: customerFullName,
})"
>
Request withdrawal
</button>
</snipcart-customer-dashboard-order>The override template renders inside the per-order component's scope, so the following are directly available:
| Variable | Type | Description |
|---|---|---|
invoiceNumber |
string | The customer-facing invoice number for this order. |
status |
string | Current order status (e.g. Processed, Shipped, Delivered, Cancelled). |
hasPendingWithdrawal |
boolean | true if the order already has a pending withdrawal request awaiting merchant action. Hide the button on these to avoid silently superseding the previous request. |
total |
number | Order total. |
currency |
string | Three-letter currency code. |
date |
string | Order creation date (ISO 8601). |
customerEmail |
string | The signed-in customer's email. |
customerFullName |
string | The signed-in customer's full name (from their billing address). |
What openConfirmation does
Snipcart.api.withdrawal.openConfirmation({ orderInvoiceNumber, email, customerName }):
- Sends the request to the server for validation (same call as the public withdrawal form).
- On success, opens the cart on the withdrawal confirmation step — the customer skips re-entering their order details and lands directly on the item-selection / final-confirm page.
- On failure (invalid order, already withdrawn, etc.), the cart opens on the withdrawal form with an error message displayed, so the customer can correct and retry.
Returns a Promise<void> that resolves once navigation completes, or rejects with an SDK error if the call itself fails (network, server error). You don't need to handle the validation outcome yourself — the cart navigates accordingly in either case.
Filtering which orders show the button
The example above uses v-if to hide the button when an order isn't a sensible target for a withdrawal request. Two filters compose: a structural one (don't offer the button when one is already pending) and a policy one (which fulfilment states you accept withdrawals against).
- Hide when a request is already in flight (recommended baseline):
v-if="!hasPendingWithdrawal"— clicking the button on an order that already has a pending request would silently supersede the previous one, which confuses customers ("did my earlier request get lost?"). Hide the button until the merchant resolves the existing one. - By status:
v-if="['Processed', 'Shipped', 'Delivered'].includes(status)" - Within the EU 14-day window:
v-if="(Date.now() - new Date(date).getTime()) < 14 * 24 * 60 * 60 * 1000" - Combined (recommended):
v-if="!hasPendingWithdrawal && ['Processed', 'Shipped', 'Delivered'].includes(status) && (Date.now() - new Date(date).getTime()) < 14 * 24 * 60 * 60 * 1000"