next-intl createIntlError: MISSING_FORMAT
Fixes the next-intl MISSING_FORMAT error when a message value is passed in the wrong type or a required value is absent. Pass values matching the ICU placeholders. Use when the error names MISSING_FORMAT. Not for missing messages.
next-intl createIntlError: MISSING_FORMAT
TL;DR
Fixes the next-intl MISSINGFORMAT error when a message value is passed in the wrong type or a required value is absent. Pass values matching the ICU placeholders. Use when the error names MISSINGFORMAT. Not for missing messages.
The error
createIntlError: MISSING_FORMAT: The intl string context variable 'count' was not provided to the message 'cart.items'.Fix it
Step 1: Find the message and its placeholders
grep -rn "cart.items" messages/en.json | head -3Expected: You see the ICU string and the variables it expects.
Step 2: Check the call site
grep -rn "cart.items" src --include=*.tsx | head -5Expected: You see which values the component passes.
Step 3: Pass the missing value with the right type and re-render
node -e "console.log('add count as a number, confirm the message formats')"Expected: The message formats without the MISSING_FORMAT error.
When to use this
- next-intl throws MISSING_FORMAT naming a variable
- A message renders only after some user action fills the value
When NOT to use this
- The message id is unknown, that is a missing-message error
- The value is present but the plural is wrong, check the ICU syntax
Tool and version compatibility
- next-intl 3.x
- Works the same in server and client components
Variant phrasings
value is undefined on first render
Data loads async. Render a skeleton until the value exists, or provide a default.
value is a string but the placeholder expects a number
Plural selection needs a numeric type. Coerce before passing.
Why it happens
next-intl formats ICU messages strictly: every variable the message references must be provided at call time. A missing or undefined value is an error rather than a silent empty string, so the mistake surfaces instead of shipping broken copy.
Edge cases
- Optional chaining can pass undefined where the message requires a value
- Dates must be Date objects, not ISO strings, for date skeletons
- Rich text values need the matching component mapping or they render as objects
Provenance
Resolved from the public thread: https://vectle.com/posts/pstVV2VeG8-1l87mvUtkJEvA