Skip to main content

How to build a professional development funding approval workflow for schools and associations in Formaloo

Build a three-stage PD funding approval workflow in Formaloo: teachers apply with proof attached, school admins sign off with a locked-down role, and associations approve funding and auto-trigger a required post-workshop follow-up form.

What you'll build

By the end of this guide, you'll have a two-form workflow that takes a teacher's professional development funding request from application to payout. Teachers submit a request with proof of the workshop attached, a school admin adds a signature and nothing else, and the association sets the final funding amount and approves or declines. Approval automatically emails the teacher a link to a required post-workshop follow-up form, so the funding record only closes once the teacher reports back on what they learned. Every stage updates a single status field, so the whole chain shows up as one pipeline in your portal.


When to use this

  • Your PD funding workflow runs through email threads and spreadsheets, and requests get lost between the school and the district or association office

  • You need a school-level reviewer who can sign off on a request without being able to edit or override any of the teacher's or association's fields

  • You want funding approval to come with a built-in accountability step, so teachers who get funded actually report back on what they learned

  • You're tracking funding by budget source (PD budget, Title I, grant funds) and need a clean way to report on it

  • You've outgrown a simple two-approver chain and need three distinct roles with three different permission levels on the same record


Part 1 — Build the PD funding request form

This is the form teachers use to apply. It collects the basics about the teacher and the workshop, requires proof of registration before it can be submitted, and carries a long list of admin-only fields that drive the rest of the workflow: the sign-off signature, the association's decision, payment tracking, and the status field that ties everything together. The fastest way to build all of this at once is Magic Create.

1. Open Magic Create: From your Formaloo homepage, click Magic Create. You can upload a picture or PDF of an existing request form, or describe the form in text.

2. Paste the form description: Use a prompt like this one, which covers every public and admin-only field this workflow needs:

Build a professional development funding request form for teachers. Ask for: full name, school email address, school name, subject or grade level taught, workshop or conference name, workshop provider or organizer, workshop dates (date field), requested funding amount (number field), and a long text question asking why they want to attend and how it will benefit their teaching. Add a required file upload for proof of workshop registration or invoice. Add a required yes/no question confirming the information is accurate and the funding will only be used for this workshop. Add these admin-only fields: an auto-generated request reference number (short text), a signature field for the school admin's sign-off, a date field for the sign-off date, a yes/no flag for whether a sign-off reminder has been sent, a number field for the approved funding amount, a dropdown for the association's decision with options Approved, Declined, and Needs more info, an assignee field for the association reviewer, a date field for the review date, a long text field for the decline reason, a dropdown for funding source with options PD budget, Title I, Grant funds, and District discretionary, a dropdown for request priority with options Low, Medium, and High, a calculation field for days since submission, a dropdown for payment status with options Not paid, Processing, and Paid, a short text field for the payment reference, a date field for the payment date, a dropdown for request status with options Submitted, Pending school sign-off, Pending association review, Approved – funding confirmed, Declined, Follow-up pending, and Completed, and a long text field for internal notes.

3. Click Create: Formaloo builds the form for you. Your form should look like the tables below. Magic Create will have generated most of this. Verify each field and, most importantly, set the field ID exactly as shown, since the email and PDF templates in later steps reference these IDs directly.

Public-facing fields (teacher):

Field (question)

Field ID

Type

What's your full name?

teacher_name

Short text

What's your school email address?

teacher_email

Short text

What school do you teach at?

school_name

Short text

What subject or grade level do you teach?

subject_grade

Short text

What's the name of the workshop or conference?

workshop_name

Short text

Who is the workshop provider or organizer?

workshop_provider

Short text

When does the workshop take place?

workshop_dates

Date

How much funding are you requesting?

requested_amount

Number

Why do you want to attend, and how will it benefit your teaching?

request_reason

Long text

Upload proof of workshop registration or invoice

proof_of_workshop

File upload

Do you confirm this information is accurate and the funding will only be used for this workshop?

teacher_declaration

Yes/No

Admin-only fields:

Field (question)

Field ID

Type

Request reference number

request_id

Short text

School admin signature

school_admin_signature

Signature

School sign-off date

school_signoff_date

Date

School sign-off reminder sent

school_reminder_sent

Yes/No

Approved funding amount

approved_amount

Number

Association decision

association_decision

Dropdown: Approved / Declined / Needs more info

Association reviewer

association_reviewer

Assignee

Association review date

association_review_date

Date

Decline reason

decline_reason

Long text

Funding source

funding_source

Dropdown: PD budget / Title I / Grant funds / District discretionary

Request priority

request_priority

Dropdown: Low / Medium / High

Days since submission

days_pending

Calculation

Payment status

payment_status

Dropdown: Not paid / Processing / Paid

Payment method/reference

payment_reference

Short text

Payment date

payment_date

Date

Request status

request_status

Dropdown: Submitted / Pending school sign-off / Pending association review / Approved – funding confirmed / Declined / Follow-up pending / Completed

Internal notes

internal_notes

Long text

📖 Admin-only fields stay invisible to teachers by default. See what are admin-only fields and how they help.

4. Require the proof of workshop upload: Open the "Upload proof of workshop registration or invoice" field's settings and turn on Required. This blocks submission until the teacher attaches a file.

Note: Set "Request status" to default to Submitted, so every new request starts at the top of the pipeline.

5. Publish the form: Click Publish in the island bar at the top of the editor. This is separate from Save, which you'll use for logic, email templates, and PDF templates in the next parts.


Part 2 — Build the post-workshop follow-up form

This is the second form in the chain. Teachers only see it once their funding request is approved, and it's what closes the loop: what they learned, whether they completed the workshop, and proof of attendance. Build it the same way as Form 1, with a fresh Magic Create prompt.

1. Open Magic Create: From your Formaloo homepage, click Magic Create and describe the second form in text.

2. Paste the form description: Use a prompt like this one:

Build a post-workshop follow-up form for teachers who received PD funding. Ask for: full name, which funding request this is for (short text, pre-filled from a link), whether they completed the workshop (yes/no), a long text question asking for their key takeaways, a long text question asking how they'll apply what they learned in the classroom, a required file upload for a certificate of completion or attendance, and a yes/no question asking if they'd recommend the workshop to colleagues. Add a long text question asking why they weren't able to complete it, hidden by default and only shown if they answered no to completing the workshop. Add these admin-only fields: a short text field for the related request reference that matches the funding request, a dropdown for follow-up status with options Pending, Submitted, Reviewed, and Overdue, a date field for the follow-up due date, a yes/no flag for whether a reminder has been sent, an assignee field for who reviewed it, a date field for the review date, a dropdown for impact rating with options Low, Medium, and High, and a long text field for internal notes.

3. Click Create: Verify your fields and field IDs against the tables below.

Public-facing fields (teacher):

Field (question)

Field ID

Type

What's your full name?

teacher_name

Short text

Which funding request is this for?

request_reference

Short text

Did you complete the workshop?

workshop_completed

Yes/No

If no, why weren't you able to complete it?

non_completion_reason

Long text

What were your key takeaways?

key_takeaways

Long text

How will you apply what you learned in your classroom?

classroom_application

Long text

Upload your certificate of completion or attendance

completion_proof

File upload

Would you recommend this workshop to colleagues?

recommend_workshop

Yes/No

Admin-only fields:

Field (question)

Field ID

Type

Related request reference

request_id

Short text

Follow-up status

followup_status

Dropdown: Pending / Submitted / Reviewed / Overdue

Follow-up due date

followup_due_date

Date

Follow-up reminder sent

followup_reminder_sent

Yes/No

Reviewed by

followup_reviewer

Assignee

Review date

followup_review_date

Date

Impact rating

impact_rating

Dropdown: Low / Medium / High

Internal notes

followup_notes

Long text

4. Require the certificate upload: Open the "Upload your certificate of completion or attendance" field's settings and turn on Required.

5. Set the default follow-up status: Set "Follow-up status" to default to Pending, so newly created records start at the right stage.

6. Publish the form: Click Publish in the island bar.


Part 3 — Set up the approval chain logic on the funding request form

This is where the workflow actually moves. Advanced logic on Form 1 handles four things: gating submission on the teacher's declaration, showing the decline reason only when needed, moving the status field forward as the school and association act, and creating the linked follow-up record the moment funding is approved. Use Magic Logic to generate all of it from one plain-language description.

1. Require the declaration to equal Yes: Open your form and click Advanced logic in the form settings panel on the right side. Navigate to the Logic tab.

2. Open Magic Logic: In the top right corner of the Logic panel, click Magic Logic.

3. Describe the rules: Paste a prompt like this one, covering the declaration gate, visibility, status transitions, and the reminder guard:

Block submission unless "Do you confirm this information is accurate and the funding will only be used for this workshop?" is Yes. Hide "Decline reason" by default. When "Association decision" equals Declined, show "Decline reason"; otherwise keep it hidden. When "School admin signature" is filled in, set "Request status" to Pending association review and set "School sign-off date" to today. When "Association decision" equals Approved, set "Request status" to Approved – funding confirmed and set "Association review date" to today. When "Association decision" equals Declined, set "Request status" to Declined and set "Association review date" to today. When "Association decision" equals Needs more info, keep "Request status" unchanged. If "Request status" has stayed Pending school sign-off for more than 5 days and "School sign-off reminder sent" is not yet Yes, set "School sign-off reminder sent" to Yes.

4. Click Generate Rules: Formaloo's AI previews each rule. Approve the ones that match, redo any that don't, and cancel anything you don't need.

5. Add the email rules: For each approved rule that should send an email (approval, decline, needs more info, sign-off reminder), add a Send email action and select the matching template. You'll build these templates in Part 5, so it's fine to come back and wire them up after.

📖 See what is logic in Formaloo for a refresher on triggers and actions.

6. Chain the approval to the follow-up form: Add one more On submit (or On update) rule: when "Association decision" equals Approved, use Update record to create the linked submission on the post-workshop follow-up form. Pre-fill its "Related request reference" field with this record's "Request reference number," and set its "Follow-up due date" to 30 days from today. Then set this record's own "Request status" to Follow-up pending.

Note: This is the step that goes beyond a standard dual-approval chain. Approval doesn't just close the request, it opens a second, required record that the teacher has to complete before the funding cycle is truly done.

7. Save your logic: Click Save in the top right corner.


Part 4 — Set up the follow-up logic

Form 2's logic is lighter. It just needs to reveal the non-completion reason conditionally, move the follow-up status forward on submission, and catch overdue follow-ups.

1. Open Advanced logic: On the follow-up form, open the form settings panel on the right side and click Advanced logic, then the Logic tab.

2. Open Magic Logic and describe the rules: Paste a prompt like this one:

Hide "If no, why weren't you able to complete it?" by default. When "Did you complete the workshop?" equals No, show it; otherwise keep it hidden. When this form is submitted, set "Follow-up status" to Submitted. If "Follow-up due date" has passed and "Follow-up status" is still Pending, set "Follow-up status" to Overdue, unless "Follow-up reminder sent" is already Yes, then set "Follow-up reminder sent" to Yes.

3. Generate, review, and approve the rules, then add a Send email action to the overdue rule pointing at the follow-up reminder template you'll build in Part 5.

4. Add one more rule for the association side: when the follow-up form is submitted, send an email to the association reviewer. Set "Review date" to today whenever "Follow-up status" is manually changed to Reviewed.

5. Save your logic.


Part 5 — Create the email templates

This workflow runs on nine emails, one for nearly every status change in the pipeline. Each one is a custom email template built with an AI block and personalized with answer piping, so every email reads as if it was written for that specific teacher, school, and workshop.

1. Create your first template: Click your profile icon, go to Apps & integrations, then Email templates, and click + Add new template. Clear the body field, add an AI block, and paste a prompt describing the email you want. For the first one, use:

Write a short, warm confirmation email to a teacher who just submitted a professional development funding request. Confirm you've received their request for @workshop_name with a requested amount of @requested_amount, and that it now needs sign-off from their school admin before association review. Reassure them there's nothing more to do right now. Keep it to 3-4 sentences, friendly and reassuring in tone, no jargon. Include a status badge showing "Pending school sign-off" and a muted footer with the request reference @request_id.

2. Name the template, add the subject, and save: Give it a clear internal name, set the subject to "We've received your PD funding request for @workshop_name," and click Save.

3. Repeat for the remaining eight templates, using the subjects, triggers, and prompts below. Each one follows the same pattern: a plain-language AI prompt, a subject line with piped fields, and a trigger you'll wire up back in the logic rules from Parts 3 and 4.

#

Email

Subject

Trigger

Sent to

2

New request needs your sign-off

Sign-off needed: @teacher_name's PD funding request

Teacher submits the funding request

School admin

3

Sign-off reminder

Reminder: @teacher_name's PD funding request is still waiting on your signature

Status stays Pending school sign-off for 5+ days, no reminder sent yet

School admin

4

Ready for association review

@teacher_name's PD funding request is ready for your review

School admin's signature is added

Association reviewer

5

Funding approved, next step required

Your PD funding request has been approved

Association decision is set to Approved

@teacher_email

6

Funding request declined

Update on your PD funding request for @workshop_name

Association decision is set to Declined

@teacher_email

7

More information needed

A quick follow-up on your PD funding request

Association decision is set to Needs more info

@teacher_email

8

Follow-up form reminder

Reminder: your post-workshop follow-up is due

Follow-up due date passes, status still Pending

@teacher_email

9

Follow-up submitted for review

@teacher_name submitted their post-workshop follow-up

Teacher submits the follow-up form

Association reviewer

The approval email (#5) is the one that carries the workflow forward. Prompt it to explain that a post-workshop follow-up is required, and include a CTA button linking to the follow-up form with @request_id pre-filled, so the teacher lands on a record that's already connected to their funding request.


Part 6 — Create the PD funding approval record PDF template

The last piece is a PDF that turns each approved (or declined) request into a clean, signed record for your files, complete with the school admin's signature and the association's decision.

1. Open the PDF template editor: Click your profile icon, go to Apps & integrations, then PDF templates, and click + Add new template.

2. Switch to the HTML view and paste the template below. It pulls in every field from Form 1 using answer piping, including the teacher's signature block and the association's decision badge.

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>PD Funding Approval Record</title> <style>   @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital@1&display=swap');   * { box-sizing: border-box; margin: 0; padding: 0; }   body {     font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;     background: #ffffff;     color: #222222;   }   .page {     max-width: 760px;     margin: 0 auto;     padding: 60px 72px;   }   .header {     display: flex;     justify-content: space-between;     align-items: flex-start;     padding-bottom: 28px;     border-bottom: 2px solid #1a1a1a;     margin-bottom: 36px;   }   .header h1 {     font-size: 22px;     font-weight: 700;     letter-spacing: -0.3px;     color: #111111;   }   .header .meta {     text-align: right;     font-size: 12px;     color: #999999;     line-height: 1.6;   }   .header .meta strong {     color: #444444;     font-weight: 600;   }   .section {     margin-bottom: 32px;   }   .section-title {     font-size: 10px;     text-transform: uppercase;     letter-spacing: 1.4px;     color: #aaaaaa;     font-weight: 600;     margin-bottom: 14px;   }   .grid {     display: grid;     grid-template-columns: 1fr 1fr;     gap: 0 32px;   }   .field {     padding: 10px 0;     border-bottom: 1px solid #eeeeee;   }   .field.full {     grid-column: 1 / -1;   }   .field-label {     font-size: 11px;     color: #999999;     margin-bottom: 4px;   }   .field-value {     font-size: 14px;     color: #1a1a1a;     font-weight: 500;     line-height: 1.5;   }   .field-value.long {     font-weight: 400;     white-space: pre-wrap;   }   .badge {     display: inline-block;     padding: 4px 12px;     border-radius: 20px;     font-size: 11px;     font-weight: 600;     letter-spacing: 0.3px;   }   .badge.approved { background: #e6f4ea; color: #1e7b34; }   .badge.declined { background: #f5f0f0; color: #8a5252; }   .badge.pending { background: #f2f2f2; color: #666666; }   .signature-block {     margin-top: 8px;     padding: 20px 0 8px;   }   .signature-value {     font-family: 'Playfair Display', Georgia, serif;     font-style: italic;     font-size: 26px;     color: #1a1a1a;     border-bottom: 1px solid #cccccc;     padding-bottom: 10px;     margin-bottom: 6px;   }   .inset {     background: #f9f9f9;     border-left: 3px solid #cccccc;     padding: 16px 20px;     font-size: 13px;     line-height: 1.6;     color: #555555;     border-radius: 0 4px 4px 0;   }   .footer {     margin-top: 48px;     padding-top: 20px;     border-top: 1px solid #eeeeee;     display: flex;     justify-content: space-between;     font-size: 11px;     color: #aaaaaa;   } </style> </head> <body>   <div class="page">     <div class="header">       <h1>Professional development<br>funding approval record</h1>       <div class="meta">         Reference<br>         <strong>@request_id</strong><br><br>         Decision date<br>         <strong>@association_review_date</strong>       </div>     </div>     <div class="section">       <div class="section-title">Teacher &amp; workshop details</div>       <div class="grid">         <div class="field">           <div class="field-label">Teacher</div>           <div class="field-value">@teacher_name</div>         </div>         <div class="field">           <div class="field-label">School</div>           <div class="field-value">@school_name</div>         </div>         <div class="field">           <div class="field-label">Subject / grade level</div>           <div class="field-value">@subject_grade</div>         </div>         <div class="field">           <div class="field-label">Email</div>           <div class="field-value">@teacher_email</div>         </div>         <div class="field">           <div class="field-label">Workshop / conference</div>           <div class="field-value">@workshop_name</div>         </div>         <div class="field">           <div class="field-label">Provider</div>           <div class="field-value">@workshop_provider</div>         </div>         <div class="field">           <div class="field-label">Workshop dates</div>           <div class="field-value">@workshop_dates</div>         </div>         <div class="field">           <div class="field-label">Requested amount</div>           <div class="field-value">@requested_amount</div>         </div>       </div>     </div>     <div class="section">       <div class="section-title">Reason for attending</div>       <div class="grid">         <div class="field full">           <div class="field-value long">@request_reason</div>         </div>       </div>     </div>     <div class="section">       <div class="section-title">School sign-off</div>       <div class="grid">         <div class="field full signature-block">           <div class="field-label">Signature</div>           <div class="signature-value">@school_admin_signature</div>         </div>         <div class="field">           <div class="field-label">Sign-off date</div>           <div class="field-value">@school_signoff_date</div>         </div>       </div>     </div>     <div class="section">       <div class="section-title">Association decision</div>       <div class="grid">         <div class="field">           <div class="field-label">Decision</div>           <div class="field-value"><span class="badge approved">@association_decision</span></div>         </div>         <div class="field">           <div class="field-label">Approved amount</div>           <div class="field-value">@approved_amount</div>         </div>         <div class="field">           <div class="field-label">Reviewer</div>           <div class="field-value">@association_reviewer</div>         </div>         <div class="field">           <div class="field-label">Review date</div>           <div class="field-value">@association_review_date</div>         </div>         <div class="field full">           <div class="field-label">Decline reason (if applicable)</div>           <div class="field-value long">@decline_reason</div>         </div>       </div>     </div>     <div class="section">       <div class="section-title">Teacher declaration</div>       <div class="inset">         The teacher confirmed the information provided is accurate and that funding will be used solely for this workshop. Declaration on file: <strong>@teacher_declaration</strong>.       </div>     </div>     <div class="footer">       <span>Confidential &mdash; for internal association and school records only</span>       <span>[Association / District name]</span>     </div>   </div> </body> </html>

3. Name the template "PD funding approval record" and click Save.

4. Wire it up in logic: Back in Part 3's rules, add a Generate PDF action to the rule that fires when "Association decision" is set. The finished PDF lands on the response row and can be attached to the approval or decline email.


Part 7 — Turn the project into a role-based portal

The whole point of this workflow is that three roles see three different slices of the same data: teachers see only their own requests, school admins see only their own school's pending sign-offs and can edit nothing but a signature, and association reviewers see everything they're assigned plus reporting across every school.

1. Activate the portal: Open your project and click the gear icon in the top-right corner. Click Activate client portal, then Manage users to open the portal management view.

2. Run the setup wizard: Click Setup wizard. In Step 1, create a new user directory. In Step 2, configure login and sign-up settings for your portal. In Step 3, connect the user directory to both Form 1 and Form 2, so logged-in users see only their own records in each.

3. Add your three user roles: Open your user directory and click Edit profile fields. Scroll to the User roles field and add Teacher, School admin, and Association reviewer as options.

4. Restrict teachers to their own records: On the "My requests" page's data block, switch to Edit mode, click Options, and scroll to Manage access. Select the profile field, then toggle on Allow users to view only their data. Repeat for every teacher-facing table page. Keep editing off, since teachers should only track status, not change submitted answers.

5. Build the sign-only page for the school admin: Create a table page filtered to "School name = admin's school" and "Request status = Pending school sign-off," sorted oldest first. In the table view's field settings, show only the "School admin signature" column as editable and hide every other field from that view, so signing is the only action available.

6. Restrict the page to the School admin role: Switch to Edit mode, find the page in the portal navigation, click the three-dot menu next to the page name, and select Access. Set access to Specific user roles and choose School admin. Click Save.

Note: This is the piece that goes beyond a generic dual-approval workflow: the school admin's entire permission set on this record is "sign," nothing more.

7. Build the association reviewer's assigned queue: Create a table page filtered to "Association reviewer = logged-in user," so each reviewer only sees the requests assigned to them, alongside full-visibility pipeline pages (Kanban by status, pending review, approved and payment tracking, declined, and overdue follow-ups) for anyone with the Association reviewer role.

8. Publish and share the portal: Once your pages, filters, and access levels are set, publish the project and share the portal URL with your schools and association reviewers.

💡 Optional: set a custom domain on your portal so it carries your association's own URL instead of a Formaloo one. This is available on the Business plan or through the Brand removal add-on.


What you now have

You now have a funding request pipeline that runs itself between three roles without anyone chasing a status update by email. Teachers know exactly where their request sits, school admins have a permission set that can't accidentally change funding details, and the association can see funding by source, turnaround time, and every teacher's post-workshop follow-up in one portal. Approval doesn't end the record, it starts a required accountability step, so your association gets a paper trail of what every funded workshop actually delivered.


What's next

  • Report on funding by source and turnaround time. Once requests are flowing through the pipeline, build charts grouped by "Funding source" and averaged by "Days since submission" to see where PD money goes and where sign-off is slowing down. → How to sort and filter your submissions data

  • Chase overdue follow-ups in bulk. When several teachers miss their follow-up due date at once, send a single email campaign to everyone in that view instead of following up one by one. → How to send an email campaign and collect data with AI agents

  • Add more reviewer roles as your association grows. If you bring on a second or third association reviewer, extend the same role and assignee structure from Part 7 so each one only sees what's assigned to them. → How to create and assign user roles in your portal


Ready-to-use templates

Don't build this from scratch, we've already put similar workflows together for you.

  • Scholarship & grant application with scoring and approval — A multi-reviewer scoring workflow with automated approval and rejection emails. Use it as a starting point for the association's decision stage if you want to add scoring criteria to funding decisions.

  • Employee request workflow — Routes internal requests through approval stages with status tracking and notifications. The status-driven pipeline structure maps closely to how requests move from sign-off to association review here.

  • Patient intake & consent workflow for healthcare — A role-based portal with conditional logic, AI-powered emails, and a PDF consent document. Its admin Kanban pipeline is a close match for the association's funding pipeline in Part 7.

  • There's no ready-made template yet for a three-role, sign-only approval chain with a follow-up form triggered by approval.


Learn more how-tos

Did this answer your question?