# From product to first order Follow one Copenhagen Lamp from its prepared catalog state to an order you can inspect in Admin. Use the existing product and IDs from catalog setup throughout the walkthrough. ## Before you begin Complete [Configure a store](/guides/catalog/configure-store) and [Create and publish a product](/guides/catalog/create-product). Retain the project slug, store, price channel, and variant IDs. Configure the shipping, tax, and test payment method required by your checkout. Use a test environment and test payment flow for this walkthrough. ## 1. Verify the buyer's view Storefront API ```graphql query ReadLamp($slug: String!, $storeId: ID!, $priceChannelId: ID!, $currency: String!, $country: String!) { product(slug: $slug, storeId: $storeId, priceChannelId: $priceChannelId, priceCurrency: $currency, priceCountry: $country) { id name variants(first: 20) { nodes { id sku price { value { centAmount currencyCode fractionDigits } discountedPrice { value { centAmount currencyCode fractionDigits } } } availability { availableForPurchase } } } } } ``` Variables ```json { "slug": "copenhagen-lamp", "storeId": "", "priceChannelId": "", "currency": "EUR", "country": "DK" } ``` Expect `LAMP-BLACK` with the configured EUR price and purchase availability. Do not continue if a different context produced the price you expect. Use [Catalog visibility](/concepts/catalog/publication) to correct missing prerequisites. ## 2. Create one cart Use the complete [Storefront quickstart cart mutation](/getting-started/storefront-quickstart#2-create-a-cart) with the verified variant ID and identical context. Persist the returned cart ID and checkout URL. Avoid creating another cart after a timeout until you have checked whether the first request succeeded. ## 3. Complete test checkout Open the returned `checkoutUrl` for hosted checkout. Enter the contact and address information your test requires, select an available shipping method, and complete the configured test payment flow. If you are building custom checkout, follow [Build a cart and checkout](/guides/storefront/cart-and-checkout) instead. Keep the resulting order ID. A payment redirect alone is not proof that the order exists. For a lost completion response, use the same-cart recovery described in [Order placement](/concepts/checkout/order-placement). ## 4. Verify through Admin Admin API ```graphql query VerifyFirstOrder($id: ID!) { order(id: $id) { id orderNumber orderState paymentState shipmentState lineItems(first: 20) { nodes { id quantity } } } } ``` Variables ```json { "id": "" } ``` Confirm the order number, purchased quantity, and the payment state expected for your configured method. An order does not need to be shipped just because checkout finished. Use [Fulfill an order](/guides/operations/fulfill-order) for the next operational step.