Short answer
Use uploadBytesResumable so the upload reports progress and can be paused and resumed. Compress images before upload. If large files on slow networks are normal for the app, raise maxUploadRetryTime. Then check that the bucket in the config is the right one and that nothing blocks the request.
Rather not fix it yourself? App Fix Ticket starts with a fixed-price diagnosis, then a fixed price for the fix before any fix work.
Why it gives up, and the fix
01
A large file on a slow connection
“The maximum time limit on an operation (upload, download, delete, etc.) has been exceeded. Try uploading again.” Firebase, Handle errors (storage/retry-limit-exceeded)
A phone video or a full-size photo on mobile data can take longer than the retry time allows. Resize images and compress video on the device first, and show progress so the user keeps the app open.
02
Progress and resume help, but the limit still applies
uploadBytes gives you no progress events. uploadBytesResumable reports progress, and you can pause, resume or cancel it, which suits large files and flaky networks. It can carry on after a short drop, but it still fails once the retry time runs out.
// Web SDK; uid and setProgress come from your app import { getStorage, ref, uploadBytesResumable } from 'firebase/storage'; const task = uploadBytesResumable(ref(getStorage(), `uploads/${uid}/${file.name}`), file); task.on('state_changed', (snap) => setProgress(snap.bytesTransferred / snap.totalBytes), (err) => console.error(err.code), // e.g. storage/retry-limit-exceeded () => console.log('done'), );03
The retry time is too short for the app
“The maximum time to retry uploads in milliseconds.” Firebase, FirebaseStorage.maxUploadRetryTime
The web SDK lets you set how long uploads, and other operations, keep retrying. Raise it only when big uploads on slow networks are expected, and still show progress and a retry button.
import { getStorage } from 'firebase/storage'; const storage = getStorage(); storage.maxUploadRetryTime = 30 * 60 * 1000; // example value: 30 minutes, in milliseconds04
The request never reaches the bucket
A wrong storageBucket in the Firebase config, an ad blocker or a firewall that blocks the Storage host, or a connectStorageEmulator call left on in production can make every try fail until the time runs out. Check the network tab for the failed requests.
05
Deletes, metadata and download URL requests time out too
“The maximum time to retry operations other than uploads or downloads in milliseconds.” Firebase, FirebaseStorage.maxOperationRetryTime
The same error can come from a delete, a metadata call or a getDownloadURL request. Those use a separate limit, maxOperationRetryTime, which is set the same way as the upload limit.
Checked against the vendor’s docs on : Firebase docs: Handle errors for Cloud Storage on Web; Firebase JS SDK reference: FirebaseStorage.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.See scope and start
“Very responsive, attentive to fixing bugs, and completed the project as needed! Thank you!”
Related: Firebase storage/unauthorized · Firebase storage/object-not-found · Firebase App Check blocking requests · Firebase Functions out of memory