Table of Contents
Order Placement Flow
Convert a customer's shopping cart (Quote) into a confirmed Order
Entry Points
Magento\Checkout\Model\Type\Onepage::saveOrder()
Magento\Sales\Controller\Adminhtml\Order\Create\Save
POST /V1/carts/mine/order
mutation { placeOrder(input: {...}) }
Execution Steps
Quote Submission
Validates the quote and initiates the conversion process to an order entity.
public function submit(QuoteEntity $quote, $orderData = [])
{
// 1. Validate quote
$this->validateQuote($quote);
// 2. Trigger quote_submit_before event
$this->eventManager->dispatch('checkout_submit_before', ['quote' => $quote]);
// 3. Convert quote to order
$order = $this->quoteToOrderConverter->convert($quote);
// 4. Save order
$order = $this->orderRepository->save($order);
// 5. Trigger checkout_submit_all_after event
$this->eventManager->dispatch('checkout_submit_all_after',
['order' => $order, 'quote' => $quote]);
return $order->getId();
}
Quote to Order Conversion
Creates order entities from quote data including items, addresses, and payment information.
Entities Created
-
sales_order- Main order record -
sales_order_item- Order items from quote items -
sales_order_address- Billing/shipping addresses -
sales_order_payment- Payment information
Order Persistence
Persists order data to database tables and updates admin grid for display.
| Database Table | Purpose |
|---|---|
sales_order |
Main order record |
sales_order_grid |
Admin grid display optimization |
sales_order_status_history |
Order status change log |
Order State Initialization
Event Triggers
Multiple events are dispatched throughout the order placement flow for extensibility.
checkout_submit_before
sales_model_service_quote_submit_before
sales_model_service_quote_submit_success
checkout_submit_all_after
Common Issues
- Quote validation failures: Missing required fields (email, address)
- Payment authorization failures: Declined cards, gateway timeouts
- Inventory reservation failures: Out of stock items
- Database deadlocks: High concurrency during sales
Order State/Status Transitions
Understand the order lifecycle and valid state machine transitions
States (System-Level)
Immutable system states that control order behavior
-
STATE
newOrder created, payment pending
-
STATE
pending_paymentAwaiting payment authorization
-
STATE
processingPayment captured, fulfillment in progress
-
STATE
completeFully shipped/delivered
-
STATE
closedCompleted with refunds or cancelled with refunds
-
STATE
canceledCancelled before fulfillment
-
STATE
holdedOn hold (manual admin action)
Statuses (Display Labels)
Customizable labels shown to merchants and customers
-
pendingNew order, payment pending
-
processingBeing processed
-
completeCompleted
-
canceledCancelled
-
on_holdOn administrative hold
-
Custom StatusesMerchants can create additional statuses
Valid State Transitions
Performance Considerations
Order Grid Performance Issue
Large order volumes can slow down admin grid queries significantly.
ALTER TABLE sales_order_grid
ADD INDEX idx_customer_email (customer_email);
ALTER TABLE sales_order_grid
ADD INDEX idx_created_at (created_at);
Order Load Optimization
Use repository pattern with search criteria for efficient order loading.
// Use repository with field filtering
$searchCriteria = $this->searchCriteriaBuilder
->addFilter('increment_id', $orderNumber)
->create();
$orders = $this->orderRepository
->getList($searchCriteria);