Skip to content

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.

FieldTypeDescription
idUUIDPrimary key
foundation_idUUIDOwning foundation
scholarship_idUUIDThe scholarship being applied to
contact_idUUIDThe applicant (auto-created if new)
responsesJSON?Answers to the scholarship’s form_fields
attachmentsJSON?File paths or URLs for uploaded documents
stageApplicationStageReview pipeline position
reviewer_notesstring?Internal notes from reviewers
sourceApplicationSourceHow the application was submitted
submitted_atdatetime?When the application was submitted

The ApplicationStage enum defines the review pipeline:

StageValueDescription
NewnewJust submitted, not yet reviewed
Under Reviewunder_reviewBeing evaluated by the foundation
AcceptedacceptedApproved for an award
DeclineddeclinedNot selected
new → under_review → accepted
→ declined

Stage updates are performed via PATCH /api/applications/{id}/stage and trigger:

  1. The application’s stage field is updated
  2. An activity is logged on the contact’s timeline
  3. A status notification email is sent to the applicant

The ApplicationSource enum tracks how each application was submitted:

SourceValueDescription
FormformPublic Blade-rendered form at /scholarships/{foundationSlug}/{scholarshipSlug}
APIapiSubmitted via REST API
WebhookwebhookReceived from an external system

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;
  1. Contact resolution — Finds or creates a contact by email within the foundation
  2. Relationship assignment — Adds the applicant relationship type to the contact
  3. Application creation — Creates the ScholarshipApplication record with stage new
  4. Activity logging — Records ActivityType::ApplicationSubmitted on the contact’s timeline
  5. Confirmation email — Sends “Application Received” email to the applicant via EmailService
GET /scholarships/{foundationSlug}/{scholarshipSlug} # Show form
POST /scholarships/{foundationSlug}/{scholarshipSlug} # Submit form
GET /scholarships/{foundationSlug}/{scholarshipSlug}/confirmation # Thank you page
POST /api/scholarships/applications
Content-Type: application/json
{
"scholarship_id": "uuid-here",
"email": "applicant@example.com",
"first_name": "Jane",
"last_name": "Doe",
"responses": {
"gpa": "3.8",
"essay": "I believe in..."
}
}
POST /api/donor/applications
GET /api/scholarships/{scholarshipId}/applications
GET /api/applications/{applicationId}
PATCH /api/applications/{applicationId}/stage
Content-Type: application/json
{
"stage": "under_review",
"notes": "Strong essay, reviewing transcripts"
}
DELETE /api/applications/{applicationId}
RelationshipTypeTarget
foundation()BelongsToFoundation
scholarship()BelongsToScholarship
contact()BelongsToContact