Decide which validations happen on-device and which must be authoritative on the server, then codify that split in error codes and documentation. Define what the client stores, how long, and in which states. Agree on deterministic request shaping so batched, delayed submissions still map to stable operations.
Design endpoints so repeated deliveries do not create duplicates or drift. Use natural keys or client-generated UUIDs to represent intent, and ensure safe upserts. Communicate retry windows, backoff guidance, and final states explicitly so mobile schedulers can act without guesswork under pressure.
Adopt additive change as a rule, favoring new fields over mutations, and support defaults server-side. Consider schema evolution tools, or version via headers and content negotiation. Provide capability discovery and deprecation schedules so clients gracefully adjust, even if they missed several releases while offline.
Generate an operation identifier on the device, include it in every retry, persist it in gateway caches, and carry it through to storage. Enforce uniqueness where side effects originate. Return the original outcome on duplicates, not a fresh success, preserving clarity, metrics, and user confidence.
Prefer upserts keyed by stable, meaningful identifiers when representing intent, like order numbers or visit IDs. Detect conflicts using ETags or conditional requests and report them clearly. Give clients remediation options, including rebase instructions or a minimal patch, rather than generic, opaque failures.





