Marketing agencies deal with an unusually wide variety of file formats. Clients deliver source files in Photoshop (PSD), Illustrator (AI), or Keynote. Video assets need to be MP4 for one platform, WebM for another, GIF for email. Photos arrive as RAW from shoots, HEIC from phones, and TIFF from photographers. Every handoff involves a format conversion step — and not every team member has Photoshop or Premiere just to do a format conversion.
Format friction in agency workflows
Agencies handle format conversion at multiple points in every project:
- Client deliverables — source files in PSD, AI, or INDD need to become web-ready formats (JPG, PNG, WebP) without requiring a full creative suite to perform the conversion. The account manager who needs to send a quick preview shouldn't need Photoshop installed.
- Video asset preparation — clients provide video in whatever their camera or phone produces (MOV, MKV, HEVC). Web needs MP4 (H.264). Social platforms have different aspect ratio and format requirements. Video format conversion is constant.
- Email marketing assets — email clients have strict file size and format requirements. PNG screenshots need to be under 1MB JPG. GIF animations need to be generated from video clips. WebP isn't universally supported in email, so conversion to JPG is needed.
- Deck production — PPTX presentations for client review and campaign planning need to be PDF for clean, consistent rendering across devices. Clients with different PowerPoint versions shouldn't see layout shifts.
- CDN optimization — images uploaded to the agency's CMS or CDN need to be in modern formats (WebP, AVIF) for performance. Raw uploads from clients in PNG or TIFF need to be converted before deployment.
Common format pairs in marketing agencies
The conversion routes marketing agencies hit most:
- PSD → JPG / PNG / WebP — export Photoshop designs for web delivery without opening Photoshop
- PNG → WebP / AVIF — convert design assets to modern formats for CDN performance
- JPG → WebP — bulk convert photography and product images for web optimization
- PPTX → PDF — client-facing decks, strategy presentations, and campaign proposals
- MP4 → GIF — create animated previews for email, Slack, or social media from video clips
- MOV → MP4 — normalize iPhone/Mac video exports to web-standard MP4
- HEIC → JPG — convert iPhone photos from shoots or client-provided content
- GIF → MP4 / WebM — convert animated GIFs to video for social platform upload (smaller file, better quality)
- SVG → PNG — render vector logos for use in contexts that don't support SVG
- DOCX → PDF — creative briefs, SOWs, and reports for client delivery
The browser tool: fast, no-install asset conversions
PSD → PNG, PNG → WebP, SVG → PNG, and most image conversions run entirely in the browser at changethisfile.com — no upload for most image routes. For account managers or coordinators who need to do a quick format conversion and don't have design software installed, this is the right tool.
Video conversions require server-side processing — MP4 → GIF, MOV → MP4 involve FFmpeg on the server. Files are uploaded, converted, and auto-deleted.
The browser tool is the right choice for:
- One-off asset conversions during review cycles
- Account managers who need to prep a preview without design software
- Quick format checks before committing to an API integration
API integration for agency asset pipelines
The endpoint is POST https://changethisfile.com/v1/convert. Source format auto-detected from filename. No SDK to install. Get a free API key.
Convert a PSD to WebP for web delivery
curl -X POST https://changethisfile.com/v1/convert \
-H "Authorization: Bearer ctf_sk_your_key" \
-F "file=@hero_banner.psd" \
-F "target=webp" \
--output hero_banner.webp
Generate a GIF preview from a video clip
curl -X POST https://changethisfile.com/v1/convert \
-H "Authorization: Bearer ctf_sk_your_key" \
-F "file=@product_demo.mp4" \
-F "target=gif" \
--output product_demo.gif
Batch convert campaign images to WebP
for IMG in campaign-assets/*.png; do
BASE=$(basename "$IMG" .png)
curl -sX POST https://changethisfile.com/v1/convert \
-H "Authorization: Bearer $CTF_API_KEY" \
-H "Idempotency-Key: campaign-q2-${BASE}" \
-F "file=@${IMG}" \
-F "target=webp" \
-o "campaign-assets/webp/${BASE}.webp"
done
Code example: bulk asset conversion for CDN upload
Agency CMS upload pipeline: accept any image format from clients, convert to WebP for CDN, return the optimized URL. No SDK — plain requests and fetch.
import requests
from pathlib import Path
from uuid import uuid4
CTF_API_KEY = "ctf_sk_your_key_here"
# Formats that benefit from WebP conversion for web delivery
WEB_CONVERT = {".png", ".jpg", ".jpeg", ".psd", ".tiff", ".tif", ".bmp", ".heic"}
def prepare_for_cdn(file_path: Path, project_slug: str) -> tuple[bytes, str]:
"""Convert creative asset to WebP for CDN storage."""
ext = file_path.suffix.lower()
if ext not in WEB_CONVERT:
return file_path.read_bytes(), file_path.name
with open(file_path, "rb") as f:
resp = requests.post(
"https://changethisfile.com/v1/convert",
headers={
"Authorization": f"Bearer {CTF_API_KEY}",
"Idempotency-Key": f"{project_slug}-{file_path.stem}",
},
files={"file": (file_path.name, f)}, # source auto-detected
data={"target": "webp"},
timeout=30,
)
resp.raise_for_status()
return resp.content, file_path.stem + ".webp"
# Process a client's asset delivery folder
asset_dir = Path("./client-assets/q2-campaign/")
for asset in sorted(asset_dir.iterdir()):
if asset.is_file():
data, out_name = prepare_for_cdn(asset, "q2-campaign")
out_path = asset.parent / "cdn-ready" / out_name
out_path.parent.mkdir(exist_ok=True)
out_path.write_bytes(data)
print(f"{asset.name} → {out_name} ({len(data):,} bytes)")
JavaScript fetch version:
const WEB_CONVERT = new Set(['.png', '.jpg', '.jpeg', '.psd', '.tiff', '.tif', '.bmp', '.heic']);
async function prepareForCdn(fileBuffer, filename, projectSlug) {
const ext = filename.slice(filename.lastIndexOf('.')).toLowerCase();
if (!WEB_CONVERT.has(ext)) return { data: fileBuffer, filename };
const form = new FormData();
form.append('file', new Blob([fileBuffer]), filename); // source auto-detected
form.append('target', 'webp');
const resp = await fetch('https://changethisfile.com/v1/convert', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CTF_API_KEY}`,
'Idempotency-Key': `${projectSlug}-${filename.replace(/\.[^.]+$/, '')}`,
},
body: form,
});
if (!resp.ok) throw new Error(`${resp.status}: ${await resp.text()}`);
return { data: Buffer.from(await resp.arrayBuffer()), filename: filename.replace(/\.[^.]+$/, '.webp') };
}
curl one-liner:
curl -sX POST https://changethisfile.com/v1/convert \
-H "Authorization: Bearer $CTF_API_KEY" \
-F "file=@campaign_hero.psd" \
-F "target=webp" \
-o campaign_hero.webp
Pricing for agency scale
| Plan | Conversions/month | Price | Fits |
|---|---|---|---|
| Free | 1,000 | $0 | Freelancer or small agency evaluation |
| Hobby | 10,000 | $29/mo | Small agency with a few active clients |
| Startup | 50,000 | $99/mo | Mid-size agency with active campaign production |
| Scale | 500,000 | $499/mo | Large agency or automated asset pipeline serving multiple brands |
| Growth | 5,000,000 | $1,999/mo | Agency platform, DAM integration, or multi-brand enterprise asset pipeline |
A campaign producing 200 web assets plus 20 video previews and 30 document conversions is around 250 conversions — well within free for one campaign, Hobby for ongoing production. An agency running automated pipelines for multiple brands needs Startup or Scale.
FAQ
Does PSD → WebP flatten all layers?
Yes — PSD conversion flattens the layer stack to a single composite image. If you need specific layer exports or layer comps, that's a Photoshop operation, not a format conversion. The API converts the flattened composite.
Can I convert MP4 to WebM for video backgrounds?
Yes — MP4 → WebM is a supported route. WebM (VP8/VP9 codec) is widely supported in modern browsers and typically smaller than H.264 MP4 at equivalent quality. Use it for web video backgrounds and HTML5 video elements.
What about AI (Illustrator) to SVG or PNG?
AI → PDF and AI → PNG are supported via LibreOffice. AI → SVG round-tripping isn't reliable because the AI format and SVG have different feature sets. For vector-to-web workflows, exporting SVG directly from Illustrator is more reliable than converting.
Are there quality settings for image conversions?
The API uses default quality settings tuned for good output. There are no per-request quality parameters currently. For WebP and JPG, the defaults produce good quality at reasonable file sizes for web use.
Can I automate conversion on S3 upload?
Yes. A Lambda function triggered by S3 PutObject events can call the API to convert and store the result. The async mode with webhook is the right approach for large video files — the Lambda triggers the conversion job, and a webhook notifies your system when done.
Related guides
Guides for agency asset workflows: