> For the complete documentation index, see [llms.txt](https://assetstore.essentialkit.voxelbusters.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://assetstore.essentialkit.voxelbusters.com/features/task-services/playmaker/use-cases/use-case-3-upload-completion.md).

# Upload Completion (Finish or Defer)

## Goal

When the app is suspending and an upload is pending, try to finish quickly; if time is about to expire, save-for-retry.

## Actions used

* `TaskServicesStartTaskAndAllowInBackground`
* `TaskServicesCancelTask`

## Flow

1. When `uploadPending == true` and app is suspending:
   * Start background allowance (`TaskServicesStartTaskAndAllowInBackground`)
   * Do the upload in the next state.
   * On success/failure, call `TaskServicesCancelTask` and clear/set your pending flags.
2. If `quotaWillExpireEvent` fires:
   * Cancel/stop the upload work if possible.
   * Save the payload locally and set a “retry on next launch” flag.
   * Call `TaskServicesCancelTask`.

## Notes

* Keep the upload small and bounded; don’t rely on long background time.
* Assign `quotaWillExpireEvent` on `TaskServicesStartTaskAndAllowInBackground` and add it as a Global Transition to your “SaveForRetryNow” state.
