CarrierService callback returns market-converted subtotal in shop currency, breaking order-total rate conditions

Hey Shopify community,

We run a shipping rates app that uses the CarrierService API. We serve rate tiers based on the cart subtotal (min/max order price conditions). This works correctly for the shop’s base market, but breaks when Shopify Markets is enabled with a secondary market that applies currency conversion.

The problem: the rate request payload gives us a subtotal that has the market’s FX conversion already applied, but it is still labelled in the shop’s base currency. We have no field to recover the true base-currency subtotal or the presentment currency and rate that were applied, so we cannot map the value back to the merchant’s configured tiers.

Reproduction:

  1. Shop base currency GBP. Product priced at 399 GBP.

  2. Add a secondary market (e.g. Bulgaria) with EUR and Shopify’s dynamic conversion enabled.

  3. Check out against the base (GB) market. The CarrierService request reports 399 GBP. Correct.

  4. Check out against the secondary market. The CarrierService request reports 404.99 GBP instead of 399 GBP. The subtotal has been run through the EUR conversion but is still stamped as GBP.

Result: a merchant tier like “orders 0 to 500 GBP → flat rate” evaluates against 404.99 rather than 399. With a larger FX ratio, the divergence is much wider, and a subtotal can fall into the wrong tier entirely (we have a live merchant case where a CAD 69 order lands in the wrong tier because the request total arrives as ~49 after a 1:1 CAD to USD rate).

Questions for the platform:

  1. In the CarrierService callback, is there any way to obtain the un-converted subtotal in the shop’s base currency, before market FX is applied?
  2. Alternatively, can the payload expose the presentment currency and the exchange rate applied, so we can reverse the conversion ourselves?
  3. Is this the intended behaviour for CarrierService under Shopify Markets, or a known gap? (For context, Rate Functions mode does not exhibit this, which is what leads us to suspect a CarrierService-specific limitation.)

Thanks!

Hi @Veno_Zapiet - thanks for raising this.

I’m going to dig into this and I’ll follow up here once I have more information to share.

Hey @Wes-Dev-Shopify,

Just circling back on this one. Has there been any movement since your last reply?

Happy to provide anything else that would help, whether that’s more examples, request IDs or a reproduction case.

Thanks,
Veno

Hey @Veno_Zapiet - thanks for following up, and for your patience while I dug into this.

I’ve confirmed that your analysis is correct. CarrierService currently reconstructs the shop-currency amount from the buyer’s market-presentment amount. That reverse conversion can leave the conversion fee or market adjustment in the value, even though the callback labels it in the shop currency. The altered amount is a known limitation, not intended app-facing behaviour.

The callback doesn’t currently provide the original shop-currency subtotal, presentment currency, or applied FX rate, so there isn’t a reliable way to recover the original £399 value in your example. If Rate Functions is suitable for your setup, it sounds like it avoids this CarrierService-specific conversion path and is the only workaround we can point to right now.

This issue has come up in the past and is being reviewed again with the broader multi-currency cases in mind, in part based on your feedback. I don’t have a fix or timeline to share at this point in time, but I’ll update this thread if that changes.

I appreciate the detailed reproduction and for surfacing the impact this has on threshold-based rates. Hope this helps clarify where things stand!