Investor Portal

Give investors self-service access to view their notes, balances, accrued interest, statements, tax documents, and account preferences through a secure web portal.

Portal Overview

The investor portal is a self-service web application at /portal/ that allows investors to view their investment information without contacting staff. The portal reduces support calls and gives investors 24/7 access to their account data.

Notes & Balances

View active notes with current principal, accrued interest, and payment history.

Statements

Download monthly and quarterly statements in PDF format.

Tax Documents

Access 1099-INT forms, certificates, and correspondence.

Access & Authentication

Investors log in at https://cefcore.com/portal/ using credentials issued by fund staff. Authentication uses the same JWT-based system as the main application with role-based access control.

ComponentDetails
URLhttps://cefcore.com/portal/
User RoleCUSTOMER -- restricted role with read-only access to own data
AuthenticationJWT bearer token with 24-hour access tokens and 7-day refresh tokens
Entity LinkingUser is linked to a CRM entity via crm.user_entity_link
Data IsolationRow-level security (RLS) ensures investors only see their own notes and documents

Important: Investor accounts must be created by fund staff through the admin interface. Investors cannot self-register. Staff creates the user in Admin → Users, assigns the CUSTOMER role, and links the user to the investor's CRM entity via crm.user_entity_link.

Setting Up Investor Access

Follow these steps to grant an investor access to the portal:

  1. Verify CRM entity exists: Navigate to CRM → Entities and confirm the investor has an entity record with type INVESTOR. Note the entity_id.
  2. Create user account: Navigate to Admin → Users and click + New User. Enter the investor's email address and assign the CUSTOMER role.
  3. Link user to entity: In the user record, set the entity link to connect the user account to their CRM investor entity. This is stored in the crm.user_entity_link table.
  4. Send credentials: Provide the investor with their email and temporary password. They will be prompted to change their password on first login.
  5. Verify access: Ask the investor to log in at /portal/ and confirm they can see their notes. The entity-based RLS automatically filters data to show only their linked notes.

What Investors See

The portal is organized into nine pages accessible from the portal navigation. Each page displays data filtered by the investor's linked entity.

Dashboard

Summary view showing total invested principal, total accrued interest across all notes, number of active notes, and recent activity.

My Notes

List of all investor notes with current balances, interest rates, maturity dates, and status. Click any note to see full details including payment history and accrual records.

Statements

Monthly and quarterly statements available for download as PDF. Statements show beginning balance, interest accrued, payments received, and ending balance for each period.

Documents

Repository for tax documents (1099-INT forms), investment certificates, maturity notices, renewal confirmations, and other correspondence.

Account Settings

Investors can update their contact information, communication preferences (email/mail), and change their password.

Security Architecture

The investor portal enforces strict data isolation to ensure investors can never access another investor's data. Security is implemented at multiple layers.

JWT Authentication

All portal API requests require a valid JWT bearer token. Tokens are issued at login with a 24-hour expiration and can be refreshed for up to 7 days. Tokens contain the user's ID, role, and linked entity IDs.

Entity-Based Row-Level Security

Database queries are filtered by the authenticated user's entity_ids extracted from the JWT. PostgreSQL RLS policies on the investor_notes, portal.customer_document, and portal.notification tables enforce this at the database level.

CUSTOMER Role Restrictions

The CUSTOMER role has read-only access to a limited set of portal-specific API endpoints. CUSTOMER users cannot access any admin, GL, CRM, or loan management endpoints.

API Key Access (Optional)

For programmatic integration, investors can be issued API keys with cefk_ prefix. Keys are stored as SHA-256 hashes in portal.api_key with configurable scopes.

Portal API Reference

The customer portal uses the following API endpoints. All require JWT authentication with the CUSTOMER role.

MethodEndpointDescription
GET/api/v1/customer-portal/dashboardSummary data: total invested, accrued interest, note count
GET/api/v1/customer-portal/notesList investor's notes with balances (filtered by entity RLS)
GET/api/v1/customer-portal/notes/:idDetailed note view with payment history
GET/api/v1/customer-portal/statementsList available statements
GET/api/v1/customer-portal/documentsList tax documents, certificates, correspondence
GET/api/v1/customer-portal/documents/:id/downloadDownload a specific document (PDF)
GET/api/v1/customer-portal/notificationsList unread notifications (maturity notices, etc.)
PUT/api/v1/customer-portal/profileUpdate contact info and communication preferences

Admin: Managing Portal Investors

Fund administrators manage investor portal access through the admin interface. Common tasks include:

  • Upload Documents: Upload 1099-INT forms, certificates, and correspondence to portal.customer_document. These appear immediately in the investor's Documents section.
  • Send Notifications: Create notifications in portal.notification for maturity reminders, rate changes, or general announcements. Investors see these on their dashboard.
  • Generate Statements: The statement generation module creates monthly and quarterly statements automatically. Statements are stored as PDFs and linked to the investor's portal account.
  • Reset Passwords: If an investor is locked out, reset their password through Admin → Users. A temporary password is generated that expires on first use.
  • Deactivate Access: To revoke portal access, deactivate the user account. The investor's data is preserved but they can no longer log in.

Best Practices

  • Upload 1099s Promptly: Upload 1099-INT forms to the portal as soon as they are generated in January. Investors expect electronic access before the mailed copies arrive.
  • Verify Entity Links: After creating a portal user, always verify the crm.user_entity_link is correct. A missing or incorrect link means the investor will see no data.
  • Use Notifications for Maturity: When a MATURING_SOON event fires, create a portal notification in addition to the email notice. This ensures the investor sees the notice even if the email is missed.
  • Review Portal Access Quarterly: Audit active portal users each quarter. Deactivate accounts for investors who have fully redeemed all notes and have no active relationship.
  • Keep Statements Current: Ensure monthly statement generation is running on schedule. Investors often use portal statements for their personal financial records and tax preparation.

Troubleshooting

Common Issues:

Investor sees no notes after logging in

Solution: Check the crm.user_entity_link table. The user must be linked to the correct investor entity. Verify the entity_id matches the investor's notes.

Investor cannot log in

Solution: Verify the user account is active in Admin → Users. Check that the role is set to CUSTOMER. Reset the password if needed.

Statements are missing for a period

Solution: Check the statement generation job in Admin → Monitoring. If the job failed, re-run it manually for the missing period. Statements are generated from accrual and payment data.

Investor sees another investor's data

Solution: This should never happen due to RLS. If it does, immediately check the crm.user_entity_link for the affected user -- the wrong entity_id may be linked. This is a critical security issue that must be resolved immediately.

Accounting Integration

Learn how investor notes integrate with the general ledger, chart of accounts, and financial reporting.

Chart of Accounts Guide