Scholarship Programs
Scholarship programs in Miranda define the award amount, eligibility criteria, application deadline, and a custom form with configurable fields. Each program progresses through a defined lifecycle from draft to closed.
Scholarship model
Section titled “Scholarship model”| Field | Type | Description |
|---|---|---|
id | UUID | Primary key |
foundation_id | UUID | Owning foundation |
name | string | Scholarship name |
slug | string | URL-safe identifier (used in public form URLs) |
description | string? | Full description shown to applicants |
amount | integer | Award amount in cents |
eligibility | string? | Eligibility requirements text |
deadline | date? | Application deadline |
max_awards | integer | Maximum number of awards to grant |
form_fields | JSON? | Custom application form field definitions |
status | ScholarshipStatus | Lifecycle state |
Scholarship statuses
Section titled “Scholarship statuses”| Status | Description |
|---|---|
draft | Being configured, not publicly visible |
accepting | Accepting applications through the public form |
reviewing | Applications closed, review in progress |
awarded | Awards have been granted |
closed | Program complete, no further activity |
Typical lifecycle
Section titled “Typical lifecycle”draft → accepting → reviewing → awarded → closedCustom form fields
Section titled “Custom form fields”The form_fields JSON column defines the application form schema. Each entry describes a field shown to applicants:
[ { "name": "gpa", "type": "number", "label": "Current GPA", "required": true }, { "name": "essay", "type": "textarea", "label": "Why do you deserve this scholarship?", "required": true }, { "name": "transcript", "type": "file", "label": "Upload your transcript", "required": false }]Applicant responses are stored on the ScholarshipApplication model in the responses JSON column, keyed by field name.
Public application forms
Section titled “Public application forms”When a scholarship is in accepting status, it has a public form accessible at:
/scholarships/{foundationSlug}/{scholarshipSlug}These are Blade-rendered pages (not SPA routes) for SEO and accessibility. The form collects the applicant’s name, email, and responses to the custom form_fields.
Applications can also be submitted via the API:
- Public API (no auth):
POST /api/scholarships/applications - Donor portal (authenticated):
POST /api/donor/applications
Linking to donation pages
Section titled “Linking to donation pages”Scholarships can be linked to donation pages of type scholarship. When creating a scholarship donation page, set type_config.scholarship_id to connect donations to a specific scholarship fund.
Plan limits
Section titled “Plan limits”| Plan | Max scholarships |
|---|---|
| Starter | 1 |
| Growth | 3 |
| Pro | Unlimited |
Relationships
Section titled “Relationships”| Relationship | Type | Target |
|---|---|---|
foundation() | BelongsTo | Foundation |
applications() | HasMany | ScholarshipApplication |
disbursements() | HasMany | Disbursement |
API endpoints
Section titled “API endpoints”| Method | Path | Description |
|---|---|---|
| GET | /api/scholarships | List scholarships |
| POST | /api/scholarships | Create a scholarship |
| GET | /api/scholarships/{id} | Show a scholarship |
| PUT | /api/scholarships/{id} | Update a scholarship |
| DELETE | /api/scholarships/{id} | Delete a scholarship |
| GET | /api/scholarships/{id}/applications | List applications for a scholarship |