Application Workflow
Applications can be submitted through the public form, the donor portal API, or the public API endpoint. Each application captures the applicant’s responses, optional attachments, and tracks progress through review stages.
ScholarshipApplication model
Section titled “ScholarshipApplication model”| Field | Type | Description |
|---|---|---|
id | UUID | Primary key |
foundation_id | UUID | Owning foundation |
scholarship_id | UUID | The scholarship being applied to |
contact_id | UUID | The applicant (auto-created if new) |
responses | JSON? | Answers to the scholarship’s form_fields |
attachments | JSON? | File paths or URLs for uploaded documents |
stage | ApplicationStage | Review pipeline position |
reviewer_notes | string? | Internal notes from reviewers |
source | ApplicationSource | How the application was submitted |
submitted_at | datetime? | When the application was submitted |
Application stages
Section titled “Application stages”The ApplicationStage enum defines the review pipeline:
| Stage | Value | Description |
|---|---|---|
| New | new | Just submitted, not yet reviewed |
| Under Review | under_review | Being evaluated by the foundation |
| Accepted | accepted | Approved for an award |
| Declined | declined | Not selected |
Stage transitions
Section titled “Stage transitions”new → under_review → accepted → declinedStage updates are performed via PATCH /api/applications/{id}/stage and trigger:
- The application’s
stagefield is updated - An activity is logged on the contact’s timeline
- A status notification email is sent to the applicant
Application sources
Section titled “Application sources”The ApplicationSource enum tracks how each application was submitted:
| Source | Value | Description |
|---|---|---|
| Form | form | Public Blade-rendered form at /scholarships/{foundationSlug}/{scholarshipSlug} |
| API | api | Submitted via REST API |
| Webhook | webhook | Received from an external system |
Submission flow
Section titled “Submission flow”The ScholarshipService::createApplication() method handles the full intake:
public function createApplication( Scholarship $scholarship, array $data, // {email, first_name?, last_name?, responses?, attachments?} ApplicationSource $source,): ScholarshipApplication;What happens during submission
Section titled “What happens during submission”- Contact resolution — Finds or creates a contact by email within the foundation
- Relationship assignment — Adds the
applicantrelationship type to the contact - Application creation — Creates the
ScholarshipApplicationrecord with stagenew - Activity logging — Records
ActivityType::ApplicationSubmittedon the contact’s timeline - Confirmation email — Sends “Application Received” email to the applicant via
EmailService
Public submission endpoints
Section titled “Public submission endpoints”Blade form (browser)
Section titled “Blade form (browser)”GET /scholarships/{foundationSlug}/{scholarshipSlug} # Show formPOST /scholarships/{foundationSlug}/{scholarshipSlug} # Submit formGET /scholarships/{foundationSlug}/{scholarshipSlug}/confirmation # Thank you pageAPI (no auth required)
Section titled “API (no auth required)”POST /api/scholarships/applicationsContent-Type: application/json
{ "scholarship_id": "uuid-here", "email": "[email protected]", "first_name": "Jane", "last_name": "Doe", "responses": { "gpa": "3.8", "essay": "I believe in..." }}Donor portal (authenticated)
Section titled “Donor portal (authenticated)”POST /api/donor/applicationsManaging applications
Section titled “Managing applications”List applications for a scholarship
Section titled “List applications for a scholarship”GET /api/scholarships/{scholarshipId}/applicationsView a single application
Section titled “View a single application”GET /api/applications/{applicationId}Update stage
Section titled “Update stage”PATCH /api/applications/{applicationId}/stageContent-Type: application/json
{ "stage": "under_review", "notes": "Strong essay, reviewing transcripts"}Delete an application
Section titled “Delete an application”DELETE /api/applications/{applicationId}Relationships
Section titled “Relationships”| Relationship | Type | Target |
|---|---|---|
foundation() | BelongsTo | Foundation |
scholarship() | BelongsTo | Scholarship |
contact() | BelongsTo | Contact |