Skip to content

Parked and held

Two apps talking to each other will eventually fail to. When the other app is not answering, the message waits somewhere you can see it. When you switch a connection off, nothing is sent to that app at all.

  • Queued, then confirmed
  • The states a message can be in
  • Held while the other app is not answering
  • Switching a connection off
  • The one case that is genuinely lost
  • Refusals, and why they are different
  • Duplicates
  • Messages the other app sends while it is off here
  • See also

Nothing is sent and forgotten. Every message to a connected app is written down first, sent second, and marked delivered only when the other app confirms it applied it.

That ordering is the whole reliability story. A message can never be lost because the app crashed after sending it — the record was made before the attempt, so a message that never got a confirmationDelivery confirmationThe receipt a connected app sends back to say it applied a message — which is what lets Floormode show a queue as genuinely delivered rather than merely sent. Read more → is still sitting there waiting to be retried.

The health panel counts each connection’s outbound messages by state:

StateWhat it means
QueuedWritten down, waiting its turn
SendingAn attempt is in flight right now
DeliveredThe other app confirmed it applied it
HeldParkedParked messageA message to a connected app that is held, in order, while that app is not answering, and sent once it answers. It is visible, never a silent loss. A switched-off app gets no messages, so nothing is parked for it. Read more → — the other app is not answering, or Shopify is rate limiting us. Releases itself
Rate limitedThe other app said “not now” — a pause, not a failure
FailedThe other app rejected it, or the attempt errored
Never deliveredHeld so long it was given up on. Permanent

Rate limited deserves a note. When a connected app asks Floormode to slow down, that is a normal, healthy response to a busy moment — not an error. A pause does not count against a message’s retry attempts, so being throttled can never, by itself, cause a message to fail. The panel says as much: nothing is lost — a rate limit does not spend a delivery attempt.

If the other app is down or cannot be reached, messages for it are held, in order, and the panel shows them as Held with the age of the oldest one. Floormode retries one message every so often and sends the whole backlog the moment one gets through, in the order it was produced. A Shopify rate limit is handled the same way. Neither needs you.

A switched-off app gets nothing: Floormode writes no message for it and keeps no backlog. Your own records stay here (the count, the receipt, the alert on your alert list).

Switching it on starts fresh. From then on new work is sent; nothing from the time it was off is sent later, and anything still held from before is marked as not sent. Two exceptions always go out: the notice that the connection was switched off, and the return of the other app’s local stock.

There is a limit, and it is documented rather than hidden.

While an app is not answering, its connection can hold up to 500 messages. Past that, the oldest are given up on. They move to Never delivered, a visible state, never a silent deletion, and the panel says so:

68 messages never delivered. The other app is missing that data.

A refusal is not a failure of delivery — the message arrived and was understood, and Floormode declined to apply it. Refusals come back with a reason, and they are counted separately as Rejected.

The refusals a merchant actually meets:

RefusalWhyFix
The location is not one Floormode receives forNothing here should book goods in at a location you have not handed overMap or delegate the location, then have the sibling resend
The document has already been updated to a newer versionAn out-of-order revision would undo a newer planNothing — it is correct, and nothing changed
The document has no physical linesThere is nothing to receiveNothing — informational
The document has grown too large to revise safelyRewriting it would re-announce units already in a binSplit the document in the sibling

The distinction the panel is careful about: “they have stopped talking to us” and “they are talking and we keep refusing them” look identical from the warehouse floor and have opposite fixes. That is why Received, Rejected and Last message are three separate numbers rather than one health light.

Every message carries an identifier that is unique to the thing it describes. If the same message arrives twice — a retry after a confirmation went missing, a sibling replaying its own queue — the second copy is recognised and ignored, not applied again.

Reports that travel the other way are built the same way round: they carry running totals rather than increments. A second delivery against a purchase order reports the full quantity received so far, not “two more”. A total that arrives twice is harmless; an increment that arrives twice is a wrong number nobody can trace.

Messages the other app sends while it is off here

Section titled “Messages the other app sends while it is off here”

A switched-off connection holds both directions. Documents the other app sends (a purchase order, a transfer) are not applied while the switch is off. The other app keeps them and sends them again; they land once you switch the connection on. Its exits always land: it leaving, it releasing receiving back to itself, and its confirmations of work Floormode already did.

See Activation for what else switching off does and does not undo.