Loading...
Help Center / Getting Started / Portals App Overview

Portals App Overview

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

  1. 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.
  2. Open the catalog β€” Admin β†’ Portals β†’ Catalog. Confirm every public surface in your business is listed and the status matches what you expect.
  3. 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.
  4. Set branding defaults β€” Upload your logo, set primary / accent colors, support email, and footer text. The preview pane shows how each portal will render.
  5. (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.
  6. 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.



One umbrella, every portal β€” catalog, recovery, audit, and analytics in a single home.

Ask AI Product Advisor

Hi! I'm the MangoApps Product Advisor. I can help you with:

  • Understanding our 40+ workplace apps
  • Finding the right solution for your needs
  • Answering questions about pricing and features
  • Pointing you to free tools you can try right now

What would you like to know?