Next.js · next build (prerender)
Only plain objects can be passed to Client Components
Error: Only plain objects, and a few built-ins, can be passed to Client Components from Server Components. Classes or null prototypes are not supported.
{v: {c: 5}}
^^^^^^What it means
Props going from a Server Component to a Client Component are serialized. Class instances can't be: Prisma Decimal values, SDK objects (a Stripe or OpenAI response object), Mongoose documents, or your own classes.
Common causes
- Passing a Prisma row with a Decimal column straight to a client table
- Passing a whole SDK response object instead of the fields you need
- Objects created with Object.create(null)
How to fix it
- Map to plain fields before passing: { id, name, price: Number(row.price) }
- Convert Decimal with .toNumber() or .toString()
- Only pass what the client actually renders
const rows = await db.product.findMany();
- return <Table rows={rows} />
+ return <Table rows={rows.map((r) => ({ id: r.id, name: r.name, price: r.price.toNumber() }))} />Prompt for Cursor or Claude Code
Next.js says only plain objects can be passed to Client Components. Find the prop that carries a class instance (Prisma Decimal, an SDK object or a custom class) and map it to plain serializable fields on the server before passing it down.Not quite your error? Paste yours into the free VibeBoot Doctor or browse the Next.js error fixer.
next: skip the next one
Skip the setup. The VibeBoot SaaS Starter gives you auth, Stripe and a database already wired on Next.js 16.4.3, with AGENTS.md and .cursor/rules that keep your agent on the Next.js 16 conventions. $49, one-time.
14-day money-back guarantee · lifetime updates
Other Next.js errors
$ fixed it? get the next one first
New fixes for what AI agents break, by email.
When we add a fix or a Cursor rule for a new Next.js, Auth.js, Prisma or Stripe break, it goes out in the VibeBoot newsletter. Free, occasional, unsubscribe in one click.