---
title: "Create an authenticated customer checkout order"
method: POST
path: "/v3/stores/{store_id}/customers/me/checkout"
tags: ["Customer Checkout"]
---

# Create an authenticated customer checkout order

`POST /v3/stores/{store_id}/customers/me/checkout`

## Request

- Base URL: `https://api.scalev.com`
- URL: `https://api.scalev.com/v3/stores/{store_id}/customers/me/checkout`
- Auth: HTTP bearer

Customer-authenticated storefront endpoint. Create an order from direct `items`, from a customer cart referenced by `cart_id`, or from direct `items` while clearing the referenced cart after successful order creation. Carts must belong to the authenticated customer and current store. Product prices, discounts, shipping, Other Income, the Store customer-fee policy, and service fees are recalculated from current backend data during creation. Preview values are not confirmation inputs and do not produce a quote-conflict response.

## Path parameters

- `store_id` string, required

## Request body

- CustomerCheckoutRequest
  - `metadata` CheckoutTrackingMetadata, nullable
    - `tracking_renderer` 'vue' | 'html': Actual checkout renderer, supplied by the runtime. New orders freeze it with configured form-submission selections. Missing or unrecognized values use vue; later order edits do not rewrite the snapshot.
    - `tracking_form_delivery` 'server_v1': Send only when the loaded public runtime advertises tracking_form_delivery as server_v1 beside its saved tracking_config. This declares support for server-owned Meta, TikTok and SnackVideo server form-submission delivery; it does not select events, assets or permissions. Suppress the matching direct native server sends only if the accepted order also acknowledges tracking_form_delivery as server_v1. Missing or unsupported declarations retain the compatibility path. Browser events, Purchase, Google Ads and GTM delivery are not transferred by this field.
  - `checkout_intent_token` string: Optional cit_ write capability from checkout-intent capture. A valid matching token completes the intent when the order commits. Invalid, expired, mismatched or consumed tokens never block order creation.
  - `items` StorefrontCheckoutItem[]: Optional direct item source. If supplied, direct items create the order. If `cart_id` is also supplied, the referenced cart is cleared after successful order creation.
    - union
      - StorefrontCheckoutVariantItem
        - `type` 'variant', required
        - `variant_id` integer, required
        - `quantity` integer, required
      - StorefrontCheckoutBundlePriceOptionItem
        - `type` 'bundle_price_option', required
        - `bundle_price_option_id` integer, required: Bundle price option ID from the storefront catalog.
        - `quantity` integer, required
  - `cart_id` union: Authenticated customer cart ID. Used as the order source when `items` is omitted. When `items` is also supplied, the cart is only cleared after successful order creation.
    - integer
    - string
  - `address_id` union
    - integer
    - string
  - `address` string
  - `location_id` union
    - integer
    - string
  - `postal_code` string
  - `payment_method` string: Customer checkout payment method code selected by the buyer. Required for normal checkout. May be omitted when the store uses strict two-step Payment Link checkout; Scalev resolves it to `payment_link`. Virtual Accounts use flat method codes such as `va_bca`.
  - `courier_service_id` union
    - integer
    - string
  - `warehouse_unique_id` string, nullable
  - `courier_aggregator_code` string, nullable
  - `discount_code_code` string, nullable
  - `notes` string, nullable

## Response `201`

Customer checkout order

- StorefrontPublicOrder
  - `tracking_form_delivery` 'server_v1': Present only when this accepted order owns the frozen server form-submission selections under server_v1, including explicit empty selections. A runtime that received the matching public capability may omit its direct Meta, TikTok and SnackVideo server form sends. Absence requires the compatible direct path. This acknowledges delivery ownership, not provider acceptance or attribution, and does not change browser or Purchase delivery.
  - `google_ads_items` GoogleAdsCommerceItem[]: Purchased items for explicitly configured browser remarketing. Feed matching uses the destination configuration.
    - `variant_id` integer, nullable
    - `bundle_price_option_id` integer, nullable
    - `sku` string, nullable
    - `quantity` number
  - `google_ads_purchase` GoogleAdsBrowserPurchase[]: Eligible Google browser conversions using the immutable server transaction ID and value. Empty before the configured purchase trigger.
    - `remarketing` GoogleAdsRemarketing
      - `enabled` boolean: New account connections initialize this to true. Existing saved settings are preserved; disabling it stops browser remarketing. Consent and feed-ID requirements still apply.
      - `feed_id_source` 'sku' | 'explicit'
      - `feed_ids` object: Explicit mappings from variant:<numeric ID> or bundle:<numeric bundle-price-option ID> to the exact existing Google feed item ID. Bundle options always need explicit mappings.
    - `id` string, uuid
    - `tag_id` string
    - `conversion_label` string
    - `transaction_id` string, uuid
    - `value` number
    - `currency` 'IDR'
  - `id` string, uuid, required: Canonical UUIDv7 order primary key returned by the partitioned orders table.
  - `business` object, nullable
    - `username` string, nullable
    - `contact_email` string, nullable
    - `aff_code` string, nullable
    - `logo` string, nullable
  - `secret_slug` string, required
  - `public_order_url` string, uri, nullable, required
  - `payment_url` string, uri, nullable, required: Deprecated for checkout navigation. Retained for compatibility and scoped to the payment step. Always use `redirect_url` to navigate the buyer after checkout; do not use this field to infer the destination.
  - `redirect_url` string, uri, nullable: Canonical destination the buyer opens after checkout. Always prefer this field over the deprecated `payment_url`. The server resolves the destination from the payment method and After Checkout setting, including the payment page, order page, WhatsApp, another page, or a custom URL. When a destination cannot be resolved because the configuration is missing or unsupported, or a required phone number, page, or URL is unavailable, it falls back to Scalev's hosted payment instructions page (Halaman Instruksi Pembayaran) at `/o/{secret_slug}/success`, not the Thank You Page. This fallback requires a valid order identity and host. Storefront checkout records the normalized request Origin header, never body-supplied metadata.origin. Hosted order and Scalev PayLink URLs use HTTPS on that host only while it is a verified custom domain of the same business, connected to Scalev hosting. Otherwise links use the store's configured default domain if verified and owned by the same business, then the business's default Scalev domain if no eligible store domain exists. A CORS allowlist entry alone is insufficient. The same validation applies when generating later order responses and follow-up chat or WABA links. External provider URLs and configured custom destinations retain their existing behavior. Retained attribution parameters are forwarded onto a configured page or custom URL only while it stays on the currently validated checkout host or a Scalev-owned one. Null only when required order identity or host data is unavailable.
  - `order_id` string, required
  - `status` string, required
  - `payment_status` string, nullable, required: Buyer-facing payment status. A settled payment is exposed as `paid`; this field never returns `settled`.
  - `post_payment_redirect_url` string, uri: Canonical post-payment destination exposed only after a buyer-paid outcome (internal payment status `paid` or `settled`) when a valid redirect snapshot exists. Omitted before payment and when Scalev's hosted success flow applies.
  - `is_probably_spam` boolean, nullable
  - `draft_time` string, date-time, nullable
  - `paid_time` string, date-time, nullable
  - `transfer_time` string, date-time, nullable
  - `transferproof_url` string, nullable
  - `handler_phone` string, nullable
  - `chat_message` string, nullable
  - `customer_id` integer, nullable
  - `discount_code_code` string, nullable
  - `page` object, nullable
    - `slug` string, nullable
  - `gross_revenue` union, required
    - string, nullable
    - number
  - `product_price` union, required
    - string, nullable
    - number
  - `product_discount` union
    - string, nullable
    - number
  - `shipping_cost` union, required
    - string, nullable
    - number
  - `shipping_discount` union
    - string, nullable
    - number
  - `other_income` union
    - string, nullable
    - number
  - `payment_link_income` union
    - string, nullable
    - number
  - `other_income_name` string, nullable: Other Income label. For `payment_link`, the winning concrete Payment Request's frozen Store label is reconciled after payment.
  - `unique_code_discount` union
    - string, nullable
    - number
  - `discount_code_discount` union
    - string, nullable
    - number
  - `pg_payment_info` object, required: Buyer-facing payment gateway payload. Manual methods such as `bank_transfer` and `cod` can return an empty object. Virtual account methods expose provider reference and account details under the provider's `payment_method` object. QRIS responses expose QR data or a QR image payload. E-wallet, card, and invoice methods may expose provider actions or hosted provider URLs. SingaPay payments use normalized keys such as `payment_url`, `deeplink_url`, `qr_string`, `qr_image_url`, `va_number`, and `va_name`.
  - `status_history` object[]
  - `payment_method` string, required
  - `epayment_provider` string, nullable: E-payment provider. `xendit` is the current/managed Xendit provider; `xendit_legacy` is the owned legacy Xendit provider. Other possible values include `duitku`, `midtrans`, `durianpay`, and `singapay`.
  - `payment_account_holder` string, nullable
  - `payment_account_number` string, nullable
  - `shipment_status_history` object[]
    - `timestamp_source` string, nullable
    - `status` string, nullable
    - `description` string, nullable
  - `shipment_receipt` string, nullable
  - `courier_service` object, nullable
    - `name` string, nullable
    - `courier` object, nullable
      - `name` string, nullable
  - `variants` object
  - `bundle_price_options` object
  - `orderlines` object[], required
    - `quantity` integer
    - `product_name` string, nullable
    - `item_type` string, nullable
    - `variant_option1_value` string, nullable
    - `variant_option2_value` string, nullable
    - `variant_option3_value` string, nullable
    - `variant_price` union
      - string, nullable
      - number
  - `payment_expiration_at` string, date-time, nullable
  - `store_custom_domain` object, nullable
    - `full_url` string, nullable
  - `store` object, nullable
    - `name` string, nullable
    - `payment_accounts` object[]
      - `id` integer
      - `account_holder` string, nullable
      - `account_number` string, nullable
      - `method` string, nullable
      - `financial_entity` object, nullable
        - `id` integer
        - `code` string, nullable
        - `name` string, nullable
    - `custom_domain` object, nullable
      - `full_url` string, nullable
    - `days_of_payment_processing` integer, nullable
    - `is_auto_expire` boolean, nullable
    - `auto_expire_days` integer, nullable
    - `is_show_whatsapp` boolean, nullable
    - `is_show_download_invoice` boolean, nullable
  - `destination_address` object, nullable
    - `name` string, nullable
    - `phone` string, nullable
    - `address` string, nullable
    - `subdistrict` string, nullable
    - `kelurahan` string, nullable
    - `city` string, nullable
    - `province` string, nullable
  - `customer` object, nullable
    - `email` string, nullable

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Not Found

## Changes

- **2026-11-03** `6b9152f04622`: 4 info
  - added the new optional request property `metadata`
  - added the optional property `google_ads_items` to the response with the `201` status
  - added the optional property `google_ads_purchase` to the response with the `201` status
  - added the optional property `tracking_form_delivery` to the response with the `201` status
- **2026-10-22** `b4add50bab84`: 1 info
  - added the optional property `destination_address/kelurahan` to the response with the `201` status
- **2026-09-27** `215156c4eee0`: 2 info
  - added the optional property `redirect_url` to the response with the `201` status
  - response property `payment_url` deprecated
- **2026-09-16** `40f39d0fda73`: 1 info
  - added the new optional request property `checkout_intent_token`
- **2026-08-04** `4354959d76dc`: 2 info
  - added `#/components/schemas/StorefrontMoneyValue` to the `other_income` response property `allOf` list for the response status `201`
  - removed `subschema #1, subschema #2` from the `other_income` response property `oneOf` list for the response status `201`

[Operation history](https://skmtc.dev/scalev/apis/nexus-commerce-api/changes/v3/stores/:store_id/customers/me/checkout/post.md)

---

[API](https://skmtc.dev/scalev/apis/nexus-commerce-api.md) - [All operations](https://skmtc.dev/scalev/apis/nexus-commerce-api/llms.txt) - [OpenAPI document](https://skmtc.dev/scalev/apis/nexus-commerce-api/revisions/6b9152f04622?raw)
