Video creative is a data-heavy workflow. One Adstacker project can include source clips, thumbnails, normalized videos, extracted audio, reusable overlays, and finished variations. We need uploads that do not overload the application server, dependable validation, predictable output locations, and cleanup for abandoned work.
Amazon S3 is the durable asset layer behind that workflow. Adstacker uses it to move large files directly from creators to storage, organize each stage of a project, and make finished videos available to download.
The challenge: video assets multiply quickly
Creative testing lets a small set of clips produce many variationsโand creates an asset-management problem. A project may begin with hook, body, and CTA footage, then produce normalized copies, audio, captioned overlays, thumbnails, and final MP4 or MOV outputs.
Moving every byte through the API would slow uploads and consume server bandwidth. Loose file names would make retries difficult and leave orphaned assets when a creator closes a tab mid-upload.
Storage has to be an intentional part of the production pipeline.
Our approach: S3 throughout the asset lifecycle
S3 is involved from project creation to final download. The backend handles authorization, manifests, validation, and job state; S3 handles the large objects.
Architecture

This split gives media files a direct, durable path to storage.
1. Upload large videos directly from the browser
When a creator starts a project, Adstacker creates a source-video manifest and returns a presigned S3 POST for each file. The browser sends the file straight to S3 instead of proxying it through the backend.
S3 enforces the signed upload constraints: a pinned content type and permitted size range. These stop empty or oversized uploads before they land, while the short-lived request limits what the browser can upload.
If a session is interrupted, Adstacker reissues fresh URLs for pending videos. It also checks S3 during resume, so an object that missed the completion callback can still be reconciled and validated.
2. Verify what arrived before processing it
An upload completing in the browser is not enough to start rendering. The backend uses S3 HEAD to confirm the object, read its size and ETag, and save that ETag with the validated video.
Next, Adstacker downloads the object temporarily for FFprobe validation. We confirm it is readable and that duration and effective resolution meet project requirements. Invalid files receive a useful rejection reason and are deleted; transient read failures leave the object in place for retry.
Each video moves through a clear lifecycle: pending, uploading, uploaded, validating, validated, or rejected. A project advances only after every expected asset is validated, and atomic updates prevent duplicate callbacks from double-counting a video.
3. Make every output predictable and reusable
Adstacker uses deterministic S3 paths based on the project, asset type, category, and variation. Normalized media and extracted audio live separately from rendered overlays and final combinations.
That organization helps the pipeline in three ways:
- Direct lookup: Workers can find exactly the input or output associated with a project and variation.
- Efficient reuse: Reusable overlays are stored once and can support more than one final combination.
- Idempotent retries: A retry writes to the same expected key, avoiding a growing trail of duplicate exports.
Final video records keep the S3 keys and URLs for output, thumbnail, andโwhen relevantโMOV variant. The application can then provide the format that is ready.
4. Deliver access safely and clean up incomplete work
The S3 bucket is private. Adstacker issues time-limited signed download URLs, optionally with a download filename, so assets do not need public exposure.
Not every upload becomes a finished project. Scheduled cleanup identifies stale incomplete projects and deletes their remaining S3 source objects. Rejected uploads are deleted immediately after validation fails.
These lifecycle rules limit abandoned storage while preserving project history.
Real-world example: an interrupted upload does not mean starting over
Imagine a marketer uploads six clips, then closes the browser after four reach S3. On return, Adstacker restores the upload session and provides fresh presigned requests for unfinished clips. It also checks whether a file reached S3 even if its completion callback was lost.
Once all six files are verified and validated, the project moves into processing. Sources, prepared media, overlays, thumbnails, and final variations remain organized under known keys for every later step.
Storage designed for creative velocity
Amazon S3 lets Adstacker treat video assets as a managed lifecycle: upload directly, verify the object, validate the media, create predictable outputs, authorize downloads, and clean up incomplete work. That lets the creative pipeline focus on turning clips into testable variations.
Upload your assets to Adstacker, build the combinations you want to test, and let the platform manage the storage workflow behind every render.
Technology stack: Amazon S3 ยท AWS SDK for JavaScript ยท Presigned S3 POSTs ยท NestJS ยท FFprobe ยท AWS ECS Fargate ยท MongoDB
Read more from our team
1. Export Service vs. Video Editor Pipeline

