Settings & Configuration
Foundation settings control branding, feature toggles, custom terminology, and payment integration. All settings are managed through GET /api/foundation (read) and PUT /api/foundation (update).
Organization profile
Section titled “Organization profile”| Setting | Type | Description |
|---|---|---|
name | string | Foundation display name |
slug | string | URL identifier (used in donation page URLs and subdomain) |
email | string? | Foundation contact email (also used as sender for emails) |
phone | string? | Contact phone number |
mission_statement | string? | Mission statement (up to 2,000 characters) |
org_type | string | Organization type (determines default roles, vocabulary, and modules) |
is_registered_nonprofit | boolean? | Whether the organization is a registered 501(c)(3) |
Branding
Section titled “Branding”Brand colors
Section titled “Brand colors”The brand_colors JSON field stores the foundation’s color palette:
{ "primary": "#1a2744", "secondary": "#c5a55a", "accent": "#c41e3a"}These colors are applied to donation pages, email templates, and the foundation’s public site.
The logo_path field stores the path to the foundation’s logo in Supabase S3 storage.
Modules
Section titled “Modules”The enabled_modules JSON field controls which features are available in the admin dashboard:
["contacts", "donations", "campaigns", "scholarships", "sequences"]Available modules depend on the organization type. The OrgTypeService::resolveModules() method returns the effective module list based on org_type defaults and any overrides.
Vocabulary overrides
Section titled “Vocabulary overrides”Miranda supports custom terminology so organizations can use language that matches their mission. The vocabulary_overrides JSON field remaps default terms:
{ "contacts": "Constituents", "donations": "Gifts", "campaigns": "Outreach", "scholarships": "Grants"}The OrgTypeService::resolveVocabulary() method merges org-type defaults with foundation-level overrides.
Safety mode
Section titled “Safety mode”The safety_mode boolean flag enables a protective mode for foundations that are still setting up:
- Prevents public visibility of donation pages
- Adds confirmation prompts before sending campaigns
- Clearly marks the foundation as “in setup” in the admin UI
Toggle via:
PUT /api/foundation{ "safety_mode": true}Stripe Connect
Section titled “Stripe Connect”Stripe Connect configuration is managed through dedicated endpoints (see Stripe Connect Integration):
| Setting | Description |
|---|---|
stripe_connect_id | Connected account ID (set during onboarding) |
stripe_connect_status | pending, active, or disconnected |
The Settings page in the admin dashboard shows the current Stripe status and provides buttons to:
- Connect — Start the Express onboarding flow
- View status — Check
charges_enabledandpayouts_enabled - Disconnect — Remove the Stripe connection
Directory listing
Section titled “Directory listing”| Setting | Type | Default | Description |
|---|---|---|---|
directory_listed | boolean | false | Whether the foundation appears in the public directory on miranda.gives |
category | string? | null | Foundation category for directory browsing |
tagline | string? | null | Short tagline shown in directory listings |
Trial and billing
Section titled “Trial and billing”| Setting | Type | Description |
|---|---|---|
trial_ends_at | datetime? | End of the 14-day trial period |
frozen_at | datetime? | Set when the account is frozen (billing failure) |
The isFrozen() method returns true when frozen_at is not null. The isTrialing() method checks whether the trial is still active.
Settings merge behavior
Section titled “Settings merge behavior”When updating the settings JSON field, the API merges the new values with existing settings rather than replacing them. This preserves keys like plan that are managed by the billing system:
// FoundationController::update()if (isset($validated['settings'])) { $validated['settings'] = array_merge( $foundation->settings ?? [], $validated['settings'] );}Enrichment
Section titled “Enrichment”The CharityEnrichmentService and EnrichCharityDataJob can populate foundation data from external sources:
| Field | Source |
|---|---|
founded_year | Charity data API |
city, state | Address lookup |
ntee_code | NTEE classification |
total_revenue, total_assets | IRS 990 data |
revenue_year | Year of financial data |
enriched_at | Timestamp of last enrichment |