Cloud egress: Vercel Blob vs Cloudflare R2 for app assets
Vercel Blob (platform-bundled) and Cloudflare R2 (standalone) deliver app assets on different path templates: platform edge + quota cliffs versus explicit Cache-Control / Workers and portable buckets. Model delivery path and origin fill — Unknown until verified.
Updated
Platform-bundled blob storage vs standalone object storage — model delivery path, not logo preference.
Path matrix: Vercel Blob vs Cloudflare R2 app-asset delivery (educational)
Dated starting points only — Unknown until verified means no invented $/GB. Platform quotas and storage SKUs change; re-read before Mode C arithmetic.
Path-class vocabulary: path template, Unknown until verified. Clone pages that only paste public $/GB miss platform quotas and DX lock-in. Use path templates: browser ← edge ← blob versus browser ← R2/custom domain.
Image optimizer / transformation proxy — may re-fetch origins and inflate fill bytes.
Signed URL direct download — bypasses some caches; model as low CHR.
Multi-region users, single bucket — latency vs replication/cost tradeoff.
Common traps
Comparing only storage $/GB ignores platform bandwidth quotas. Assuming high CHR without measuring misses understates origin fill. Portability costs (migration egress) are easy to skip in vendor switches. No guaranteed savings from either logo.
Storage $/GB only — Blob/R2 storage is one line; platform/edge bandwidth quotas and origin-fill $/GB are others. A cheap object store with an expensive bandwidth cliff is not a win — keep three ledgers.
Assumed CHR — marketing “edge cache” copy is not a measured CHR. Misses drive origin fill; re-measure after cache-policy changes before Mode C arithmetic.
Quota cliff invisibility — plan-included GB that quietly expire into overage behave like a free-tier cliff. Model the grant and the overage as separate lines; sibling literacy on AWS free-tier cliff.
Migration egress skipped — leaving Blob or R2 still moves bytes once. Portability / exit egress is a one-time path class, not zero — see R2 vs B2 and S3 vs R2.
Blending edge with origin — client downloads on a platform plan are not the same meter as origin GET $/GB. Keep Mode C for fill; do not paste an edge headline into the origin cell.
Incomplete → crown — Unknown / Incomplete cells stay Unknown. PipeToll never invents Blob or R2 $/GB. Stay FinOps-lite; no savings guarantee.
FinOps checklist
Capture client GB, CHR, and bill lines for 30 days.
Map whether edge bandwidth and origin storage are separate invoices.
Numbered Blob vs R2 app-asset stack — Unknown rate cells
#
Path class
Volume
Unit rate
1
Client / edge bandwidth
1,000 GB
Unknown (plan quota / overage)
2
Origin fill (1 − CHR)
≈ 150 GB
Unknown $/GB origin
3
Ops / PUT / LIST
as measured
Unknown
Second stack: signed-URL direct downloads at ~20% CHR on 400 GB client → fill ≈ 320 GB. Low-CHR paths dominate origin bills — measure before migrating logos.
Second educational stack (CHR / plan-quota twin): same 1,000 GB client downloads at 55% CHR (origin fill ≈ 450 GB) plus an explicit platform bandwidth plan-quota cliff — if the plan grant is e.g. 100 GB included, model overage above the grant as its own free-tier cliff line, separate from R2/origin fill $/GB. Re-run Mode C (?path=blob-r2). Synthetic only; rates Unknown until dated Vercel Blob / R2 cites. No savings guarantee.
Worked-estimate sensitivity (educational)
Hold the 1,000 GB client baseline and walk three CHR / quota runs. Every unit rate stays Unknown until dated Vercel Blob / R2 / plan cites — literacy arithmetic, not a quote.
Run A — high CHR (0.85): origin fill ≈ 150 GB. Model edge/plan bandwidth for 1,000 GB separately from origin $/GB. Open Mode C (?path=blob-r2).
Run B — mid CHR (0.55) + plan cliff: fill ≈ 450 GB; if the platform grant is e.g. 100 GB included, split below-grant vs overage as its own cliff line — sibling to free-tier cliff literacy.
Run C — low CHR signed-URL path (~0.20) on 400 GB client: fill ≈ 320 GB. Direct/signed downloads dominate origin bills — measure before migrating logos; twin with CDN origin fill.
Sometimes bandwidth is wrapped in plan quotas. Overage cliffs and separate blob pricing still need a path model.
When does standalone R2 win on clarity?
When you want explicit Cache-Control, Workers, and portable buckets independent of the app host — clarity ≠ guaranteed savings.
What is the first metric to capture?
Client download GB, cache hit ratio, and which bill line (platform vs storage) moves when CHR changes.
Does calculator path=blob-r2 invent rates?
No. ?path=blob-r2 only labels Mode C path context. Rates stay Unknown until you cite dated Vercel Blob or R2 pages — see methodology.
How should I model plan-quota cliffs vs origin fill?
Keep them as separate lines: platform bandwidth grant/overage is a cliff; CDN/origin fill is Mode C math driven by CHR. Deep-link ?path=blob-r2 for the fill half only.
Is Vercel Blob the same path as Azure Blob?
No. Platform blob + edge quotas differ from Azure Blob bandwidth — see Azure vs S3 for object-storage bandwidth literacy, and keep this spoke for app-platform vs R2 designs.
Does Mode C path=blob-r2 pick a winner?
No. It only labels path context for educational arithmetic. PipeToll never guarantees savings — verify on dated provider pages per methodology.
Trademarks: Amazon Web Services, AWS, Microsoft Azure, Google Cloud Platform, GCP, and Cloudflare are trademarks of their respective owners. PipeToll (Ameti One LLC) is not affiliated with, endorsed by, or sponsored by those companies. Educational comparisons may be outdated — verify current rates with each provider.