Portals App Overview
One umbrella for every public-facing portal in your business β catalog, identity & recovery, audit log, and analytics, without each app reinventing the wheel.
What is the Portals App?
Portals is the cross-cutting surface for the public portals your other apps publish β the Field Service Customer Portal, Recruitingβs Candidate Portal, Offboardingβs Former Employee Document Portal, the AFO visitor surface, eSignature kiosks, public Drive links, and so on. Each owning app keeps its own per-portal enable toggle. Portals reads that catalog, never writes β the source of truth stays where the feature lives β and adds the cross-portal concerns: a unified identity & recovery layer (magic-link / OTP), a searchable audit log, daily analytics rollups, branding defaults, custom domains, and security signals.
Core Value Proposition:
- ποΈ Single Catalog β Every public portal in your business in one list, with status, owning app, and a one-click preview link.
- π Unified Identity & Recovery β Configure rate limits, recovery method (magic-link or OTP), and lockout thresholds once; every portal that opts in picks them up.
- π§Ύ Compliance-Ready Audit β Every recovery event captured with hashed identifier, IP, user-agent, and configurable retention β never plaintext PII.
- π Cross-Portal Analytics β Visits, recovery requests, success rate, and conversion rolled up nightly across every portal.
At a Glance
| β±οΈ Setup Time | π Owning Apps | π Recovery Methods | π± Mobile Ready |
|---|---|---|---|
| ~5 minutes | 6+ apps publish portals | Magic-link + OTP | β Yes |
Perfect For:
- π’ Businesses with 3+ public portals β The umbrella adds the most value when you have several portals; under that, the owning appβs built-in settings are usually enough.
- π‘οΈ Security & compliance teams β One place to set rate limits, review the audit trail, and export evidence for SOC 2 / HIPAA-style review.
- π€ Admins responding to incidents β Filter the audit log by identifier hash or IP and trace exactly what happened during a recovery anomaly without exposing PII.
How It Works
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PORTALS UMBRELLA β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β CATALOG βββββββΆβ IDENTITY & βββββββΆβ AUDIT LOG β β
β β (read-only) β β RECOVERY β β (browse + β β
β β β β (defaults) β β CSV) β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β ANALYTICS β β SECURITY β β BRANDING β β
β β (nightly β β SIGNALS β β + CUSTOM β β
β β rollup) β β β β DOMAINS β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Owning Apps That Publish Portals
βββββββββββββββββββ
β PORTALS β
β (umbrella β β
β reads only) β
ββββββββββ¬βββββββββ
β
ββββββββββββ¬βββββββββββ¬ββββββββββΌββββββββββ¬βββββββββββ¬βββββββββββ
βΌ βΌ βΌ βΌ βΌ βΌ βΌ
ββββββββββ ββββββββββ ββββββββββ ββββββββ ββββββββββ ββββββββββ ββββββββββ
β Field β β Recru- β β Off- β β AFO β β eSig- β β Drive β β ... β
βService β β iting β βboard. β β β βnature β β(public β β other β
βCustomerβ βCandid. β βFormer β βVisit.β β Kiosk β β links) β β apps β
βPortal β βPortal β βEmpl. β β β β β β β β β
ββββββββββ ββββββββββ ββββββββββ ββββββββ ββββββββββ ββββββββββ ββββββββββ
Each owning app keeps its own per-portal enable toggle. Portals catalog reads state from each app β flipping a portal on or off still happens in the owning appβs settings.
Key Features
ποΈ Catalog & Discovery
The Catalog is the single registry of every public portal in your business β sourced from PublicPortalConfiguration records each owning app maintains.
| Feature | Description |
|---|---|
| Cross-app portal registry | Every portal in one list β owning app, slug, public URL, status |
| Status badges | Enabled / disabled / requires-token / public-link |
| One-click preview | Open the portal in a new tab without leaving the catalog |
| Jump to owning app | Direct link to the owning appβs settings to flip the toggle |
Use Case: Open the catalog before a quarterly access review to confirm which public surfaces are actually live, who owns each one, and which need a settings change.
π‘ Pro Tip: The catalog is read-only by design. To enable / disable a specific portal, click βJump to owning appβ β that keeps the source of truth in the app that owns the feature.
π Identity & Recovery
Three things live here, all powered by the shared PortalIdentityRecovery concern that any portal can opt into:
| Feature | Description |
|---|---|
| Default recovery method | Magic-link or OTP β applied to portals that support both |
| Per-portal override | Field Service can ship magic-link while Candidate runs OTP, with a one-flag override |
| Rate-limit window | Default 60 minutes (configurable) β sliding window per identifier per portal |
| Max attempts per window | Default 5 (configurable) β drops to lockout when exceeded |
| Identifier hashing | SHA-256 β no plaintext email or phone in the audit |
Use Case: A spike in failed OTP attempts? Drop the rate-limit max from 5 to 3 in Identity & Recovery β every portal using the concern picks up the new limit on the next request.
π‘ Pro Tip: Recovery method is per-portal-overridable, not global. If you want to migrate a portal from magic-link to OTP, set the per-portal override β no code change, the concern reads the umbrella config.
π§Ύ Audit Log
A searchable browser over PortalRecoveryAudit rows β every recovery event your portals emit.
Filters:
- Date range
- Portal (cross-app dropdown)
- Event type (request, send, failure, rate-limited, consume, invalid-token)
- Identifier hash
- IP address
Whatβs captured per event:
- Timestamp
- Portal slug + owning app
- Event type
- SHA-256 hash of the identifier (never plaintext)
- IP address
- User-agent
- Outcome
| Feature | Description |
|---|---|
| Date / portal / event filters | Narrow to exactly the rows you need |
| CSV export | Filtered results downloadable for compliance review |
| Configurable retention | Default 180 days (configurable) β older rows pruned automatically |
Use Case: A user reports they never got their portal token. Filter the audit log by their identifier hash, see whether the request was rate-limited, dispatched, or actually consumed, and trace the failure mode without exposing plaintext PII.
π Analytics
Cross-portal rollups computed nightly by Portals::DailyRollupJob β aggregates PortalRecoveryAudit rows into PortalRecoveryDailyRollup, keyed by (business, portal, day).
Standard Metrics:
- Recovery requests per portal per window (7d / 30d / 90d)
- Sent / consumed / failed / rate-limited counts
- Per-portal recovery success rate
- Unique-identifier counts per portal per window
Trend Charts:
- Requested vs sent vs consumed
- Failed and rate-limited over time
Use Case: Spot a portal whose recovery success rate is dropping week over week β usually a sign the magic-link email is going to spam or the OTP SMS provider is silently failing.
π‘οΈ Security Signals
Surfaces patterns the audit log alone wouldnβt flag without manual scanning.
| Signal | Description |
|---|---|
| Repeat-failure IPs | Top N IPs by failure count over a tunable window |
| Identifiers near lockout | Most-flagged events per identifier hash |
| Cross-portal patterns | One identifier hitting multiple portals β possible enumeration |
| Recent invalid-token events | Token-tampering attempts surface immediately |
π¨ Branding
Per-business defaults the portals can inherit, stored on PublicPortalBranding.
| Feature | Description |
|---|---|
| Logo | Active Storage attachment, used as the portal header logo |
| Primary + accent color | Portal CTA buttons and accents |
| Font | Portal body font |
| Portal title | Default browser tab title |
| Support email | Visible on portal error / help screens |
| Footer text | Optional footer line for compliance / copyright |
| Live preview | Branding applies to a preview pane while editing |
π Custom Domains
Map your own hostname to a portal β portal.acme.com β MangoApps Field Service Customer Portal, for example. Stored on PortalCustomDomain.
| Feature | Description |
|---|---|
| Hostname β portal mapping | One row per domain, tied to an owning portal |
| Per-domain verification token | DNS TXT record to prove ownership |
| Lifecycle | pending β verified β active (or revoked) |
| DNS / TLS / edge routing | Handled by ops; the model captures intent |
π€ Portals AI Agent
A read-only help agent (Agents::PortalsHelpAgent) answers questions about portals from the Ask AI sidebar β features, configuration, and how the catalog relates to owning apps. Can be enabled or disabled per business via the agent_enabled setting.
β° Scheduled Jobs
| Job | What it does |
|---|---|
Portals::DailyRollupJob |
Nightly aggregation of audit rows into PortalRecoveryDailyRollup |
Portals::PruneAuditJob |
Prunes audit rows older than the configured retention window |
Limits & Specs
| Spec | Default |
|---|---|
| Rate-limit window | 60 minutes (configurable) |
| Max attempts per window per identifier | 5 (configurable) |
| Audit retention | 180 days (configurable) |
| Default recovery method | Magic link (per-portal override possible) |
| Allowed roles | Admin, Super Admin (configurable) |
User Roles & Permissions
| Role | Capabilities |
|---|---|
| Member / Manager | No access by default β Portals is a platform admin surface |
| Admin | Browse catalog, configure identity & recovery, view audit log + analytics, manage branding, manage custom domains, export CSV |
| Super Admin | Same as Admin |
The allowed roles list is configurable per business; defaults to admin and super_admin.
How We Compare
The Portals umbrella sits at an unusual layer β most platforms ship per-app portals without a unified cross-app catalog or shared identity-recovery layer.
| Feature | MangoApps Workforce | Stand-alone portal builders | Custom-built per-app |
|---|---|---|---|
| Cross-app portal catalog | β | β | β |
| Unified identity & recovery layer | β | β‘ | β |
| PII-safe audit (hashed identifiers) | β | β‘ | β |
| CSV export of audit events | β | β‘ | β |
| Cross-portal analytics rollup | β | β | β |
| Per-business branding defaults | β | β | β‘ |
| Custom domain mapping | β | β | β‘ |
| Legend: β Included | β Not Available | β‘ Limited / per-portal only |
Why MangoApps Workforce?
- π Unified Platform β Portals reads catalog state from each owning app β flipping a portal on or off still happens where the feature lives, not in a separate stack.
- π§Ύ PII-safe by Default β SHA-256 hashing of every identifier in the audit log; plaintext email or phone never leaves the request.
- π€ AI-Native β Built-in Portals help agent in Ask AI; no extra config or third-party plug-in.
Getting Started
For Administrators
- Enable the app β In Admin β Apps Marketplace, find Portals and toggle it on. Portals is a platform-tier app, so enable only if you have multiple public-facing portals to manage.
- Open the catalog β Admin β Portals β Catalog. Confirm every public surface in your business is listed and the status matches what you expect.
- Configure identity & recovery β Set the default recovery method, rate-limit window, max attempts per window, and audit retention. Per-portal overrides are available where the underlying portal supports both magic-link and OTP.
- Set branding defaults β Upload your logo, set primary / accent colors, support email, and footer text. The preview pane shows how each portal will render.
- (Optional) Add custom domains β If you want portals served from your own hostname, add a custom domain row, copy the verification TXT record into your DNS, and verify. Ops handles the TLS / edge routing.
- Bookmark the audit log β When a recovery anomaly comes in, youβll want it one click away.
Best Practices
- β Donβt enable Portals if you only have one portal live β the umbrella adds value when there are several public surfaces; under that, the owning appβs settings are enough.
- β Tighten rate limits during incidents β drop the max-attempts-per-window if you see a spike in failed recovery; back off afterwards.
- β Filter the audit log by identifier hash, not IP β the hash is the stable user identity; IPs rotate.
- β Export CSV for SOC 2 / compliance reviews β last-90-days of recovery events is usually what auditors ask for.
- β Treat Portals catalog as read-only β toggle individual portals on or off in the owning app, not here.
- β Start with magic-link as the default β easier UX; flip per-portal to OTP only where you need a stronger factor.
Frequently Asked Questions
Q: Does Portals own the toggles for each individual portal?
A: No. Each owning app keeps its own portal enable toggle (Field Service has its customer-portal toggle, Recruiting has its candidate-portal config, etc.). Portals only reads β the catalog surfaces state from each app, but flipping a portal on or off still happens in the owning appβs settings. This keeps the source of truth where the feature lives.
Q: What does βIdentity & Recoveryβ actually control?
A: Three things β (1) the default recovery method (magic-link vs OTP) for portals that support both, (2) rate-limit thresholds for the PortalIdentityRecovery concern, and (3) audit retention. Per-portal overrides are possible: the umbrella sets defaults, individual portals can override.
Q: Is the audit log enough for compliance?
A: Every recovery event (request, send, failure, rate-limit, consume, invalid-token) is logged with timestamp, IP, user-agent, and SHA-256 hash of the identifier β never plaintext. Configurable retention (default 180 days). CSV export available. For SOC 2 / HIPAA-style audits this is generally sufficient; check with your compliance team for industry specifics.
Q: Why is this a separate marketplace app instead of always-on?
A: Two reasons. First, packaging it as an app gives it real surface area β admins discover it, configure it, see analytics. An invisible βplatform featureβ gets ignored. Second, it gates behind a license so it ships as part of the platform tier rather than free-with-everything; the value (cross-portal control, audit, analytics) justifies the gate.
Q: What if I only have one portal enabled?
A: You probably donβt need Portals yet. The umbrella adds the most value when you have three or more public-facing portals; under that, the owning appβs built-in settings are usually enough.
Related Resources
- Apps Overview β Browse the full marketplace catalog
- Field Service Suite β Publishes the Customer Portal that Portals catalogs
- Offboarding Hub β Publishes the Former Employee Portal
- Job Board β Publishes the Candidate Portal
One umbrella, every portal β catalog, recovery, audit, and analytics in a single home.