Merit · Al Fursan · Apple Store · Supplier integration

What happens when STC has no stock in the buyer's city

The Apple Store launches on 2 September with STC as the supplier. STC holds stock per city, our marketplace sells as if stock were national. This page walks the order flow, then lets you set the conditions and see exactly what the buyer gets.

From Brian Arfi Faridhi, Product
For Rahul Dev Singh, Aditya Sanka, Akshay Chennupati, Tahsin Ali
Built from STC technical call, 19 Aug and internal fallback session, 19 Aug
Date 20 August 2026

01Two systems that disagree about what "in stock" means

Neither side is wrong. They were built for different things, and the Apple Store is the first place the difference costs us money.

2 Sep

Launch date. Fixed. Apple and Al Fursan are both watching it.

5 to 10%

Expected order cancellations on the manual fallback path. Working estimate, not measured yet.

4

Questions STC has not answered. One of them decides the whole design.

Where the two models split

QuestionMerit marketplace todaySTC as supplier
Is this product available?Yes, if any city has stockOnly if the buyer's own city has stock
When is stock checked?At checkout, after the buyer has already chosen and committedExpected before the order is placed, as a separate availability call
Who fulfils?Decided once, at listing timeVaries by city and warehouse
What if it is gone?Order fails late, money is already taken, refund followsThe order should never have been accepted

A Riyadh buyer can browse, add to cart, pay, and only then be told the item is not available to them. That is a refund, a support ticket, and a bad first impression on the store Apple is watching.

The ask we made, and its status

We asked STC for cross-city fulfilment, meaning they ship from another city when the buyer's city is dry. That single answer removes most of this page. STC has not confirmed it is supported, and until they do we have to design as if the answer is no.

02The order flow, and the two places it can break

Same journey the buyer already takes. The only new thing we are proposing is one call, at one point.

Buyer journey, with the stock checkpoints marked

Today Browse Apple Store Product page shows "available" Cart buyer commits Checkout payment taken Fulfilment STC or Aleph no city check here only stock check today Proposed Validate at checkout one call, STC and Aleph Stock somewhere order accepted No stock anywhere blocked before payment No refund no support ticket

The proposed change costs a loading spinner on the checkout button and one API call. It does not move the checkout, does not change the cart, and does not touch the product page. Whether it can be done without a marketplace platform change is the question for Aditya.

03What happens when, if what

Set the four conditions on the left. The right side is what the buyer sees, what ops has to do, and what it costs us. Every combination below is a real state we can be in on 2 September.

Condition 1

Does STC have the item in the buyer's city?

Condition 2 · unanswered by STC

Has STC confirmed cross-city fulfilment?

Condition 3

Does Aleph have the item?

Condition 4 · our decision

Did we build the checkout stock validation?

Condition 2 is the one worth staring at. Set it to "Confirmed" and every red outcome on this page disappears, which is why the unanswered question matters more than anything we can build.

04After the rejection, and why it is worse than the rejection

Blocking the order at checkout saves the refund. It does not save the experience. The moment the buyer is turned away, three things are true at once, and the third one is the real damage.

What the buyer is holding, one second after being refused

1
They have already chosen. They want this specific item.
They browsed, compared, decided, and entered checkout. All of that intent is still there and now has nowhere to go.
2
The list page still says the item is available.
Because nothing on the product list or product page ever checked their city. From where they stand, the site is contradicting itself.
3
Nothing tells them why, or what to do next.
This is the damage. "Out of stock" after they picked it does not read as a stock problem, it reads as a broken store. So they retry, hit the same wall, and either open a support ticket or leave. On a store Apple is watching, at launch.

The cheapest fix is not a stock fix, it is a wording fix

The item is not out of stock. It is out of stock for them, which is a different sentence with a different set of exits. Saying the true thing costs a copy change and turns a dead end into a choice.

What the buyer gets today

Out of stock

This item is currently unavailable.

Back to cart

Untrue, unactionable, and contradicted by the page they came from. Their only move is to try again.

What we propose

We cannot deliver this to Riyadh right now

The item is in stock, but not in a warehouse that serves your city. Here is what we can do.

Notify me when it reaches Riyadh Deliver to another city See similar items

True, specific, and it gives the intent somewhere to go. The "notify me" list also becomes the demand signal we take back to STC.

Five ways to stop the contradiction, cheapest first

Ordered by what it costs us, not by how good it is. The good ones are at the bottom and none of them land by 2 September.

AFail at the address step, not at the payment stepCan land by 2 Sep
What changes

The same validation call, fired the moment the buyer enters or picks a delivery city, rather than when they submit the order. Nobody types card details for an order that was never going to complete.

Cost

Trigger point, not new code. The call is already in the proposal. This only moves when it runs.

BSay why, and offer three exitsCan land by 2 Sep
What changes

The message above. Notify me when it reaches my city, deliver to another city, or see alternatives. The notify list doubles as a demand signal for the STC conversation.

Cost

Copy plus one small UI block. "Notify me" needs somewhere to store the request, which is the only real work here.

CRemember the rejection for the rest of the sessionCan land by 2 Sep
What changes

Once we refuse an item for a city, we know something the catalogue does not. Hold it on the session and grey that item out on the list and product pages from then on. It never contradicts itself twice.

Cost

A session-level exclusion list. No catalogue change, no platform change, no stock feed. It is a patch, and it is honest about being one.

DCity availability badge on the product page, Apple Store onlyDepends on Aditya
What changes

The product page checks the buyer's city on load and says "available in Riyadh" or "not available in Riyadh" before they ever reach the cart. The rejection stops happening rather than being handled.

Cost

Needs stock per city, so it needs R7 and a working STC API. Whether it can be scoped to one store or forces a platform change is the question for Marketplace.

ECity-aware availability across the catalogueNot by 2 Sep
What changes

Availability stops meaning "somewhere in the country" and starts meaning "where you are". The item never appears in the list, so there is nothing to contradict. This is the correct answer.

Cost

A marketplace platform change, which is the one thing Akshay says breaks the date. It also inherits a cache question: a list page served from cache lags the truth however correct the model underneath is.

Recommendation

Ship A, B and C together for 2 September. They are one trigger change, one copy change and one session flag, none of them touch the catalogue, and together they turn the worst case from "the store is broken" into "the store told me the truth and gave me an option". Then D in September, once STC answers R7 and fixes the API. Then E as the proper fix, scoped as its own piece of work rather than smuggled into a launch.

Be clear on what this buys: A, B and C do not fix the first encounter. A buyer can still reach checkout for something they cannot have. They fix the contradiction, the repeat, and the silence. Only D and E stop it happening at all.

The hedge nobody has proposed yet

All of the above assumes we launch the full catalogue. We could instead launch with only the items Aleph can back nationally, so the rejection path is rare on day one, and widen the catalogue as STC coverage becomes known. A smaller Apple Store that always works beats a complete one that cancels one order in ten. This is Rahul's call, and it is not currently on the table.

Instrument it either way

Whatever we ship, log every rejection with the city, the item, and whether Aleph could have covered it. The 5 to 10 percent is a guess, and two weeks after launch it should be a measurement. That log is also the evidence we take to STC when we ask again for cross-city.

05What STC still has not told us, and what each answer changes

Their API returns an HTML error on every call except authentication, so our engineers cannot test and cannot answer these themselves. That is the reason this list is still open.

Cross-city fulfilment

Blocking · decides the design

If STC ships from another city when the buyer's city is dry, we need no Aleph fallback, no manual redirect, and no cancellation risk. We accept a longer delivery SLA and we are done. If not, everything in section 3 applies.

The broken API

Blocking · stops us testing

Authentication succeeds, so the server does see us. Every other call returns HTML instead of JSON, from cURL and from Python alike. Until this is fixed we cannot verify anything below, so every other answer stays theoretical.

R7, the product identifier

Blocks catalogue mapping

We cannot map STC items to our catalogue without knowing what this field is and what it keys to. No mapping means no stock lookup, whatever the flow.

Which price the buyer pays

Blocks pricing

STC returns net price, net price with flat and gross price. We do not know which one is customer facing. Guessing wrong prices the Apple Store wrong on day one.

Order statuses

Blocks order handling

We need the definition of "partially completed" for multi-item orders, and confirmation that "aborted" is terminal. Without it we cannot tell a stuck order from a dead one.

Tracking for cross-city shipments

Blocks buyer visibility

The STC API gives status updates but no tracking URL. If a cross-city order ships via a third party, we need to know whether a tracking link comes back that we can pass to the buyer.

Settled

Phone number format is confirmed: 966 followed by the number, with no plus sign.

06What we decide, and who decides it

Four people, four calls, one hour. If we cannot close these, the 2 September date is at risk and it gets escalated the same day.

R
Rahul: go or no go on the manual Aleph fallback
And the harder half of it: do we carry the 5 to 10 percent cancellation risk quietly, or do we tell Al Fursan before launch that a share of orders will be cancelled. That is a client relationship call, not a technical one.
A
Aditya: can Marketplace add the checkout validation call before 2 September
In days, not in feeling. Then the three from section 4: can the call fire at the address step rather than at payment (A), can we hold a session-level exclusion once an item is refused for a city (C), and is the city badge on the product page scopable to the Apple Store or does it force a platform change (D). And what leaves Sprint 122 to make room.
K
Akshay: the real cancellation number, and the effort estimate
The 5 to 10 percent is a working figure from the 19 August session. Historical data replaces it. His read is that the direct STC integration needs a few more days once decisions land, and that only a marketplace platform change breaks the date.
T
Tahsin: sign off the rejection experience in section 4
Specifically the wording and the three exits, since "out of stock" is not true and is what makes the store look broken. A, B and C are the launch answer. We need this agreed before a client finds it, not after.
→
Then: one owner and one date for the reply to STC
Cross-city, the broken API, R7, and the price fields go back in a single message with a deadline attached, rather than four people chasing separately.
Limits of this page

The 5 to 10 percent cancellation estimate is a working figure from the 19 August session, not a measurement. Nothing here assumes STC has confirmed cross-city fulfilment, because they have not. The proposed checkout validation has not been sized by Marketplace yet, which is the point of the meeting.

Merit · Al Fursan · Apple Store supplier integration · 20 August 2026
Sources: Merit x STC Channels, technical, 19 Aug · Internal fallback strategy session, 19 Aug