Screenshot from a Notion tutorial by Toni Sian demonstrating how to use Notion’s new database row permissions feature to build secure client portals. The image shows Notion’s project and task databases with page-level access settings and permission rules for sharing data safely with clients.

Notion Can Finally Do Client Portals!

October 22, 202516 min read

Introduction to Notion's New Feature

Notion have finally done it. They've enabled database row permissions, which means that we can finally get closer to real client portals in Notion.  I say closer because we're not a hundred percent of the way there yet, but we're definitely 95% I would say. So this is a new feature which enables you to give more granular access.

And in this video we're gonna walk through a couple of things.

Setting Up Database Row Permissions

I'm gonna show you, what are database row emissions and how do you set them up? I'm gonna show you how to create a client portal within that framework, and then we're gonna go over a couple of the limitations as well.

Creating a Client Portal

 Okay, so for this video we're gonna be working with two databases, a projects database, which we're gonna use this website revamp project right here, and a tasks database. Now you can see this is a general tasks database, so it has some of the tasks that are related to the project that we're gonna be looking through in the video, but also some of the tasks are not related to that project, which is pretty standard.

And I'm gonna show you how you can just share these specific tasks with your client, with your external. Collaborator and you don't have to give up access to the entire tasks database like you had to in the past. So this is the big shift. This is the big paradigm shift.

So let's have a look at this website revamp project from our internal perspective.

The way that this page and project is set up is gonna be really simplistic. So obviously extrapolate what you learn here out into, your specific structure and add your layers of complexity. So you know, we have this, we have a project with a bunch of tasks and a couple of requests. You might notice this little yellow key right here.

This is the signifier that we are using database row permissions.

Configuring Permissions and Access

So let's go set them up. You need to go to the actual root database, so you have to make sure that you're on the actual low level database, you're not looking at a linked view or anything to double check. You can click on these three dots and if you see this option right here, lock database, it means you are on the database.

It's just a little hack that I use sometimes. So if we click the share menu, you're gonna see all the standard ui. But right next to this new tag, we've got page level access. So in database terminology, it's being referred to across the notion community as database row permissions. 'cause this is how it's commonly known in database architecture.

But notion itself within the app is referring it to as a page level access. That's just one thing to keep in mind. So you can, let me delete this permission room to show you from the start. You can add a new rule and. Within this context, you can select two options. Currently, they're probably gonna add some more in the future.

One is you can apply this rule to any of the person properties that you define in your database. So the person property that I've got right now is called owner, like owner of the task, right? Or you can choose to apply the rule to the created by, the created by is more of a baked in property that notion ships with you can't edit this.

So whenever you create a new item, it kind of timestamps it and says, this was created at this time and created by this person. You can't change this. The reason I'm telling you the difference is, is because if you click owner you'll see this becomes highlighted and you can then select.

The permission level for any person in that property. And it goes from view to can comment all the way up to can edit as the maximum, but if you choose created by it goes all the way to full access. So that's just a small difference to, to take into account. Let's stick to the owner property though.

'cause I just wanna be able to select this field right here and put my external guests, my external collaborators into that field and let them. Have access to it and to be able to edit it so that we can work within a client portal context. So let's give them, can edit and create the rule. There we go. So you can add more rules, but I think this is it for now for a client portal.

As you can see, that property has changed. We've got the key right there and that means we are set up and good to go. That's it. Just make sure the on the root database and make sure you select the property and the definition that makes sense for you.

So let's jump back to this internal view. So right now, this is, you know, not shared with anyone.

And we have a bunch of tasks, we'll come to requests later. So let's just focus on the tasks first. We have got them filtered to this Project Website Revamp. So we've got five tasks here. Now, the owner is me, that I'm the one who's gonna be doing these tasks theoretically. Let's remove this actually, this is from previously.

And then we have a client field. Now you don't have to set it up with two separate fields, but I've just not done that for clarity. And you can see that client field is the one that I set up with this role of permissions. And it means if I add my client here that I've invited, they can have access to that page and that page only.

Like if I just gave them access to this page right here, they're not gonna see the other four, which is amazing. So lemme just check the sharing is right. Yeah. This is no sharing here.

Client View and Interaction

Okay, now let's jump over to the view that you would commonly give to the client. So this is like an external page. You can see I'm, I'm relating to it right here.

You might be asking, oh, why are you giving, why are you creating an extra page to give to the client? Why don't you just give them this page? Right? It's a good question. Consider that this would actually usually live inside a project's database, and you would have extra properties at the top here, right?

The one thing with this update is that it enables row level access, but it doesn't enable property level access. So, for example, if I, if I shared this raw page, this project page, let's imagine it as with a, an external guest. They still can see property names. They might not be able to see property info if it's related material, but they can still see names and it might have some sensitive data.

We, we might not want them to see, for example, a property called, project fee or something like that. So that's one of the limits. We don't have property level permissions, but I have heard from the grapevine that they might be coming soon. So we create an external page we link it to the internal page and we say to ourselves, okay, this is the one that we're gonna share with the client.

As you can see, it's pretty, pretty standard. We've just got some tasks and we have a button to submit a request, you know, like a bug or a new feature request. But again, we'll just start on tasks. So the first thing we do is we share with our collaborator. So I've done it already. I'll just remove it so we can start it again.

So I'm gonna share it with the test account. And this person doesn't use Notion they don't have an account. I'm just inviting them via email and check this out. It's on this page, we're gonna see them. Yeah. Okay. They don't have access, which is expected, so I'm gonna invite them in. This is what you would do.

I'm gonna say test, and then I'm going to click this guest and I'm gonna say they have can view access only send the invite  before we have a look at what it looks like from their side. Let's have a look right here. So we are just looking at a linked view of our primary tasks database. This one right here.

We don't have any filters applied, so we're seeing the entire database right now. Now, I want you to have a look at what this looks like from the client side. Like I have not given the client access to this database right here. It's just internal. So I expect when I give them this page that they're just gonna see nothing right here.

Which is what we expect. So let's go and check it out. Here we go, just refresh. They get access to this page. They see everything else. They see this button, but they don't see anything in tasks. They can't add a new task. They can't mess with the properties. They, and they don't have any sneaky backend access as well.

Like they can't click these three buttons and click view database. They don't have, they don't have access to it. So this is all working as expected. It's nice and secure. Now let's just jump back to the internal view. Again. This is just the internal view of our tasks DB filtered by our project. I'm gonna say that we want the client to see this one in their portal, so I'm gonna say Test D time.

Soon as I do that, that is the trigger that enables them to see just this row. So if I jump over to their side, check it out, within their linked view of the database, they can only see that item. How sick is that? They can open it. They have full edit access, they can change items on the page body. They can even change the dates here.

Again, if you maybe don't want them to mess with properties, you can build, pull this down to just can comment. It's up to you. You can see here they do get access to all the properties in my tasks, right? So they can see that it's related to a project because they don't have access to that database, it just appears, has no access to them.

This loops back to what I was saying about there's no property level definitions yet, but they will come a bit later. So this is really cool. I can just go through and say, okay, I want to add him to this one as well. It applies instantaneously. There we go. So this gives you a bit of control. Maybe you want to only show some items internally and some externally.

Or maybe you wanna just show them all externally, that's fine. You could maybe set up a filter here and just say, look the client is always gonna be this guy. And then whenever you create a new item, it automatically applies that filter using these forcing functions that notion has with filters.

And then he sees this one as well. Obviously it's blank 'cause I didn't fill it in properly. Apart from new item these are just some ideas again. Notion is super flexible. You can create your own workflows very easily. So let's just add him to all. We'll drag this along and now he can see all five. Okay,

now let's move on. Hopefully this makes sense.

Handling Requests and Tasks

One of the common workflows that you want your guests to be able to. I have access to is the ability to add items. So, you know, usually if you're working on an ongoing project, it's kind of a nice way, it's a nice functionality to give to say you can add a task here or you can add a request for a task at least.

But you can see there's no new button. There's no way I can come here and add a new row that is a limitation of this current feature. And they may be fixing it in the future. But who knows?

So right now we're talking about guests, right? This does change slightly if you're dealing with members you have easier ways to give them the ability to add tasks.

But let's just keep it as guests right now. 'cause I wanna speak to more of the everyday user. And this is the common use case that people run into with notion. It's like, oh, they want to invite external people who don't use Notion and they don't want to invite them as a member and pay for them, right?

That's the big difference. The way that we get around this, obviously if you want to add this functionality, we are gonna add this button here that enables them to submit a request. I'll show you this from the internal viewpoint. All this button does is I've set it up to open up a request form that adds data directly to my tasks database.

So it's just a, a sort of a workaround to get to my tasks database. If we have a look at the tasks database. We've got a request form on the database level and we, it's a public form, which is important. I'll get to that again in a second. But we enable some fields like task name. We have a simple text property that lets them input the client name and the project name.

We're going, this is pretty important. It's a bit of a hacky workaround, but it lets us triage and figure out where these requests are coming from and where to apply them to. Then we have the type, you know, this, this is just an example. Maybe it's a new feature or a book, and then some descriptive notes.

In terms of the settings, we wanna make sure that this is public. Not internal. Guests won't have the ability to use like internal only forms. So again, we have to make sure this is public. When you do select public though, it does automatically apply anonymous responses. So on your side, you're not gonna see who it came from, hence.

Why we need their name and their project in order to sort of file it accordingly when we, when we receive it. And that's it. So we, copy that form link, essentially we paste it. We can either paste it as a direct form here or I've embedded it inside a a button right here.

So I'm gonna show you what that looks like from the, from the user side now, and I'm gonna show you, once they submit that. Item what it looks like here. So let's say, do you know what we're missing? Let's say they have a bug, right? I'm the client. I hit this button, I get this text. Are you sure this is not some outrageous request that falls out of the agreed scope?

Okay. And then they come to this form, they say something like Nav button bug. Super weird. They give their name. This is coming from testy tone. Whoa. The project is what was it, web something, website, revamp. They're gonna say it's a bug and they say, oh my God. It's all, it's all broken. You know what clients are like sometimes.

So we hit submit. This should work. There we go. So obviously nothing's changed from their side yet. We need to sort of triage it and add it manually which is a good workflow anyway. We don't really want clients to be adding tasks willy nilly. So on the internal view, we have a new request down here.

Got this nav button. And again, just to show you that this is coming from tasks. That's it. So I guess, I guess entered in as a task with a type with a note. We get the project name and the client name and we've set up some specific filters to show this. So we're just showing it where the client name is not empty, when the project name is not empty, and where the project relation is empty or the owner is empty.

This is basically just a bit of filtering to make sure that once we triage this and assign the relevant fields then this is gonna disappear from this view. So all we need to do is say, okay, what's the project? They said it's website revamp. Let's make sure it's website revamp. And the client has testone.

Okay, cool. That's this guy, and then it disappears. Ah, should disappear. Okay, I need to change these filters. Maybe I did something wrong here. But this should disappear. But you can see. The important thing is it's added to our tasks in the website revamp. So right now it is not actually, it is viewable to the client.

So it's pretty, pretty set up already. So we can say, let's look at the tasks from their side and look, they have seen, we've added that task to the project. So that's just one workaround. Again, it's not, Super clean, but it's the best like native way. I think we can do it. Now there are other workarounds where you can use multiple notion database automations to trigger on status updates and then apply specific fields.

Or you can use external forms like tally, for example. But it gets a little bit convoluted and I think this is probably gonna be fine for most users.

Conclusion

That is it. That's how you set up a client portal. You don't have to do this ludicrous behavior of sharing the entire database of projects and tasks like you had to do before.

You just expose what you want to expose. There's a couple of little manual workarounds, but as you can see, that's all you need to do. Set up those rules tweak it according to your workflows. And Bob's your uncle, you've got. Pretty good client portals in notion, and they're gonna keep iterating on this feature.

Like I said, they're probably gonna add a bit more robustness to this so it will become even better in the future. Notion have built this with purpose and I think they're gonna keep expanding it because it's been such a large community ask. So it's really cool to see this out and live. So go ahead, start playing with it and lemme know in the comments if you come up with any other workflows.

Because there's with everything in notion, there's loads of ways to do the same thing. But I hope that has given you some food for thought and has shown you the ropes. If you wanna work with a team of notion consultants, certified notion consultants who breathe notion day in, day out, and who can help you set up complex integrations and workflows like this, then get in touch with us.

We've got some description in the description below, and we'll jump on a call with you and we'll see. If we can help you out. Alright, thanks for watching the video. I know it's pretty technical, but hopefully you learn something. Cheers.

PremiumOps is the #1 Rated Certified Notion Agency globally. Our carefully vetted partners are certified experts in Notion and automations, experienced in helping businesses organize their team, work and information in one place on Notion. Book a free discovery call here: https://notion.premiumops.ai/booking

PremiumOps.ai

PremiumOps is the #1 Rated Certified Notion Agency globally. Our carefully vetted partners are certified experts in Notion and automations, experienced in helping businesses organize their team, work and information in one place on Notion. Book a free discovery call here: https://notion.premiumops.ai/booking

LinkedIn logo icon
Instagram logo icon
Youtube logo icon
Back to Blog