Feedback & Surveys template

Let trainees rate a session and its trainer

Import a Laravel training feedback form template for Filament, then route session ratings and recommendations to the right trainer.

Open this template in the demo builder 10 fields, 5 required. Free demo account, no card.

Updated

Import this Laravel training feedback form template when trainees need a short way to rate one completed session and its trainer. The imported template gives your application a consistent feedback flow for every cohort, while keeping each response attached to the session your team ran.

After a trainee submits it, FilaForms stores the response in your application's database and emits a submission event. Your Laravel code can use that event to send the course name, overall rating, and recommendation response to the person responsible for the training. That is a useful fit for an internal LMS or corporate learning tool built with a Laravel form builder for Filament.

The field table below covers the response data that the template renders. Its grouping keeps the trainee focused on the session experience before asking for an overall judgment. This matters when a poor rating needs follow-up. The training owner can see whether the response relates to the course, the trainer, or a mismatch between the session and its audience.

Fields in this template (10 fields, 5 required)

Field types used: Text, Date, Radio, Toggle Buttons, Textarea, Toggle. Every field is editable in the builder after import.

Session

Field Type Required Validation
Course Name course_name Text Yes required
Session Date session_date Date Yes required
Trainer trainer Text No none
Format format Radio, 3 options No none

Your Rating

Field Type Required Validation
Overall Rating overall_rating Radio, 4 options Yes required
Content Was Relevant relevance Radio, 4 options Yes required
Pace pace Toggle Buttons, 3 options Yes required
What Worked Well? worked_well Textarea No none
What Would You Change? improvements Textarea No none
I would recommend this training would_recommend Toggle No none

Route feedback and improve the next session

Laravel 12 discovers listeners in app/Listeners automatically. A listener gives your application one place to decide who receives a response. The example maps a template form to a training mailbox. Replace the mailbox values with addresses that belong to the people who own those sessions.

<?php

declare(strict_types=1);

namespace App\Listeners;

use FilaForms\Core\Events\FormSubmitted;
use Illuminate\Mail\Message;
use Illuminate\Support\Facades\Mail;

final class SendTrainingFeedback
{
    public function handle(FormSubmitted $event): void
    {
        $recipients = [
            1 => 'training-team@example.test',
        ];

        $recipient = $recipients[$event->form->getKey()] ?? 'training-team@example.test';
        $courseName = (string) ($event->submission->data['course_name'] ?? 'Training session');
        $overallRating = (string) ($event->submission->data['overall_rating'] ?? 'Not provided');
        $wouldRecommend = (string) ($event->submission->data['would_recommend'] ?? 'Not provided');

        Mail::raw(
            "Course: {$courseName}\nOverall rating: {$overallRating}\nWould recommend: {$wouldRecommend}",
            function (Message $message) use ($recipient, $courseName): void {
                $message->to($recipient)->subject("Training feedback: {$courseName}");
            },
        );
    }
}

Keep the recipient mapping close to the training ownership data in your application. A fixed mapping works for a small program with a few recurring sessions. A training catalog can instead resolve the owner before the form is shown, then send the owner a notification after submission. The event listener remains the boundary between collected feedback and the operational response.

Avoid treating one response as a verdict on a trainer. A single low rating can reveal a useful issue. It can also reflect a difficult cohort, a required course, or a session held at the wrong time. Route low ratings to the training owner first. They can inspect the session context before changing course material or deciding that a trainer needs support.

ATD Research, as cited by Devlin Peck in 2025, found that 71% of organizations use the Kirkpatrick model to evaluate training. Use the rating as one signal in that evaluation. Pair it with the learning objective for the session and the follow-up action your team can take. The submission dashboard gives staff a place to review individual responses, while the listener handles the immediate alert.

For a self-paced course, remove the trainer field because there is no live instructor to assess. Add a self_paced_module code so every response identifies the module that a learner completed. That variation keeps the same session-focused feedback pattern. It also prevents reports from implying that an instructor caused an issue in material that learners completed independently.

Use the course name to distinguish repeated offerings of the same program. A course can have different outcomes when its audience, examples, timing, or trainer changes. If your application already has session records, connect the surrounding workflow to that record. You can then use your own reporting queries to compare feedback across dates or cohorts without changing the imported form for each session.

This template is not a training analytics system. It captures feedback for one session. It does not calculate a trainer's average score across sessions or track completion rates over time. Build those measures from your training records and stored submissions when your program needs longitudinal reporting.

The form suits teams that need feedback to stay inside the application they operate. It also works well when the next step is a Laravel notification, a support task, or an internal review. Review the FilaForms feature set when you need the surrounding submission dashboard, visual builder, and notification workflow in the same Filament panel.

Use this template in your own application

With FilaForms installed, one call creates the form with every field, rule, and setting listed above. Then edit it in the builder.

use FilaForms\Core\Support\FormTemplates;

$form = FormTemplates::createFormFromTemplate('training-feedback');
Template schema (JSON)
{
    "name": "Training Feedback Form",
    "description": "Rate a training session and its trainer",
    "icon": "heroicon-o-academic-cap",
    "category": "Feedback & Surveys",
    "popularity": "Medium",
    "sections": [
        {
            "name": "Session",
            "fields": [
                {
                    "label": "Course Name",
                    "type": "text",
                    "code": "course_name",
                    "required": true,
                    "width": "50"
                },
                {
                    "label": "Session Date",
                    "type": "date",
                    "code": "session_date",
                    "required": true,
                    "width": "50"
                },
                {
                    "label": "Trainer",
                    "type": "text",
                    "code": "trainer",
                    "required": false,
                    "width": "50"
                },
                {
                    "label": "Format",
                    "type": "radio",
                    "code": "format",
                    "required": false,
                    "options": [
                        {
                            "value": "In person"
                        },
                        {
                            "value": "Virtual"
                        },
                        {
                            "value": "Self paced"
                        }
                    ],
                    "width": "50"
                }
            ]
        },
        {
            "name": "Your Rating",
            "fields": [
                {
                    "label": "Overall Rating",
                    "type": "radio",
                    "code": "overall_rating",
                    "required": true,
                    "options": [
                        {
                            "value": "Excellent"
                        },
                        {
                            "value": "Good"
                        },
                        {
                            "value": "Average"
                        },
                        {
                            "value": "Poor"
                        }
                    ],
                    "width": "50"
                },
                {
                    "label": "Content Was Relevant",
                    "type": "radio",
                    "code": "relevance",
                    "required": true,
                    "options": [
                        {
                            "value": "Strongly agree"
                        },
                        {
                            "value": "Agree"
                        },
                        {
                            "value": "Neutral"
                        },
                        {
                            "value": "Disagree"
                        }
                    ],
                    "width": "50"
                },
                {
                    "label": "Pace",
                    "type": "toggle-buttons",
                    "code": "pace",
                    "required": true,
                    "options": [
                        {
                            "value": "Too slow"
                        },
                        {
                            "value": "Just right"
                        },
                        {
                            "value": "Too fast"
                        }
                    ],
                    "width": "100"
                },
                {
                    "label": "What Worked Well?",
                    "type": "textarea",
                    "code": "worked_well",
                    "required": false,
                    "width": "100"
                },
                {
                    "label": "What Would You Change?",
                    "type": "textarea",
                    "code": "improvements",
                    "required": false,
                    "width": "100"
                },
                {
                    "label": "I would recommend this training",
                    "type": "toggle",
                    "code": "would_recommend",
                    "required": false,
                    "default": true,
                    "width": "100"
                }
            ]
        }
    ]
}

Frequently asked questions

Can this template notify the trainer after feedback is submitted?
Yes. A Laravel listener can read the submitted ratings and route each form's feedback to its trainer or training owner.
How should I adapt the form for self-paced training?
Remove the trainer field and add a self_paced_module code, so each response identifies the asynchronous module being reviewed.
Does this template calculate trainer averages or completion rates?
No. The template captures feedback for one session. It does not calculate trainer averages across sessions or track completion rates over time.
What should happen when a rating signals a problem?
Route low ratings to the training owner, then review the session context before changing course material or trainer support.

More templates