Skip to main content

Checkout Flow

Once the customer has added the desired products to the active order, it's time to check out.

This guide assumes that you are using the default OrderProcess, so if you have defined a custom process, some of these steps may be slightly different.

Note

In this guide, we will assume that an ActiveOrder fragment has been defined, as detailed in the Managing the Active Order guide, but for the purposes of checking out the fragment should also include customer shippingAddress and billingAddress fields.

Add a customer

Every order must be associated with a customer. If the customer is not logged in, then the setCustomerForOrder mutation must be called. This will create a new Customer record if the provided email address does not already exist in the database.

Note

If the customer is already logged in, then this step is skipped.

Graphql
mutation SetCustomerForOrder($input: CreateCustomerInput!) {  setCustomerForOrder(input: $input) {    ...ActiveOrder    ...on ErrorResult {      errorCode      message    }  }}

Set the shipping address

The setOrderShippingAddress mutation must be called to set the shipping address for the order.

Graphql
mutation SetOrderShippingAddress($input: CreateAddressInput!) {  setOrderShippingAddress(input: $input) {    ...ActiveOrder    ...on ErrorResult {      errorCode      message    }  }}

If the customer is logged in, you can check their existing addresses and pre-populate an address form if an existing address is found.

Graphql
query GetCustomerAddresses {  activeCustomer {    id    addresses {      id      fullName      company      streetLine1      streetLine2      city      province      postalCode      country {        code        name      }      phoneNumber      defaultShippingAddress      defaultBillingAddress    }  }}

Set the shipping method

Now that we know the shipping address, we can check which shipping methods are available with the eligibleShippingMethods query.

Graphql
query GetShippingMethods {  eligibleShippingMethods {    id    price    description  }}

The results can then be displayed to the customer so they can choose the desired shipping method. If there is only a single result, then it can be automatically selected.

The desired shipping method's id is then passed to the setOrderShippingMethod mutation.

Graphql
mutation SetShippingMethod($id: [ID!]!) {    setOrderShippingMethod(shippingMethodId: $id) {        ...ActiveOrder        ...on ErrorResult {            errorCode            message        }    }}

Add payment

The eligiblePaymentMethods query can be used to get a list of available payment methods. This list can then be displayed to the customer, so they can choose the desired payment method.

Graphql
query GetPaymentMethods {  eligiblePaymentMethods {    id    name    code    isEligible  }}

Next, we need to transition the order to the ArrangingPayment state. This state ensures that no other changes can be made to the order while the payment is being arranged. The transitionOrderToState mutation is used to transition the order to the ArrangingPayment state.

Graphql
mutation TransitionToState($state: String!) {  transitionOrderToState(state: $state) {    ...ActiveOrder    ...on OrderStateTransitionError {      errorCode      message      transitionError      fromState      toState    }  }}

At this point, your storefront will use an integration with the payment provider to collect the customer's payment details, and then the exact sequence of API calls will depend on the payment integration.

The addPaymentToOrder mutation is the general-purpose mutation for adding a payment to an order. It accepts a method argument which must corresponde to the code of the selected payment method, and a metadata argument which is a JSON object containing any additional information required by that particular integration.

For example, the demo data populated in a new Vendure installation includes a "Standard Payment" method, which uses the dummyPaymentHandler to simulate a payment provider. Here's how you would add a payment using this method:

Graphql
mutation AddPaymentToOrder($input: PaymentInput!) {  addPaymentToOrder(input: $input) {    ...ActiveOrder    ...on ErrorResult {      errorCode      message    }  }}

Other payment integrations have specific setup instructions you must follow:

Stripe

Our StripePlugin docs describe how to set up your checkout to use Stripe.

Braintree

Our BraintreePlugin docs describe how to set up your checkout to use Braintree.

Mollie

Our MolliePlugin docs describe how to set up your checkout to use Mollie.

Other payment providers

For more information on how to integrate with a payment provider, see the Payment guide.

Display confirmation

Once the checkout has completed, the order will no longer be considered "active" (see the OrderPlacedStrategy) and so the activeOrder query will return null. Instead, the orderByCode query can be used to retrieve the order by its code to display a confirmation page.

Graphql
query GetOrderByCode($code: String!) {  orderByCode(code: $code) {    ...Order  }}
Info

By default Vendure will only allow access to the order by code for the first 2 hours after the order is placed if the customer is not logged in. This is to prevent a malicious user from guessing order codes and viewing other customers' orders. This can be configured via the OrderByCodeAccessStrategy.

Was this chapter helpful?
Report Issue
Edited Feb 2, 2026·Edit this page