Donation pages are the public-facing forms where donors submit payments. Each foundation can have multiple pages, and Miranda provides six purpose-specific page types with unique editor fields and display logic.
| Field | Type | Description |
|---|
id | UUID | Primary key |
foundation_id | UUID | Owning foundation |
title | string | Page title (e.g., “Annual Fund”) |
slug | string | URL-safe identifier for the page |
type | DonationPageType | Page variant (see below) |
type_config | JSON? | Type-specific configuration |
description | string? | Page description / appeal text |
hero_image_path | string? | Hero image in Supabase storage |
suggested_amounts | JSON? | Array of suggested amounts in cents |
allow_custom_amount | boolean | Whether donors can enter a custom amount |
allow_recurring | boolean | Whether recurring giving is enabled |
allow_donor_covers_fees | boolean | Whether donors can opt to cover fees |
custom_domain | string? | Custom domain (Pro plan only) |
status | DonationPageStatus | draft, published, offline |
Unrestricted giving to support the foundation’s mission. No additional configuration fields.
Donations fund a specific scholarship program.
| Config field | Type | Description |
|---|
scholarship_id | select | Linked scholarship (required) |
show_scholarship_details | boolean | Show scholarship details on the page (default: true) |
Time-bound fundraising campaign with a goal and progress tracking.
| Config field | Type | Description |
|---|
goal_amount | currency | Fundraising goal (required) |
end_date | date | Campaign end date |
show_progress_bar | boolean | Display progress bar (default: true) |
show_donor_count | boolean | Display donor count (default: true) |
Giving in memory or honor of someone.
| Config field | Type | Description |
|---|
honoree_name | text | In memory/honor of (required) |
dedication_message | textarea | Dedication message |
honoree_photo | image | Photo upload |
notify_family_email | email | Email to notify of donations |
tribute_type | select | in_memory or in_honor (default: in_memory) |
Urgent, time-sensitive fundraising need.
| Config field | Type | Description |
|---|
urgency_message | text | Urgency message displayed on page |
expiration_date | date | When the appeal expires |
goal_amount | currency | Amount needed |
show_share_prompt | boolean | Prompt donors to share (default: true) |
Focused on building recurring monthly support.
| Config field | Type | Description |
|---|
impact_per_month | textarea | Monthly impact message |
recurring_only | boolean | Disable one-time donations (default: false) |
suggested_monthly | amounts | Suggested monthly amounts (default: [10, 25, 50, 100]) |
| Status | Description |
|---|
draft | Page is being configured, not publicly accessible |
published | Page is live and accepting donations |
offline | Page is hidden from public but retains its configuration |
Published donation pages are accessible at:
- Subdomain:
yourfoundation.miranda.gives/donate/page-slug
- Direct path:
miranda.foundation/donate/{foundation-slug}
Donation pages are server-rendered Blade templates, not SPA routes. This ensures fast initial loads and SEO indexability. Card data is collected client-side via Stripe.js Elements (PCI SAQ-A).
| Plan | Max donation pages |
|---|
| Starter | 1 |
| Growth | 5 |
| Pro | Unlimited |
| Method | Path | Description |
|---|
| GET | /api/donation-pages | List all donation pages |
| POST | /api/donation-pages | Create a donation page |
| GET | /api/donation-pages/{id} | Show a donation page |
| PUT | /api/donation-pages/{id} | Update a donation page |
| DELETE | /api/donation-pages/{id} | Delete a donation page |
| Relationship | Type | Target |
|---|
foundation() | BelongsTo | Foundation |
donations() | HasMany | Donation |
scholarship() | BelongsTo | Scholarship (via type_config->scholarship_id) |