Delivery · Menus

The upload that cancels what it left out

A delivery platform takes your offers as one file and removes anything the file does not mention. Send four and you may have cancelled a fifth somebody else set up. Here is the sentence to look for.


We spent yesterday building against a delivery platform's promotions interface, and one sentence in their documentation is worth more to an operator than the rest of it put together:

Promotions absent from a subsequent upload are removed automatically. An empty array removes all promotions for this brand.

Read that twice. The upload is not "here are some more offers". It is "here is the complete list, replace everything you hold with this". Anything you do not mention is cancelled.

Why this bites a food hall specifically

In a single-operator restaurant one person sets up offers and that person is the one uploading. In a hall, three people can touch the same listing: the kitchen owner who set up a lunch deal in the platform's own portal last month, the hall manager syncing from a till system this morning, and an account manager who added something during a campaign.

The morning sync does not know about the other two. It sends its four offers. The lunch deal disappears, the campaign deal disappears, and the platform reports the job as a success — because it was one. It did exactly what it was asked.

Nothing tells you afterwards

This is the part that makes it worth writing down. There is no error. The job status comes back complete. The offers that vanished leave no trace on either side: the platform has replaced its list, and your system never knew those offers existed, so it cannot tell you it removed them.

The only moment at which that information exists is before the upload, and only if something bothered to compare what you are about to send against what you believe is live.

What we built instead of a Send button

Our screen has a Send button and it does not send. The first press asks the server for a plan: how many offers this would publish, and — by name — which live ones it would take down. That comes back as a refusal, not a success, if there is anything in the removal list that nobody has agreed to.

Agreeing means naming them. Not a tick box saying "yes I understand", which people press; the actual list of identifiers goes back to the server, and the server checks it matches exactly what it is about to remove. Confirm two when three would go and it refuses again. Name one that is not live and it refuses, because that means you are looking at a different list from the one about to be replaced.

We also write down what each upload removed, at the moment it goes, because that is the only point at which the fact exists.

Questions worth asking your own supplier

  • When you push offers to a delivery platform, is it a full replace or an addition? If they do not know, it is a full replace and they have not read the page.
  • Before it sends, does anything show you what would be taken down?
  • If an offer disappears from your listing, can anyone tell you which upload removed it and when?

To be straight about our own position: the engine and the screen are built and deployed, and no promotion has gone live through them on a real listing yet — our developer account is still waiting on the platform's side. What is written above is what the interface does, learned from their specification and built against it.


Try it on tonight’s service.

Nothing to install, no card. Not better by the weekend? Close the tab.