If you’re using the free tier of Vercel, like I do for some of my small side projects, you will get the 402 Payment Required error eventually when loading images. This is because you have hit the Image Optimization limit of the free plan. The solution to this is to disable Vercel’s Image Optimization, or to host the images elsewhere, or to upgrade to their Pro plan.
Here I will be talking about the three ways to disable Vercel’s image optimization** to prevent the 402 Payment Required error:
1. Disable Image Optimization Globally (via next.config.mjs
)
If you want to disable image optimization across your entire Next.js app, update your next.config.mjs
:
export default {
images: {
loader: 'default', // Prevents Vercel's optimization
unoptimized: true, // Disables all image optimizations globally
},
};
Or, if you’re using next.config.ts
, update as per below snippet:
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
images: {
unoptimized: true, // Disables Next.js image optimization
},
};
export default nextConfig;
This tells Next.js to serve images as they are without going through Vercel’s optimization pipeline.
2. Disable Optimization per Image (Using unoptimized
in <Image>
)
If you only want to disable optimization for specific images, set unoptimized={true}
in the <Image>
component:
import Image from "next/image";
export default function Example() {
return (
<Image
src="https://your-external-image-url.com/example.jpg"
width={500}
height={300}
unoptimized
/>
);
}
This bypasses Vercel’s image processing but still allows you to use the <Image>
component.
3. Use a Custom Image Loader (For External Images)
If you host images externally and want to keep the <Image>
component’s benefits (like lazy loading), use a custom loader:
const customLoader = ({ src }) => src;
export default function Example() {
return (
<Image
loader={customLoader}
src="https://your-external-image-url.com/example.jpg"
width={500}
height={300}
/>
);
}
This ensures Next.js loads the image directly from the URL instead of routing it through Vercel’s optimization.
Which Method Should You Use?
Method 1 (Global Disable) → Best if all images should bypass optimization.
Method 2 (Per Image Disable) → Best if only some images need to be unoptimized.
Method 3 (Custom Loader) → Best if using external image hosting/CDN.