SharePoint column formatting JSON not working? Start here
The JSON saved without complaint, but the column looks exactly like it did before. Here are the eight causes behind almost every "nothing happened", in the order to check them.
Column formatting in SharePoint and Microsoft Lists fails quietly. A wrong field name, a column missing from the view, a style SharePoint doesn't support — none of these produce an error. The JSON is accepted, saved, and then draws the plain value as if you'd never touched it. That silence is what makes it frustrating, and it's also why a fixed checklist works: the causes are few, and they're easy to rule out one at a time.
If you can't even find Format this column, that's a different problem: the option only exists in the modern list experience, and you need permission to edit the list's settings. Everything below assumes you've pasted JSON and it saved.
What "not working" usually looks like
A minimal formatter that proves the pipeline works
Before debugging your real JSON, paste this on the column. It uses @currentField instead of a field name, so it can't be wrong about the name — if the cell doesn't turn pale yellow, the problem is outside the JSON (wrong list, cached page, permissions), and if it does, keep reading:
{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
"elmType": "div",
"txtContent": "@currentField",
"style": { "background-color": "#fff4ce", "padding": "4px 8px" }
}
Once the test formatter works, put your real JSON back and work through the list below. The first two causes account for most cases.
Work through these in order
- 1. The field name is the display name, not the internal name.
[$Due Date]never matches anything; the internal name is probablyDue_x0020_Date, or something else entirely if the column was renamed. This is the single most common cause. The internal field name guide has a finder that reads the name out of your column-settings URL. - 2. The JSON references a column that isn't in the view. Any
[$OtherColumn]resolves only if that column is included in the same view — Microsoft documents this explicitly. A formatter on Notes that tests Status does nothing until Status is added to the view. You can make it narrow; it has to be present. - 3. You're looking at a cached page or a different list. Hard-refresh with Ctrl+F5. Check you're in the list you formatted, not a copy or a lookup source. And note that Format this column and Format current view are separate features — JSON pasted into one doesn't appear in the other.
- 4. The JSON itself is invalid. A trailing comma after the last property, a missing bracket, or curly "smart quotes" picked up from Word, Outlook, or Teams all break parsing. SharePoint shows a red message under the box for these; if you see one, fix that first. JSON from the generator is straight-quoted, but anything that passed through an email may not be.
- 5. A value doesn't match exactly. Comparisons are case-sensitive and include spaces:
'Done'is not'done', and'In Progress 'with a trailing space matches nothing. Copy values from the column's settings rather than retyping them, and check for stray whitespace. - 6. A style property isn't supported, so SharePoint dropped it. SharePoint applies only the CSS properties on its supported list and silently ignores the rest. The
backgroundshorthand is not supported (background-coloris);gapisn't (use margins);transformallows onlytranslate. If one part of the formatter renders and another doesn't, an unsupported property is the likely reason. - 7. An object-type column is used as if it were text. Person, lookup, and similar columns are objects with properties.
[$AssignedTo]on its own won't give you a name — use[$AssignedTo.title]; for a lookup, use[$Category.lookupValue]. The person column guide lists every property. - 8. Empty values are being compared. An empty date column evaluates as the epoch, so any "days overdue" arithmetic reads it as decades late; an empty number evaluates as 0. If the formatter "works" but blank rows look alarming, test for
[$Field] == ''before comparing. The generator's date templates already do this.
ProjectStatus or Project_x0020_Status internally). See the internal field name guide to find yours.
Common questions
It works in Preview but is gone after I save — why?
Why is a person or lookup column blank after formatting?
[$AssignedTo.title] or [$AssignedTo.email] for people, [$Category.lookupValue] for lookups — instead of the bare column, and make sure the column is in the view.