1) “I get 403: You are not a member of this organization”
Backend permission middleware (requireOrgPermission) requires:
- An
OrgMemberrow exists OrgMember.status === 'active'
2) “I can see the tab in the UI but the API still denies”
Frontend does UI gating by inspectingorg.positions and OrgMember.role.
Backend checks:
- Role names don’t match (
OrgMember.rolevsOrg.positions[].name) - Booleans (
canManageMembers) are true in UI butpermissions[]lacks the string used by middleware
Recommendation: Treat
permissions[] as canonical; keep booleans in sync or remove them from new roles.3) “User can’t access /club-dashboard/:id”
The club dashboard contains an additional client-side gate:
user.clubAssociationsmust contain the org
User and is updated in some code paths (org creation, role assignment), but not all.
If you see false negatives:
- confirm
User.clubAssociationscontains org ids - consider standardizing updates in the backend for all membership creation paths
4) “Verification tiers don’t show up / requests fail”
Check:OrgManagementConfigsingleton exists (GET /org-management/configwill auto-create it)verificationEnabled === true- tier key exists in
verificationTiers
Org.verificationTypeenum allows the tier key you’re trying to persist.
5) “Message rejected for character limit / too short”
Message validation is a min/max across:- org:
Org.messageSettings.characterLimit - system:
OrgManagementConfig.messaging.maxCharacterLimitandminCharacterLimit
6) “Followers don’t work / visibility seems off”
OrgFollower schema currently uses ref: 'Club' for org_id.
If you need correct population or schema integrity, fix the ref and migrate as needed.