Notion has no capitalize function, but two documented ones do the job: substring() takes the first character, upper() turns it into a capital, and you add the rest of the text back. Copy the line below and replace "Name" with your own property. For client names typed in lowercase, I'd use the each-word version further down, because "acme studio" should become "Acme Studio", not "Acme studio".
upper(substring(prop("Name"), 0, 1)) + substring(prop("Name"), 1)
Choose the formula by what the property holds
The formula recipes go into a formula property, which shows a corrected copy next to the original entry. Pick one by the text you need to clean:
| Text in the property | Use | What changes |
|---|---|---|
| A label or single word typed in lowercase | First letter | The first character only |
| Client and contact names | Each word | The first letter of every word separated by a space |
| Entries that arrive in all caps | Either version with lower() added | Everything after each capital becomes lowercase |
| Task titles or notes with several sentences | Each sentence | The first letter of the text and the first letter after every period followed by a space |
| Text you type on a page | No formula; see the typing section | Depends on your keyboard settings or Notion AI |
For most client databases I'd start with each word and keep the rest of every name as typed, because it fixes names typed in lowercase without touching a name like McDonald that's already right. Add lower() only if all-caps submissions keep arriving: it fixes "JOHN SMITH" and also turns "NASA" into "Nasa".
Capitalize the first letter
Positions in Notion text start at 0. Notion's formula syntax reference defines substring() as running from the start index, which is included, to the end index, which is excluded, and gives substring("Notion", 0, 3) = "Not" and substring("Notion", 3) = "ion". So substring(prop("Name"), 0, 1) is the first character and substring(prop("Name"), 1) is everything after it. upper() converts the first piece, and + joins the two pieces of text.
Formulas also accept dot notation, where the function follows the value it works on. This line returns the same result:
prop("Name").substring(0, 1).upper() + prop("Name").substring(1)
The rest of the recipes use dot notation because the longer ones chain several steps, and a chain reads left to right.
Lowercase the rest as well
To fix entries typed in capitals, lowercase the remainder before adding it back:
prop("Name").substring(0, 1).upper() + prop("Name").substring(1).lower()
That turns "ACME STUDIO" into "Acme studio". It also turns "McDonald" into "Mcdonald", because lower() converts every remaining letter. Keep the rest unchanged when your records include brand names, surnames with an internal capital or acronyms.
Handle blanks and stray spaces
A pasted or form-submitted name can carry a space before the first letter, and some rows are simply blank. This version cleans the input once and then capitalizes it:
let(
clean, prop("Name").trim(),
/* a blank Name stays blank */
if(empty(clean), "", clean.substring(0, 1).upper() + clean.substring(1))
)
- let() stores the cleaned value under the name clean, so the formula reads it once instead of repeating prop("Name"). Notion's guide to what changed in formulas 2.0 covers let and lets, along with multi-line editing, tabs and comments in the formula editor.
- trim() removes white space from the beginning and end of the text. Without it, a name typed with a leading space keeps its lowercase letter, because position 0 holds the space.
- empty() returns true for "" in Notion's reference, so a blank Name gives a blank result without reaching the substring() steps.
To check a recipe, open the formula editor from a database row: Notion's formulas help says the editor then shows a live preview of the result for that row. I'd open it on the messiest name in the database first, since it exposes problems a tidy row hides. If the editor flags a type error instead, check what the property returns; our guide to formula errors with Date, Text, List and empty inputs shows how to trace an input type, with dates as the worked case.
Capitalize each word in a name
For client and contact names, split the text into words, capitalize each one and join them again:
let(
clean, prop("Name").trim().replaceAll(" +", " "),
if(empty(clean), "",
clean.split(" ").map(current.substring(0, 1).upper() + current.substring(1)).join(" ")
)
)
- trim() removes spaces at both ends, and replaceAll(" +", " ") turns any run of spaces into one. In a regular expression, + means "one or more", as Thomas Frank's replace() reference explains, and Notion documents replaceAll() as replacing every match.
- split(" ") turns "acme design studio" into a list of three words: "acme", "design" and "studio".
- map() runs the first-letter expression on every item in that list, with current standing for the word being processed.
- join(" ") puts the words back together with a single space between them.

For all-caps entries, lowercase the whole name in the first step so every word starts from the same place:
let(
clean, prop("Name").trim().replaceAll(" +", " ").lower(),
if(empty(clean), "",
clean.split(" ").map(current.substring(0, 1).upper() + current.substring(1)).join(" ")
)
)
Only a space starts a new word. "mary-jane o'neil" becomes "Mary-jane O'neil", because the hyphen and the apostrophe don't split the text. The formula handles spacing and first letters; you still decide how names like Mary-Jane, O'Neil or McDonald should be spelled. I'd correct those few records by hand rather than stack more rules into the formula, because every extra rule is another place where a correct name can break.
In a Clients database like the one in our freelancer CRM workflow, I'd add this as a formula property next to Name, so the original entry stays visible while you decide whether the fix should become permanent.
Capitalize the start of each sentence
If you only need the first letter of the whole text, the first-letter formula already does it. For task titles or notes with several sentences, split on a period followed by a space instead of on a space:
let(
clean, prop("Name").trim(),
if(empty(clean), "",
clean.split(". ").map(current.substring(0, 1).upper() + current.substring(1)).join(". ")
)
)
"call acme. send the revised quote" becomes "Call acme. Send the revised quote". The limit is plain: this formula only recognizes ". " as a sentence break. A sentence that follows "?", "!" or a line break keeps its lowercase letter, and an abbreviation such as "e.g. " counts as a break. Leave lower() out of this one, because it would also lowercase names and the word "I" inside your sentences.
What each formula returns
Here is what each recipe returns for entries a client database typically collects. The last column traces every result to the function behavior that produces it, so you can predict the output for your own records before you add the property.
| Entry as typed | Formula | Result | Why |
|---|---|---|---|
| acme studio | First letter | Acme studio | substring(0, 1) is "a", upper() makes it "A", and substring(1) adds "cme studio" |
| acme studio | Each word | Acme Studio | split(" ") gives two words, each gets a capital, and join(" ") restores the space |
| ACME STUDIO | First letter | ACME STUDIO | The first letter is already a capital and the rest is kept as typed |
| ACME STUDIO | Each word with lower() | Acme Studio | lower() runs first, then each word gets its capital |
| McDonald consulting | Each word | McDonald Consulting | The rest of each word is kept as typed |
| McDonald consulting | Each word with lower() | Mcdonald Consulting | lower() also turns the D into d |
| NASA grant | Each word with lower() | Nasa Grant | Acronyms lose their capitals the same way |
| iPhone repair | First letter | IPhone repair | upper() converts whatever letter sits at position 0 |
| mary-jane o'neil | Each word | Mary-jane O'neil | Only a space starts a new word |
| ana lopez, typed with a leading space | First letter, basic line | Unchanged, space included | Position 0 holds the space, so no letter is converted; the blanks-and-spaces version returns Ana lopez |
| mary jane, typed with two spaces | Each word | Mary Jane, with one space | replaceAll(" +", " ") collapses the spaces before split(" ") runs |
| Blank | Any version with empty() | Blank | empty("") is true, so if() returns "" |
| call acme. send the revised quote | Each sentence | Call acme. Send the revised quote | split(". ") gives two sentences and each gets a capital |
| done? send the invoice | Each sentence | Done? send the invoice | The text has no ". ", so only the first letter changes |
Make the clean name permanent with an automation
A formula property shows the corrected copy, while the Name property keeps whatever was typed. If you want the record itself to hold the clean version, a database automation can write it there. Notion's database automations help sets the conditions: automations need a paid plan and full access to the database, and guests can't create them. On the Free plan you can create Slack notification automations only, so the formula property is the fix there.
I'd write into a separate Text property first, such as Clean name, because a wrong formula then fills a spare column instead of overwriting client names. Switch the target to Name once the results look right, and test that change on a copy of the database first.
- Click the lightning-bolt icon at the top of the database, then New automation.
- Select New trigger, choose Property edited and pick Name. If records also arrive through a client intake form, add Page added as a second trigger and choose When any of these occur.
- Select New action, choose Edit property and pick Clean name, or Name once you've tested it.
- In the value field, select ∑ to write a formula. Select Trigger page in the list on the left, type a period right after it, and select Name, the same steps Notion's help gives for its own Trigger page examples.
- Wrap that reference in the each-word recipe, then select Create.
let(
clean, Trigger page.Name.trim().replaceAll(" +", " "),
if(empty(clean), "",
clean.split(" ").map(current.substring(0, 1).upper() + current.substring(1)).join(" ")
)
)

A few rules shape how this behaves:
- Database automations can't be triggered by other automations, so the edit this one makes won't start any other automation that watches Name, such as one that sends a notification.
- Running the each-word recipe on a name it has already fixed returns the same name, so a repeat run can't change it further.
- The Every {frequency} trigger works with every action except Edit property, so a scheduled cleanup of old records isn't available. Names already in the database stay as typed until someone edits them.
- An automation that has worked before and then hits an error is paused, and when a formula doesn't execute properly Notion may not notify you. After a fix, open ••• → Automations, hover over the automation, select ••• and toggle Active back on.
- Automations don't act on pages with restricted access. If you build one on a view, it only runs for pages that still match that view when the trigger occurs.
Our guide to defining the trigger, action and exception helps you settle which records the automation should touch before you build it. If you'd rather run the cleanup with a click, use a button instead. Notion's buttons help says buttons are available on all plans, with some actions limited to paid plans. Our comparison of buttons and database automations shows when a click is the better trigger.
Capitalizing text as you type on a page
If you meant ordinary page text rather than a database value, there's no formula to write. Notion's editor has no change-case command: its writing and editing basics list Markdown shortcuts and block actions, and none of them change letter case. Three routes cover most needs:
- Mac typing. Apple's Input Sources settings guide puts Capitalize words automatically under Apple menu → System Settings → Keyboard → Text Input → Edit. Apple says it capitalizes the first word of a sentence and proper nouns as you type, in apps that support it, so it helps with new text rather than text already on the page.
- Existing text with Notion AI. Click ⋮⋮ beside the block and choose Ask AI to have Notion AI rewrite it. That's a model rewrite rather than a case switch, so reread names afterward. Our Notion AI review for small teams covers which plans include it.
- Windows and Word. AnyCase, which makes its own case-conversion app, describes the Microsoft Word round trip: paste the text into Word, use Home → Change Case or Shift+F3, then copy it back.
Questions that come up next
Does this work on a Title property and a Text property?
Yes. A Title property and a Text property both give the formula plain text, so prop("Name") behaves the same way for either. Relation and Rollup properties can return lists instead, and a list needs a different approach before any of these recipes apply.
Why do some guides use dozens of replaceAll() calls?
Some guides start from the premise that formulas can't change capitalization and simulate it with one replaceAll() call per letter, 26 of them for lowercase alone. Notion's function reference lists upper() and lower(), which convert text to uppercase and lowercase directly, so the three-function recipes above do the same job in a few lines. replace() and replaceAll() swap each match for the replacement text you supply, and the reference doesn't document a replacement that changes case, so I'd keep case work in upper() and lower().
Can Notion AI write the formula for me?
On Business and Enterprise plans, the formula editor has a Notion AI field where you describe what the formula should do, and Notion lists "Make this formula handle edge cases" among its example prompts. Compare whatever it produces with the results table above before you rely on it in a client database.