Search in documentation
ctrl+4K
Modules
Authentication
Merchant
Catalog
Order
Events
Logistics
Shipping
Review
Financial
Solutions

Orders outside iFood platform

Use this documentation to integrate orders created in external systems (without pre-existing orderId) with iFood's On Demand delivery service. Ideal for integrators who manage their own order systems and want to contract iFood's logistics services.
The flow consists of 5 main stages:
  1. Check availability - Validate coverage and get quote
  2. Register order - Create the order and allocate driver
  3. Manage address - Confirm or change delivery address
  4. Cancel order - Cancel as needed
  5. Monitor trust level - Track delivery security level
ClientAPIEvent Polling1. Check availabilityGET /merchants/{merchantId}/deliveryAvailabilitiesQuote and delivery windows2. Register orderPOST /merchants/{merchantId}/ordersConfirmation code eventOrder ID + tracking URL3. Manage addressPOST /orders/{orderId}/[userConfirmAddress | deliveryAddressChangeRequest]DELIVERY_ADDRESS_CHANGE_*202 Accepted4. Cancel orderPOST /orders/{orderId}/cancelCANCELLATION_REQUESTED202 AcceptedClientAPIEvent Polling
Check delivery availability to validate coverage, obtain price, and estimated time.This stage is essential for:
  • Validating that the address is within iFood coverage area
  • Identifying temporary unavailability (high demand, off-hours)
  • Obtaining price information (gross, discount, surcharge) and estimated time
  • Avoiding failures in order creation
  • Better planning of preparation time
We recommend performing this check to improve success rate and user experience.
GET /shipping/v1.0/merchants/{merchantId}/deliveryAvailabilities?latitude={lat}&longitude={lng}
ParameterLocationTypeRequiredDescription
merchantIdpathuuidYesMerchant ID (your store)
latitudequeryfloatYesLatitude of delivery address (ex: -23.55)
longitudequeryfloatYesLongitude of delivery address (ex: -46.63)
curl -X GET "https://merchant-api.ifood.com.br/shipping/v1.0/merchants/{merchantId}/deliveryAvailabilities?latitude=-23.5505&longitude=-46.6333" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json"
Valid quote obtained successfully. Use the returned id as quoteId when registering the order.

Response fields

FieldTypeDescription
iduuidQuote ID (use as quoteId when creating order)
expirationAtdatetimeQuote validity in UTC (~24h). Requesting after is invalid.
createdAtdatetimeQuote creation date in UTC
distanceintegerDelivery distance in meters
preparationTimeintegerSuggested preparation time in seconds
quote.grossValuedecimalGross delivery value in reals
quote.discountdecimalApplied discount in reals
quote.raisedecimalApplied surcharge in reals
quote.netValuedecimalNet value = grossValue - discount + raise
deliveryTime.minintegerEstimated minimum delivery time in seconds
deliveryTime.maxintegerEstimated maximum delivery time in seconds
hasPaymentMethodsbooleanIndicates if payment methods are available
paymentMethods[].iduuidUnique payment method ID
paymentMethods[].brandstringCard brand (ex: Visa, Mastercard)
paymentMethods[].liabilitystringPayment responsible party (ex: IFOOD)
paymentMethods[].paymentTypestringPayment type (ex: OFFLINE for cash on delivery)
paymentMethods[].methodstringPayment method: CREDIT, DEBIT or CASH

Example response

{
  "id": "57cd1046-2e06-446f-a2dd-18a518212c3c",
  "expirationAt": "2023-08-18T19:49:06Z",
  "createdAt": "2023-08-17T19:49:06Z",
  "distance": 3000,
  "preparationTime": 60,
  "quote": {
    "grossValue": 7.99,
    "discount": 0,
    "raise": 0,
    "netValue": 7.99
  },
  "deliveryTime": {
    "min": 1200,
    "max": 1800
  },
  "hasPaymentMethods": true,
  "paymentMethods": [
    {
      "id": "21c65a8c-f29e-463f-b0bd-240edeb593c4",
      "brand": "Visa",
      "liability": "IFOOD",
      "paymentType": "OFFLINE",
      "method": "CREDIT"
    },
    {
      "id": "93c1c7c7-61f1-4dd9-bb84-62a03254701d",
      "liability": "IFOOD",
      "paymentType": "OFFLINE",
      "method": "CASH"
    }
  ]
}
Interpreting the response:
  • Distance: 3 km
  • Price: R$ 7.99 (no discount or surcharge)
  • Estimated time: 20-30 minutes
  • Payment methods: Visa card or Cash available

The API returns 400 Bad Request when delivery is not available. Check the error codes to determine the cause.
For detailed solutions for each error, consult Best practices and troubleshooting.

Error codes

CodeDescriptionRecommended Action
BadRequestProblem in requestVerify if latitude and longitude are in correct format
BadRequestMerchantYour store is temporarily unavailableCheck store status in dashboard
DeliveryDistanceTooHighAddress more than ~10 km from storeConfirm coordinates with customer
OffOpeningHoursOutside logistics operating hoursTry again during business hours
OriginNotFoundStore not found in logistics areaRegister your store in iFood areas
ServiceAreaMismatchAddress outside iFood coverageConfirm if region has iFood delivery
HighDemandLogistics saturated temporarilyTry again in a few minutes
MerchantStatusAvailabilityYour account has pending issuesContact iFood support
InvalidPaymentMethodsPayment method not supportedUse another payment method
NRELimitExceededLimit of simultaneous drivers reachedWait for ongoing deliveries to complete
UnavailableFleetDriver fleet unavailableTry again later

Temporary server error. Try again in a few seconds.What to do: Implement automatic retry with exponential backoff. After 3-5 failed attempts, log and notify support.
Register a new order and automatically allocate an iFood driver for orders created outside the platform.Understand how the system works:
  • A driver is allocated automatically after successful registration
  • If delivery is not viable, the order will not be created
  • Validate all data before sending to avoid rejections
  • Registration is an asynchronous operation; use the returned id for tracking
For security, a confirmation code is automatically generated. The driver will request this code from the customer to validate identity.

Two modes available

Mode 1: With code (default - recommended)
  • Send customer.phone.type="CUSTOMER" with valid number
  • The code will be the last 4 digits of the phone
  • Driver will request the code before delivery
  • More secure; recommended for high-value deliveries
Mode 2: Without code (authorization only)
  • Send customer.phone.type="STORE"
  • Code will not be requested
  • Presence validation only
  • Use when customer cannot provide validation

Inform the customer

Inform the customer in advance that the driver will request validation (code or confirmation). Failure or refusal may result in cancellation without refund.

For integrators without iFood tracking page

If your platform does not use iFood's tracking page, implement:
  1. Listen for the event DELIVERY_DROP_CODE_REQUESTED
  2. Extract the code from metadata.CODE of the event
  3. Display to customer via SMS, email or app
  4. Communicate with driver to request validation
Flow: Monitor events → Extract code → Notify customer → Driver validates
POST /shipping/v1.0/merchants/{merchantId}/orders
curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/merchants/{merchantId}/orders" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "customer": {
      "name": "João Silva",
      "phone": {
        "countryCode": "55",
        "areaCode": "11",
        "number": "999999999",
        "type": "CUSTOMER"
      }
    },
    "delivery": {
      "merchantFee": 5.99,
      "quoteId": "57cd1046-2e06-446f-a2dd-18a518212c3c",
      "deliveryAddress": {
        "postalCode": "01310100",
        "streetNumber": "100",
        "streetName": "Avenida Paulista",
        "neighborhood": "Bela Vista",
        "city": "São Paulo",
        "state": "SP",
        "country": "BR",
        "coordinates": {
          "latitude": -23.5505,
          "longitude": -46.6333
        }
      }
    },
    "items": [{
      "id": "item-1",
      "name": "Hambúrguer",
      "quantity": 1,
      "unitPrice": 25.00,
      "price": 25.00,
      "optionsPrice": 0,
      "totalPrice": 25.00
    }],
    "payments": {
      "methods": [{
        "method": "CREDIT",
        "type": "OFFLINE",
        "value": 30.99,
        "card": {
          "brand": "Visa"
        }
      }]
    }
  }'
Order created successfully. A driver is being allocated.
{
  "id": "522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8",
  "trackingUrl": "https://meupedido.ifood.com.br/522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8"
}
Returned fields:
  • id (uuid) - Unique order ID created (use for future operations)
  • trackingUrl (string) - Tracking URL shareable with customer
Next actions:
  • Share the trackingUrl with customer to track delivery
  • Monitor delivery events by polling with the returned id
  • Implement listeners for events like DELIVERY_DROP_CODE_REQUESTED, DELIVERY_IN_TRANSIT, DELIVERY_CONCLUDED
Required fields marked with *

Customer

FieldTypeDescription
customer.name*stringName (max. 50 characters)
customer.phone.typestringCUSTOMER (default) or STORE
customer.phone.countryCode*stringCountry code (2 digits). Ex: 55
customer.phone.areaCode*stringArea code (2 digits). Ex: 11
customer.phone.number*stringPhone (7-9 digits)
* Not required if customer.phone.type="STORE"

Delivery

FieldTypeDescription
delivery.merchantFee*floatPartner fee
delivery.preparationTimeintegerPreparation time (seconds)
delivery.quoteIduuidQuote ID
delivery.deliveryAddress.postalCode*stringPostal code (8 digits)
delivery.deliveryAddress.streetNumber*stringStreet number
delivery.deliveryAddress.streetName*stringStreet name (max. 50 characters)
delivery.deliveryAddress.complementstringComplement (max. 50 characters)
delivery.deliveryAddress.referencestringReference (max. 70 characters)
delivery.deliveryAddress.neighborhood*stringNeighborhood (max. 50 characters)
delivery.deliveryAddress.city*stringCity (2-50 characters)
delivery.deliveryAddress.state*stringState (2 letters). Ex: SP
delivery.deliveryAddress.country*stringCountry (2 letters). Ex: BR
delivery.deliveryAddress.coordinates.latitude*floatLatitude
delivery.deliveryAddress.coordinates.longitude*floatLongitude

Items

FieldTypeDescription
items[].id*uuidItem ID
items[].name*stringName (max. 50 characters)
items[].externalCodestringExternal code
items[].quantity*integerQuantity (> 0)
items[].unitPrice*floatUnit price (≥ 0)
items[].price*floatTotal price (quantity * unitPrice)
items[].optionsPrice*floatAdd-ons price (≥ 0)
items[].totalPrice*floatTotal (price + optionsPrice)

Payments

Offline Payment:
FieldTypeDescription
payments.methods[].method*stringCREDIT, DEBIT or CASH
payments.methods[].type*stringOFFLINE
payments.methods[].value*floatAmount
payments.methods[].card.brand*stringBrand (if CREDIT/DEBIT)
payments.methods[].cash.changeFor*floatChange (if CASH)
Online Payment: Do not send payments object (processed by merchant)

Other fields

FieldTypeDescription
displayIdstringFriendly ID (max. 4 characters). Ex: A4BC
metadataobjectAdditional information (max. 20 characters)
The delivery.preparationTime parameter (in seconds) controls when the driver will be allocated. This is critical for customer experience.

Why preparation time matters

Incorrect timing results in serious operational issues:
ScenarioProblemImpact
Too shortDriver arrives before order is readyCustomer waits, driver idle
Too longDriver waits without purposeQueue congestion, inefficient allocation
CorrectDriver and order ready simultaneouslyOptimal operation, satisfied customer

How to use

Option 1: Immediate allocation (default)
{
  "delivery": {
    // Do not send preparationTime or send 0
  }
}
→ Driver allocated immediatelyOption 2: Delayed allocation (recommended)
{
  "delivery": {
    "preparationTime": 900  // 15 minutes in seconds
  }
}
→ Driver allocated after 15 minutes

Best practices

  1. Use real data: Base preparationTime on your average preparation time
  2. Check the quote: The availability endpoint returns suggested preparationTime - use as reference
  3. Adjust iteratively: Monitor if drivers arrive early/late and adjust
  4. Add buffer: Consider peaks - it's better to deliver slightly late than lose orders

Practical example

Your business data:
- Average preparation time: 12 minutes
- Typical variation: ±2 minutes
- Safety margin: +3 minutes

Recommendation:
preparationTime = (12 + 3) * 60 = 900 seconds (15 minutes)
After successfully creating the order, implement event monitoring:
  • Source: Event polling
  • Filter: Orders with salesChannel="POS" (use the returned id)
  • Critical events:
    • DELIVERY_DROP_CODE_REQUESTED - Confirmation code needed
    • DELIVERY_IN_TRANSIT - Driver left for delivery
    • DELIVERY_CONCLUDED - Delivery completed
    • DELIVERY_CANCELLED - Delivery cancelled
  • Tracking: Use the order id at tracking endpoint to get location

Invalid request or service unavailable.
For detailed solutions for each error, consult Best practices and troubleshooting.
CodeDescriptionRecommended Action
BadRequestInvalid data in requestVerify all required fields (marked with *)
BadRequestCustomerCustomer unavailable or invalidCheck customer name, phone
BadRequestMerchantYour store is unavailableCheck store status in dashboard
DeliveryDistanceTooHighAddress outside coverageConfirm coordinates with customer
HighDemandLogistics saturated nowTry again in a few minutes
MerchantEasyDeliveryDisabledService not enabled for your storeEnable service in iFood dashboard
OffOpeningHoursOutside operating hoursWait for business hours
OriginNotFoundStore not located in logistics areaRegister your store in iFood areas
PaymentMethodNotFoundPayment method not supportedUse available method (CREDIT, DEBIT or CASH)
PaymentTotalInvalidPayment amount ≠ order totalVerify sum of items + delivery
ServiceAreaMismatchAddress outside service areaConfirm iFood coverage in region
NRELimitExceededLimit of simultaneous driversWait for ongoing deliveries to complete

Temporary server error. Try again in a few seconds.What to do: Implement retry with exponential backoff. After 3-5 failed attempts, log and notify support.
Manage address changes after the order is created. Customers can confirm the address or request a change.Customer uses iFood's page (trackingUrl) to confirm/change address securely.Requirements:
  • Order cannot have customer.phone.type="STORE"
  • Valid phone is required (receives OTP via SMS)
  • Use URL returned on order creation
Flow: Customer accesses URL → Receives OTP via SMS → Validates address → ConfirmsAdvantage: iFood manages security, OTP, validation

Option B: Without iFood tracking page (custom integration)

Your platform implements your own confirmation/change interface using the endpoints.Requirements:
  • You manage the user interface
  • Your responsibility to validate and implement security
Flow: Customer confirms in your app → You call endpoints → Monitor eventsNote: iFood does not send OTP. You choose how to validate (password, custom OTP, etc).
Security: If you use OTP, implement proper validation. Incorrect addresses result in delivery failures.
Used when customer confirms the provided address is correct (no changes).
POST /shipping/v1.0/orders/{orderId}/userConfirmAddress

Example request

curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/userConfirmAddress" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json"

Response - 202 Accepted

Confirmation registered successfully.Event generated: DELIVERY_ADDRESS_CHANGE_USER_CONFIRMEDMonitor this event to be notified when customer confirms.
Customer can request to change delivery address after order creation (maximum 500m from original coordinate).
POST /shipping/v1.0/orders/{orderId}/deliveryAddressChangeRequest

Parameters

ParameterTypeRequiredDescription
streetNumberstringNoStreet number (ex: 200)
streetNamestringYesStreet name (ex: Flower Street)
complementstringNoComplement (ex: Apt 42)
neighborhoodstringYesNeighborhood (ex: Center)
citystringYesCity (ex: São Paulo)
statestringYesState (ex: SP, 2 letters)
countrystringYesCountry (ex: BR, 2 letters)
referencestringNoReference (ex: Near the station)
coordinates.latitudefloatYesLatitude of new address
coordinates.longitudefloatYesLongitude of new address

Example request

curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/deliveryAddressChangeRequest" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "streetNumber": "200",
    "streetName": "Rua das Flores",
    "complement": "Apto 42",
    "neighborhood": "Centro",
    "city": "São Paulo",
    "state": "SP",
    "country": "BR",
    "reference": "Perto da estação",
    "coordinates": {
      "latitude": -23.5510,
      "longitude": -46.6340
    }
  }'

Response - 202 Accepted

Change request registered. Your system must respond within 15 minutes.Event generated: DELIVERY_ADDRESS_CHANGE_REQUESTEDMonitor this event to be notified of the request and offer options to the customer.

Important restrictions

RestrictionLimitConsequence
Maximum distance500m from original coordinateChanges larger are rejected
Response deadline15 minutesAfter that, automatic rejection
Region changeNot allowedGenerates automatic denial event
Your system approves the address change requested by the customer.
POST /shipping/v1.0/orders/{orderId}/acceptDeliveryAddressChange

Example request

curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/acceptDeliveryAddressChange" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json"

Response - 200 OK

Change accepted successfully.Event generated: DELIVERY_ADDRESS_CHANGE_ACCEPTEDSpecial note: If the new address falls in another region, iFood automatically denies with event DELIVERY_ADDRESS_CHANGE_DENIED and metadata.action="region-mismatch".
Your system denies the address change requested (when not viable, for example).
POST /shipping/v1.0/orders/{orderId}/denyDeliveryAddressChange

Example request

curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/denyDeliveryAddressChange" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json"

Response - 202 Accepted

Denial registered successfully.Event generated: DELIVERY_ADDRESS_CHANGE_DENIED
CodeStatusDescriptionAction
BadRequest400Invalid parametersCheck coordinates, street name, city
OrderNotFound404Order not found or expired (>8h)Order is valid for up to 8 hours
ChangeAddressOperationConflict409Operation in conflictAnother change already pending
ChangeAddressOperationNotStarted409No pending changeNo request to accept/deny
MaxDistanceHigherThanAllowed400Change > 500m from original coordinateRequest outside allowed limit
RegionMismatch400New address in different regionAddress in different iFood coverage
Cancel orders created outside the platform (salesChannel="POS"). The process is in two stages: get valid reasons and send cancellation.Before canceling, check valid reasons. You cannot hardcode reasons.
GET /shipping/v1.0/orders/{orderId}/cancellationReasons

Example request

curl -X GET "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/cancellationReasons" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json"

Response - 200 OK

List of valid reasons for this specific order.
[
  {
    "cancelCodeId": "817",
    "description": "Customer cancelled the order"
  },
  {
    "cancelCodeId": "818",
    "description": "Unable to prepare order"
  }
]
Fields:
  • cancelCodeId (string) - Unique reason code (use in cancellation)
  • description (string) - Readable description to show operator

Response - 204 No Content

Order cannot be cancelled (already delivered, cancelled, etc). No action needed.
After getting valid reasons, send cancellation with code and reason.
POST /shipping/v1.0/orders/{orderId}/cancel

Parameters

FieldTypeRequiredDescription
reasonstringYesExplanatory text for cancellation (for logs)
cancellationCodeintegerYesCode obtained in 4.1 (ex: 817)

Example request

curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/cancel" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Customer requested cancellation via chat",
    "cancellationCode": 817
  }'
Body:
{
  "reason": "Customer requested cancellation via chat",
  "cancellationCode": 817
}

Response - 202 Accepted

Cancellation registered. Monitor events for confirmation.Event sequence:
  1. CANCELLATION_REQUESTED - Cancellation requested
  2. CANCELLED - Cancellation confirmed successfully
  3. CANCELLATION_REQUEST_FAILED - Cancellation failed (ex: driver already left)
Monitor by polling to know final result.
Automatic scoring system that calculates the trust level of each delivery based on customer and address validation factors.Use the score for: Making operational decisions (ex: request extra confirmation for LOW, prioritize HIGH/VERY_HIGH).
LevelDescriptionWhen it occursRecommendation
LOWLow trustInvalid customer or change deniedRequest extra customer confirmation
MODERATEModerate trustLandline phone (weaker validation)Monitor carefully
HIGHHigh trustValid mobile phoneStandard processing
VERY_HIGHVery high trustValid phone + address confirmedPrioritize, lower risk
The score is calculated by combining the following factors:
RuleDescriptionImpact
customer_phone_validValid mobile phone (11+ digits, type CUSTOMER)Increases trust
customer_phone_is_fixedLandline phone (8 digits)Intermediate trust
customer_address_confirmedCustomer confirmed addressIncreases much
customer_address_change_requestedCustomer requested address changeReduces (may indicate initial error)
merchant_address_change_approvedYou approved changeImproves score
merchant_address_change_deniedYou denied changeReduces significantly
Scenario 1: No validation
`customer_phone_valid`=false
→ Score: LOW (high risk)

Scenario 2: Landline phone only
`customer_phone_is_fixed`=true
→ Score: MODERATE

Scenario 3: Valid mobile phone
`customer_phone_valid`=true
→ Score: HIGH

Scenario 4: Phone + Address confirmed
`customer_phone_valid`=true +
`customer_address_confirmed`=true
→ Score: VERY_HIGH (maximum trust)

Scenario 5: Change approved
`customer_phone_valid`=true +
`merchant_address_change_approved`=true
→ Score: VERY_HIGH

Scenario 6: Change denied
`customer_phone_valid`=true +
`customer_address_change_requested`=true +
`merchant_address_change_denied`=true
→ Score: LOW (distrust)
GET /shipping/v1.0/orders/{orderId}/safeDelivery

Example request

curl -X GET "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/safeDelivery" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json"

Response - 200 OK

Score calculated with details of evaluated rules.
{
  "rules": {
    "customer_address_change_requested": false,
    "customer_address_confirmed": true,
    "customer_phone_is_fixed": false,
    "customer_phone_valid": true,
    "merchant_address_change_approved": false,
    "merchant_address_change_denied": false
  },
  "score": "VERY_HIGH"
}
Interpretation:
  • Customer has valid mobile phone ✓
  • Customer confirmed address ✓
  • No pending changes ✓
  • Score = VERY_HIGH (maximum trust)
Fields:
  • score (enum) - Level: LOW, MODERATE, HIGH, VERY_HIGH
  • rules.* (boolean) - Each rule true or false

Response - 400 OrderWithoutSafeDelivery

Order without applicable trust rules (created before system).

Response - 404 OrderNotFound

Order does not exist or expired (maximum 8 hours).
The score is not static - it changes as actions occur:

When score changes

EventImpactNew Score
Customer confirms addressIncreases trustCan rise to VERY_HIGH
Customer requests changeReduces (initial error?)Can drop to MODERATE/LOW
You approve changeIncreases trustCan return to VERY_HIGH
You deny changeReduces muchFalls to LOW
Time passesSome data expiresScore can drop over time

Best practice

Check the score near delivery time (not just on creation):
1. Order created → Score HIGH
   ↓ (Customer confirms address)
2. Before delivery → Score VERY_HIGH
   ↓ (Use for critical decisions)
3. Allocate resources or apply extra validations if LOW
Operational usage example:
  • Score VERY_HIGH → Standard delivery, no extra validation
  • Score HIGH → Normal monitoring
  • Score MODERATE → Consider advance customer contact
  • Score LOW → Require extra confirmation before delivery
Integration complete?
  1. Implement event polling to monitor deliveries in real-time
  2. Check the delivery tracking guide for real-time location
  3. Review the complete order flow to understand lifecycle
Ready for production?
  1. Test all scenarios (success, failure, cancellation, address change)
  2. Implement alerts and error monitoring
  3. Configure automatic retry with exponential backoff
  4. Prepare internal documentation and operator training
Questions?
Was this page helpful?
Rate your experience in the new Developer portal: