Your Notion formula returns a list, not text

In the previous articles, we learned about logic functions and due date labels. This one is about a quieter bug. The formula looks fine in the column, and then a filter, a search, or the next formula falls over. 💯
This article is a part of the Fantastic Formulas series. This series features helpful articles about formulas in Notion.
Formulas 2.0 changed something that is easy to miss. People, relations, files and multi-selects used to collapse into a line of text. Now they come back as a list. When Notion migrated the old formulas, it wrapped them so they would keep behaving, which is why so many of them arrived looking like this. ✅
prop("Person").map(current.format()).join(", ")
What Notion’s migration left behind
It is an ugly thing to find in a formula you wrote two years ago, so people delete it. The column still shows the same names afterwards, which is exactly the problem. Nothing else in the database agrees with the column any more.
Today we will look at when to keep the list and when you actually want text. As always I will work from a small database, and this time let’s say we are tracking client projects. 👀
In this database shown below, you can see 2 properties. First property shows the project name. Second property is a Person property called Assignee. ✅
Example - Simple Clients database
Website rebuild has one person on it, Brand kit has two, and Monthly retainer has nobody yet.
1. The cleanup that looks fine
Let’s “simplify” Notion’s wrapper down to the property itself and see what happens.
prop("Assignee")
Cleaned formula that still returns a list
As you can see below, the formula is perfectly working 🔽
prop(“Assignee”) still looks like names
It renders identically to the Person column, which is what makes this one so hard to catch. What you are holding is not text, it is a list of people that Notion happens to draw as chips. Filters looking for "Alex Chen", concatenations like "Assigned to " + prop("Cleaned"), and any later formula expecting a string will all throw a type error against it, and none of that shows up in the column you are looking at.
So leave the list alone when you want to count, filter or map it, and convert it only at the point where you genuinely need a string.
2. map() and join()
When you do need text, this is the wrapper Notion added, and it earns its place. map() walks each item, format() turns that item into a name, and join(", ") glues the names together. The syntax is
prop("Assignee").map(current.format()).join(", ")
Person list to text
Say we also want to know how many people sit on a row. Resist converting it first. Count the list while it is still a list. ✅
prop("Assignee").length()
Count people on the list
As you can see below, both columns behave 🔽
As text vs Count
Brand kit becomes Priya Shah, Alex Chen and 2. Monthly retainer comes out blank as text and 0 as a count, and that empty row is the reason I would not write "Assigned to " + prop("Assignee") without an empty() check in front of it.
3. Keep the list, or convert it
Here is the short rule that saves the rest of your workspace:
- Names in a sentence, a title, or a filter that searches text → convert with
.map(current.format()).join(", ") - A count, a “has Alex?” check, or another formula that walks the related pages → keep the list and reach for
.length(),.includes(),.filter()or.map() - One person out of several →
.first()or.at(0), rather than testing== "Alex Chen"against the whole list
prop("Assignee").filter(current.name() == "Alex Chen").length() > 0
Check if Alex is on the row
That one stays a proper checkbox all the way through, because it never turned into text in the first place. ✅
And if you already stripped Notion’s wrapper off a migrated formula, put it back. If relations are still new territory, our guide to relations in Notion is worth a detour first.
Conclusion
Now you know why a formula can look perfect in the column and still break filters, concatenations and the property next door! People, relations and multi-selects are lists. Count them as lists, and turn them into text only at the moment you actually need a string.
The .map().join() that Notion added is doing real work, so leave it there unless you have decided you want the list. 🔥
I hope this article was helpful and easy to understand. At Prototion, we are on mission to make Notion easy for everyone! So we regularly post Helpful articles about Notion like this one. 📄
Remember to check out the Fantastic Formulas series for more articles about Notion formulas. Doesn’t matter if you are a Notion beginner or a pro, I believe you will find this series helpful. Also, don’t forget to follow us on 🐦 Twitter for daily updates, latest Notion template launches and amazing deals & discounts on Premium Notion templates! 😍
Templates that do this for you
Built by independent makers on Prototion.
FreeList of languages
@LumibernThis is a simple list of 184 languages with the corresponding language codes according to ISO 639-1.
$20Birthday Plannings
@lunasa.businessBirthday Plannings gives you an ability to plan, manage and execute birthdays of your beloved ones all in one place.
$7To Do Dashboard
This To Do Dashboard takes a multiview approach to help you stay on top of your daily tasks.