Skip to content
Notifications
Clear all

Hot take: Their 'granular permissions' aren't granular enough for client-facing portals.

7 Posts
6 Users
0 Reactions
18 Views
(@hannahr2)
Reputable Member
Joined: 2 months ago
Posts: 233
Topic starter   [#27604]

Okay, I’ve been holding this in for a few weeks while I stress-tested this on a real client project, and I have to get it off my chest: Granola’s much-touted “granular permissions” system falls painfully short when you’re building a true client-facing portal. It feels like it was designed for internal team roles, not for the nuanced control you need when external clients are logging in.

Here’s the specific scenario that broke the camel’s back for me. I was setting up a portal for a marketing agency client. They wanted their own clients (the end-clients) to be able to log in and see:
* Their project timelines
* Draft assets *only* for their own projects
* A shared resource library (some documents for all, some specific to a client)
* Invoice history (but only their own, obviously)
* A team contact list (but not internal cost breakdowns attached to contacts)

The dream was to have one “Client” role in Granola that I could apply to all end-users, but tweak the visibility *per client* for items like projects, assets, and invoices. That’s the definition of granular in my book—object-level permissions tied to the user’s relationship (e.g., which client account they belong to).

What I found was that Granola’s permissions are largely **type-level**. I can control whether a “Client” role can *generally* “View Projects” or “View Documents.” But I cannot, out-of-the-box, say “View only the Projects where the ‘Client’ field matches your user account.” That distinction has to be managed by:
* Creating separate **user groups for each individual client** (a maintenance nightmare with dozens of clients), or
* Building a labyrinth of **custom view filters and dashboards** for each client, which feels like a workaround, not a permission.
* Manually sharing items one-by-one, which doesn’t scale.

The lack of true object-level or field-level permissions means the system isn’t “set and forget.” It’s “set and constantly micromanage.” The risk of accidental data leakage between clients is too high for comfort, so we had to revert to creating separate, simplified tools outside of Granola for the client portal—which defeats the purpose!

Has anyone else run into this wall? I’d love to hear:
* If you’ve found a clever workaround using user fields, custom automations, or third-party integrations to fake object-level permissions.
* Whether this is on Granola’s roadmap, because for a tool at its price point targeting agencies, this feels like a foundational gap.
* If I’m somehow missing a configuration hidden deep in the enterprise settings.

I adore Granola for internal operations, but this has been a real disappointment. My workflow now involves duplicating efforts instead of having a single source of truth.

—Hannah


Measure twice, automate once.


   
Quote
(@ellaq)
Honorable Member
Joined: 3 months ago
Posts: 411
 

Ugh, I feel this so hard. That exact "one role to rule them all" dream is what drew me to Granola in the first place for portal work. The reality is you end up creating a separate *role* for each client account, which is a maintenance nightmare.

I hit a similar wall with invoice history. The permission is basically "can view invoices" yes/no. There's no way to scope it to "only invoices where their attached company matches the user's company." So you either give them access to all invoices or none. It forces you into weird data duplication or a separate external system just for client-facing docs.

Have you found any workarounds, even hacky ones? I started using their API to build a separate micro-portal for one client, but that defeats the purpose of using an all-in-one platform.


Pipeline is king.


   
ReplyQuote
(@heatherm)
Reputable Member
Joined: 3 months ago
Posts: 255
 

That's the exact frustration. The moment you need *scoped* permissions - like invoices where "client company = user's company" - and not just global yes/no switches, the system's internal roots show.

It forces you into a choice: manage hundreds of nearly-identical roles, or build a separate layer of logic outside the platform. Both options pretty much erase the efficiency gain you were buying the tool for in the first place.

I ran into this with audit logs for a compliance-heavy portal. Clients needed to see activity logs, but *only* for actions on their own data. The permission was just "view audit log," full stop. Had to scrap the whole native portal idea.


Ask me about my RFP template


   
ReplyQuote
(@amyc)
Reputable Member
Joined: 3 months ago
Posts: 397
 

You're absolutely right about the maintenance nightmare of per-client roles. It scales terribly.

I've seen teams try to mitigate this by using Granola's user groups as a pseudo-scoping layer, but it's still manual binding. You create a group per client company, assign the "client" role to the group, then manage access at the group level. It's one less role to edit, but you're still creating a unique entity for every single client.

And yes, the API workaround you mentioned just proves the point. Once you're building a separate micro-portal, you're maintaining a whole other application. You lose the single source of truth. Have you submitted a feature request for scoped permissions to their product team? Sometimes a chorus of similar use cases gets it prioritized.



   
ReplyQuote
(@hannahr2)
Reputable Member
Joined: 2 months ago
Posts: 233
Topic starter  

Oh, that "one role per client" spiral is a real trap. I fell into it on my first portal build, too. The maintenance quickly becomes a second job.

Your invoice example is perfect. I hit that same wall, and my hacky workaround was to use their custom field logic to *hide* the invoice module entirely from the portal navigation unless a specific tag was present on the user's account. Then, I used an automated Zap to attach that tag only when a new invoice was generated and addressed to that user's company. It's a data-agnostic permissions layer, but it got the job done in a pinch.

Honestly, the separate micro-portal route is where I ended up going for a scalable solution, too. It feels like a defeat, but once you've built that external viewer once, you can reuse it. Still, it shouldn't be necessary. 😕


Measure twice, automate once.


   
ReplyQuote
(@annaw)
Reputable Member
Joined: 3 months ago
Posts: 310
 

Your Zap/tag workaround is clever for hiding modules, but I found it starts to crumble when a client needs to see *partial* data within a module, not just the whole module on/off. Like, what if they need a dashboard widget showing their overdue invoices, but the permission only lets you show a widget or not? You're back to square one.

Building a separate viewer *does* feel like a defeat. I keep wondering if the real cost isn't just the extra dev work, but the lost opportunity for those clients to interact with the data in richer ways because they're now stuck in a read-only mirror.



   
ReplyQuote
(@henryj)
Reputable Member
Joined: 2 months ago
Posts: 224
 

You're describing exactly why their marketing is misleading. They call it "granular" because you get fifty different checkboxes for modules and actions, but it's all useless without the foundational ability to scope those permissions to a user's specific data segment. A "can view invoices" checkbox isn't granular if it shows every invoice in the system. It's a binary sledgehammer.

The real cost here is the liability. You think you're building a secure client portal with their permission system, but you're actually one misconfigured role away from exposing invoice A to client B. The workarounds, like using tags and Zaps, introduce their own failure points and data drift. It's a house of cards.

This isn't a missing feature. It's a fundamental design choice that reveals who the platform is actually for: internal teams who all need the same broad access. Trying to force it into a client-facing model means you're assuming all the risk.


Show me the data


   
ReplyQuote