Most image generation bills are higher than they need to be. Not because the models are expensive — because developers use the same high-cost model for everything, regardless of whether it's justified. Here's how to fix that.
The short version
Switching from midjourney (4 credits) to flux-2-dev(1 credit) for generation tasks that don't require Midjourney's aesthetic cuts your per-image cost by 75% — on the same plan, with no infrastructure changes.
The most expensive mistake developers make
You pick a model when you start building and never change it. Midjourney is the obvious default because it's well-known. But Midjourney costs 4 credits per image. For a lot of workloads — internal tools, prototyping, batch generation of content variants — that's simply more than you need.
The fix is model routing: match the model to the task, not the other way around.
Strategy 1: Route by task type
Not all images need the same model. A useful mental model:
| Task | Recommended model | Credits | vs Midjourney |
|---|---|---|---|
| Prompt testing / prototyping | flux-2-dev | 1 | −75% |
| Batch generation, internal use | flux-2-dev | 1 | −75% |
| Marketing, product photos | nano-banana-2 | 3 | −25% |
| Text-in-image, logos | ideogram-v3 | 5 | +25% (justified) |
| Artistic / editorial output | midjourney | 4 | — |
In practice: if 60% of your volume is prototyping and internal, and you switch that to flux-2-dev while keeping Midjourney for customer-facing output, you cut your total credit spend by around 45% without touching output quality where it matters.
Strategy 2: Match your plan to your actual volume
Plans with more credits have lower effective cost per credit. But buying a larger plan than you need means paying for unused capacity. The break-even:
| Plan | $/credit | Midjourney image @ this rate | Use this plan if you need |
|---|---|---|---|
| Hobby ($19) | $0.0173 | $0.069 | < 1,100 credits/mo |
| Pro ($99) | $0.0165 | $0.066 | 1,100 – 6,000 credits/mo |
| Growth ($299) | $0.0150 | $0.060 | 6,000 – 20,000 credits/mo |
| Scale 1 ($599) | $0.0136 | $0.054 | 20,000+ credits/mo |
The plan-level savings are real but modest (5–10% per tier). Model selection has a bigger impact. Optimize model choice first, then optimize plan tier.
Strategy 3: Only pay for what succeeds
Some providers charge credits upfront — your credit is deducted when you submit the request, regardless of whether the image generates successfully. At scale, failure rates of 2–5% are normal (network errors, upstream timeouts, content policy blocks). If you're generating 10,000 images/month with a 3% failure rate, that's 300 wasted credits per month.
JourneyAPI only charges for successful generations. Failed tasks don't cost credits. On a high-volume workload, this alone can represent several percent of your monthly bill.
Strategy 4: Use webhooks
Polling the /fetch endpoint to check task status is free — fetch calls cost 0 credits. But polling logic adds latency, requires retry handling, and creates unnecessary complexity. Webhooks are simpler: your server receives a notification when the image is ready, no polling loop needed.
Beyond the developer experience benefit, webhooks also let you process results immediately without delay, which matters if image generation is on a user's critical path.
Strategy 5: Deduplicate and cache
If your users frequently request similar or identical images, caching at the application layer is free cost reduction. The most obvious case: don't generate the same image twice. Store URLs from previous generations and return the cached result for identical prompts.
For less identical but similar cases — product variants, color swaps, aspect ratio changes — consider whether variations or outpaint from an existing generation is cheaper than re-generating from scratch. It often is.
How much can you realistically save?
It depends on your mix. A realistic example: a SaaS generating 5,000 images/month, currently all on Midjourney (4 credits each = 20,000 credits).
- Switch 50% of volume to flux-2-dev (1 credit): 2,500 × 1 + 2,500 × 4 = 12,500 credits. −37.5%
- Switch 70% to flux-2-dev: 3,500 × 1 + 1,500 × 4 = 9,500 credits. −52.5%
- Switch 80% to flux-2-dev, move to nano-banana-2 for the rest: 4,000 × 1 + 1,000 × 3 = 7,000 credits. −65%
If you also move to the Pro plan (which handles 6,000 credits at a lower per-credit rate), the savings compound further. A shift from 20,000 Midjourney-only credits on Growth to a routed 7,000-credit mix on Pro is roughly a 70–75% reduction in effective spend.
Where to start
The single highest-leverage change: identify what percentage of your generations are prototyping, internal, or non-customer-facing, and switch those to flux-2-dev. It's a one-line code change in your API call:
# Before
{
"model": "midjourney",
"prompt": "product photo of sneakers on white background"
}# After (75% cheaper for non-editorial output)
{
"model": "flux-2-dev",
"prompt": "product photo of sneakers on white background"
}All models use the same /imagine endpoint. No migration, no new integration. Just a model name change. Start there, measure the quality difference for your use case, and route from there.