How to prevent pending offline mobile syncs from overwriting already-approved records?

Context

We have a 2-tier approval workflow in our AppSheet app (entries table).

  • When a user is on the go, they might approve multiple requests (e.g., 5 requests) simultaneously on the mobile app and then close the app before it completely finishes syncing.

  • These updates remain queued locally on their mobile device.

  • While those mobile updates are pending, the same requests are processed and fully approved or rejected on the desktop app. The final approver marks the status as 'APR' (Approved) or 'RJC'(Rejected). At this point, the process is completed on the data source.

The Problem

The next time the user opens their mobile app, the pending sync resumes and pushes its queued data to the server.

  • Even though the the status is already 'APR' or 'RJC', the mobile app’s incoming payload still contains the older status (like 'FA' or 'FV' - For Approval / For Verification).

  • AppSheet accepts this delayed mobile sync and overwrites the database, reverting our completed 'APR' or 'RJC' status back to the older 'FA' or 'FV' status.

What is the best way to handle this?

We want to completely invalidate the pending mobile sync for a specific row if that row’s status on the server is already 'APR' or 'RJC'. Any insights would be highly appreciated!

I don’t know if it is the best way, but when it is approved in the office with those specific codes, it could create a copy of the data to a new table, so you then have a single source of truth for the final checked data.

Or have the two approval stages in two different boxes/cells, so any pending syncs won’t overwrite the changes on the final approval in the office.

Rather than recording the approval in the row itself, record it in a child table and include the time. In the parent row, use a virtual column to grab the approval status of the child row with the latest time.

I suggest using a “force sync” navigation action at the end the first tier of your approval process, that way approvals are processed instantly by the app.

Here’s a video from the master itself to help you set that up: How to Force a Sync || AppSheet Explained