No rates is a success response with an empty list, and a checkout without a selected rate can never be paid. A shipping method that does not apply is left out of the list, so first work through why a method does not appear: the method is inactive or has no shipping categories; a product has no shipping category and no default is set; one product's category is not covered by the method, which removes the method for the whole order; for pickup, the warehouse is not one of the method's; or the method's template failed, or ran without calling rates.create for this order. Then:

  • The shipping call answered 500. With tax switched on, creating shipping also calculates tax, so a tax provider that fails or cannot be reached stops shipping from being saved. The failed result is cached for up to an hour (when a provider is down).
  • The address is incomplete or in the wrong form. countryName, addressLine1 and postcode are required, and countryName is the full name, Australia, not AU. A method template that compares country codes matches nothing.
  • The rates expired. A rate lasts an hour (the Shipping rate Lifetime setting). A shopper who comes back later must have shipping created again.
  • Zones were expected to choose the method. Shipping zones are read by nothing. A method meant for one region must check the address in its own template.
  • The page reads the rates from the wrong place. Rates belong to a fulfilment: they are at fulfillments[].shippingRates in the response.