Next.js · next build (prerender)

Only plain objects can be passed to Client Components

what it looks like
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

  1. Map to plain fields before passing: { id, name, price: Number(row.price) }
  2. Convert Decimal with .toNumber() or .toString()
  3. Only pass what the client actually renders
src/app/dashboard/page.tsx
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() }))} />

works with Next.js 16.4.3 · React 19.3last verified

prevent it · nextjs-app-router.mdc (free Cursor Rules Pack): Only plain objects, arrays, primitives and Dates are passed from server to client.

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

$ 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.

Subscribe free