À la fin de ce guide, vous disposerez d’un système d’approbation des demandes des employés entièrement fonctionnel, avec un processus d’approbation en deux étapes, un portail d’administration et un portail destiné aux employés, où le personnel peut suivre le statut de ses demandes en temps réel. Le processus achemine chaque réponse successivement vers deux approbateurs, met automatiquement à jour le statut de la demande à chaque étape et rejette l’ensemble de la demande si l’un des approbateurs la refuse. Aucun code n’est nécessaire.
Quand l’utiliser
Votre équipe traite des demandes d’employés (informatique, RH, achats, déplacements) et les approbations sont actuellement suivies par e-mail ou dans des tableurs
Deux personnes distinctes doivent valider une demande avant qu’elle soit considérée comme approuvée
Les employés ne savent pas où en est leur demande
Les administrateurs perdent du temps à mettre à jour les statuts manuellement ou à relancer les approbateurs
Vous souhaitez étendre la même logique à trois étapes d’approbation ou plus à l’avenir
Ce dont vous aurez besoin
Un compte Formaloo (tous les forfaits)
Deux approbateurs disposant d’un compte Formaloo dans votre espace de travail
Environ 20 à 30 minutes pour tout créer de zéro (ou utilisez le modèle en bas de page pour démarrer en 2 minutes)
Étape 1 : créer le formulaire
📖 Guide écrit
Commençons par créer le formulaire. Pour cela :
Ouvrez votre tableau de bord Formaloo et cliquez sur New project.
Sélectionnez Form comme point de départ.
Dans l’éditeur de formulaire, cliquez sur l’icône Form Creation Agent (l’icône étincelle dans la barre d’outils).
Collez l’instruction ci-dessous dans le panneau du Form Creation Agent, puis cliquez sur Create.
Instruction
Create an employee request workflow approval form.
Step 1 — Employee intake fields (visible to all): Full Name (Short text, required), Email Address (Email, required), Division (Dropdown, required), Request Details (Long text, required)
Step 2 — Admin-only approval fields (hidden from employees, visible only to admins): Overall status: Request Status (Single choice, admin only) — options: Pending First Approval, Pending Second Approval, Successful Approval, Rejected
First approval section: First Approver Name (Assign field, admin only), First Approver Signature (Signature field, admin only), First Approver Decision (Single choice, admin only) — options: Approved, Not Approved
Second approval section: Second Approver Name (Assign field, admin only), Second Approver Signature (Signature field, admin only), Second Approver Decision (Single choice, admin only) — options: Approved, Not Approved
Admin notes: Rejection Reason (Long text, admin only — shown only if status is Rejected)
The Form Creation Agent builds all the fields, admin-only fields, pages, and field IDs for you automatically.
🎬 Guide vidéo
📖 Vous découvrez le Form Creation Agent ? Consultez Comment créer n’importe quel formulaire avec l’IA grâce au Form Creation Agent dans Formaloo
Étape 2 : créer la logique d’approbation
📖 Guide écrit
Relions maintenant la logique. Les trois champs de décision (First Approver Decision, Second Approver Decision et Request Status) doivent être connectés afin que l’action de chaque approbateur fasse automatiquement passer la demande à l’étape appropriée.
Pour cela :
Sur l’îlot du formulaire, cliquez sur l’icône Settings.
Dans la barre latérale droite, cliquez sur Advanced logic.
Passez à l’onglet On update.
Appliquez les quatre règles suivantes :
Règle 1 — Le premier approbateur approuve :
Condition : First Approver Decision is equal to Approved
Action : définir Request Status sur Pending Second Approval
Règle 2 — Le premier approbateur refuse :
Condition : First Approver Decision is equal to Not Approved
Action : définir Request Status sur Rejected
Règle 3 — Le second approbateur approuve :
Condition : Second Approver Decision is equal to Approved
Action : définir Request Status sur Successful Approval
Règle 4 — Le second approbateur refuse :
Condition : Second Approver Decision is equal to Not Approved
Action : définir Request Status sur Rejected
🎬 Guide vidéo
📖 Vous découvrez la logique ? Consultez Qu’est-ce que la logique dans Formaloo
Étape 3 : configurer les portails employés et administrateurs
📖 Guide écrit
Le portail employés offre à votre personnel un seul endroit pour soumettre des demandes et suivre leur statut, sans voir aucun champ réservé aux administrateurs.
Pour savoir comment créer et configurer un portail, consultez Comment créer un portail et gérer l’accès des utilisateurs.
Employés :
Une fois votre portail prêt, ajoutez les pages suivantes :
Page 1 — Soumettre une demande
Ajoutez une page Form et associez-la à votre formulaire d’approbation. C’est là que les employés saisissent leurs informations.
Page 2 — Mes enregistrements
Ajoutez une page Table associée au même formulaire. Pour que chaque employé ne voie que ses propres réponses :
Cliquez sur l’icône Settings du Data Block.
Cliquez sur Manage access.
Activez le Profile field en sélectionnant votre annuaire d’utilisateurs.
Vous pouvez ensuite choisir entre :
Allow users to view only their data : les utilisateurs connectés ne voient que leurs propres enregistrements. Ils ne voient pas les données des autres utilisateurs.
Allow users to edit their data : les utilisateurs connectés peuvent voir et modifier uniquement leurs propres enregistrements. Ils ne peuvent ni voir ni modifier les données des autres utilisateurs.
Page 3 — Statut d’approbation
Ajoutez une page Kanban associée au même formulaire. Définissez le champ Group by sur Request Status. Les employés voient désormais en un coup d’œil leurs demandes classées par étape.
Administrateurs :
Le portail d’administration permet à votre équipe de gérer l’ensemble du pipeline d’approbation. Créez un second portail pour votre équipe d’administration et ajoutez les pages suivantes :
Page 1 — Formulaire et enregistrements
Ajoutez une page Table associée à votre formulaire d’approbation. Les administrateurs y voient toutes les réponses, y compris tous les champs administrateur de la page 2.
Page 2 — Statut d’approbation
Ajoutez une page Kanban regroupée par Request Status. Toute l’équipe dispose ainsi d’une vue d’ensemble de l’état de chaque demande.
Page 3 — Premier approbateur
Ajoutez une page Kanban regroupée par Request Status. Pour que chaque approbateur ne voie que les demandes qui lui sont attribuées :
Cliquez sur l’icône Settings du Data Block.
Cliquez sur Manage access.
Faites défiler jusqu’à la section Assignee field (juste sous les paramètres du Profile field).
Sélectionnez First Approver Name comme champ Assignee.
Vous pouvez ensuite choisir entre :
Allow team members to view assigned entries : les membres de l’équipe peuvent voir les entrées qui leur sont attribuées, à eux ou à leur équipe.
Allow team members to edit assigned entries : les membres de l’équipe peuvent modifier et mettre à jour les entrées qui leur sont attribuées, à eux ou à leur équipe.
Page 4 — Second approbateur
Ajoutez une autre page Kanban regroupée par Request Status. Appliquez les mêmes étapes Manage access que ci-dessus, mais sélectionnez Second Approver Name comme champ Assignee.
🎬 Guide vidéo
Bonus : modèle PDF
Vous pouvez utiliser les modèles ci-dessous pour envoyer des notifications professionnelles et générer des documents d’approbation directement depuis votre processus.
Modèle PDF Utilisez ce code HTML pour créer un justificatif d’approbation mis en forme pour chaque demande, utile pour les audits, l’archivage ou l’envoi à l’employé lors de l’approbation finale.
Voir le code
Voir le code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Employee Status Change Form</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Source+Sans+3:wght@400;600;700&display=swap');
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Source Sans 3', Arial, sans-serif;
font-size: 11px;
color: #1a1a1a;
background: #fff;
}
.page {
width: 816px;
min-height: 1056px;
margin: 0 auto;
padding: 36px 48px 48px;
background: #fff;
}
/* ── HEADER ── */
.header {
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 2.5px solid #1a1a1a;
padding-bottom: 14px;
margin-bottom: 22px;
}
.logo-area {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.logo-text {
font-size: 20px;
font-weight: 700;
letter-spacing: -0.5px;
color: #1a1a1a;
line-height: 1;
}
.logo-text span {
color: #c0392b;
}
.logo-sub {
font-size: 8px;
letter-spacing: 3px;
text-transform: uppercase;
color: #888;
margin-top: 2px;
}
.form-title {
font-size: 17px;
font-weight: 700;
letter-spacing: 0.3px;
text-transform: uppercase;
color: #1a1a1a;
}
/* ── SECTION LABELS ── */
.section-header {
background: #1a1a1a;
color: #fff;
font-size: 9px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
padding: 5px 10px;
margin: 18px 0 10px;
}
.section-header.light {
background: #f0f0f0;
color: #1a1a1a;
}
/* ── FIELD GRID ── */
.field-row {
display: flex;
gap: 16px;
margin-bottom: 10px;
}
.field {
flex: 1;
display: flex;
flex-direction: column;
gap: 3px;
}
.field.w-half { flex: 0 0 calc(50% - 8px); }
.field.w-third { flex: 0 0 calc(33.333% - 11px); }
.field.w-quarter { flex: 0 0 calc(25% - 12px); }
.field.w-two-thirds { flex: 0 0 calc(66.666% - 8px); }
.field-label {
font-size: 8px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: #555;
}
.field-label .field-id {
font-weight: 400;
color: #aaa;
text-transform: none;
letter-spacing: 0;
font-size: 7.5px;
margin-left: 4px;
}
.field-value {
border-bottom: 1px solid #bbb;
min-height: 18px;
padding: 2px 0;
font-size: 11px;
color: #1a1a1a;
font-style: italic;
color: #888;
}
.field-value.tall {
min-height: 48px;
border: 1px solid #bbb;
padding: 4px 6px;
}
/* ── CHECKBOX ROW ── */
.checkbox-group {
display: flex;
flex-wrap: wrap;
gap: 6px 18px;
margin-bottom: 10px;
}
.checkbox-item {
display: flex;
align-items: center;
gap: 5px;
font-size: 10px;
}
.checkbox-box {
width: 11px;
height: 11px;
border: 1px solid #555;
display: inline-block;
flex-shrink: 0;
}
/* ── CHANGE(S) DIVIDER ── */
.changes-label {
text-align: center;
font-size: 10px;
font-weight: 700;
letter-spacing: 1.5px;
text-transform: uppercase;
color: #555;
margin: 14px 0 10px;
position: relative;
}
.changes-label::before,
.changes-label::after {
content: '';
position: absolute;
top: 50%;
width: 38%;
height: 0.5px;
background: #bbb;
}
.changes-label::before { left: 0; }
.changes-label::after { right: 0; }
/* ── ACKNOWLEDGEMENT ── */
.ack-section {
margin-top: 22px;
border-top: 1px solid #ccc;
padding-top: 14px;
}
.ack-title {
font-size: 10px;
font-weight: 700;
letter-spacing: 0.5px;
margin-bottom: 6px;
}
.ack-text {
font-size: 10px;
color: #555;
line-height: 1.6;
margin-bottom: 24px;
}
.sig-row {
display: flex;
gap: 48px;
margin-top: 8px;
}
.sig-block {
flex: 1;
}
.sig-line {
border-bottom: 1px solid #555;
min-height: 36px;
margin-bottom: 4px;
}
.sig-label {
font-size: 8px;
text-transform: uppercase;
letter-spacing: 1px;
color: #888;
}
/* ── APPROVAL SECTION ── */
.approval-section {
margin-top: 28px;
border-top: 2px solid #1a1a1a;
padding-top: 14px;
}
.approval-title {
font-size: 10px;
font-weight: 700;
letter-spacing: 1.5px;
text-transform: uppercase;
margin-bottom: 12px;
}
.approval-grid {
display: flex;
gap: 24px;
margin-bottom: 16px;
}
.approval-block {
flex: 1;
border: 1px solid #ccc;
padding: 12px 14px;
}
.approval-block-title {
font-size: 8px;
font-weight: 700;
letter-spacing: 1.5px;
text-transform: uppercase;
color: #888;
margin-bottom: 10px;
padding-bottom: 6px;
border-bottom: 0.5px solid #e0e0e0;
}
.status-badge {
display: inline-block;
padding: 3px 10px;
font-size: 8px;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
border: 1px solid #1a1a1a;
margin-top: 6px;
}
/* ── FORM STATUS ── */
.form-status-bar {
display: flex;
align-items: center;
justify-content: space-between;
background: #f7f7f7;
border: 1px solid #e0e0e0;
padding: 7px 12px;
margin-bottom: 18px;
}
.form-status-label {
font-size: 8px;
font-weight: 700;
letter-spacing: 1.5px;
text-transform: uppercase;
color: #888;
}
.form-status-value {
font-size: 10px;
font-weight: 700;
letter-spacing: 0.5px;
color: #1a1a1a;
font-style: italic;
color: #888;
}
.form-status-id {
font-size: 7.5px;
color: #aaa;
font-style: normal;
}
/* ── PRINT ── */
@media print {
body { background: #fff; }
.page { margin: 0; padding: 28px 40px 40px; width: 100%; }
}
</style>
</head>
<body>
<div class="page">
<!-- HEADER -->
<div class="header">
<div class="logo-area">
<div class="logo-text">inf<span>i</span>nity</div>
<div class="logo-sub">Labs</div>
</div>
<div class="form-title">Employee Status Change Form</div>
</div>
<!-- FORM STATUS BAR -->
<div class="form-status-bar">
<span class="form-status-label">Form Status</span>
<span class="form-status-value">
<span class="form-status-id"> · form_status</span>
</span>
</div>
<!-- SECTION: EMPLOYEE INFORMATION -->
<div class="section-header">Employee Information</div>
<div class="field-row">
<div class="field w-third">
<div class="field-label">Employee Name <span class="field-id">emp_name</span></div>
<div class="field-value"></div>
</div>
<div class="field w-third">
<div class="field-label">Date of Hire <span class="field-id">emp_hire_date</span></div>
<div class="field-value"></div>
</div>
<div class="field w-third">
<div class="field-label">Job Title <span class="field-id">emp_job_title</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-quarter">
<div class="field-label">Supervisor <span class="field-id">emp_supervisor</span></div>
<div class="field-value"></div>
</div>
<div class="field w-quarter">
<div class="field-label">Branch Lead <span class="field-id">emp_branch_lead</span></div>
<div class="field-value"></div>
</div>
<div class="field w-quarter">
<div class="field-label">Branch <span class="field-id">emp_branch</span></div>
<div class="field-value"></div>
</div>
<div class="field w-quarter">
<div class="field-label">Division <span class="field-id">emp_division</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">Division/Operations Lead <span class="field-id">emp_division_ops_lead</span></div>
<div class="field-value"></div>
</div>
</div>
<!-- SECTION: PAYROLL CHANGE -->
<div class="section-header">Payroll Change</div>
<div class="field-label" style="margin-bottom:6px;">Reason(s) for Adjustment <span class="field-id">pay_change_reasons</span></div>
<div class="checkbox-group">
<div class="checkbox-item"><span class="checkbox-box"></span> Promotion</div>
<div class="checkbox-item"><span class="checkbox-box"></span> Classification/Status</div>
<div class="checkbox-item"><span class="checkbox-box"></span> Supervisor</div>
<div class="checkbox-item"><span class="checkbox-box"></span> Division</div>
<div class="checkbox-item"><span class="checkbox-box"></span> Merit Increase</div>
<div class="checkbox-item"><span class="checkbox-box"></span> Branch</div>
<div class="checkbox-item"><span class="checkbox-box"></span> Title</div>
<div class="checkbox-item"><span class="checkbox-box"></span> Other</div>
</div>
<div class="field-row" style="margin-bottom:6px;">
<div class="field">
<div class="field-value" style="font-style:normal;font-size:9px;color:#aaa;">Selected: </div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">Effective Date <span class="field-id">pay_effective_date</span></div>
<div class="field-value"></div>
</div>
</div>
<!-- CHANGES -->
<div class="changes-label">Change(s)</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">New Classification <span class="field-id">pay_new_classification</span></div>
<div class="field-value"></div>
</div>
<div class="field w-half">
<div class="field-label">Current Classification <span class="field-id">pay_current_classification</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">New Status <span class="field-id">pay_new_status</span></div>
<div class="field-value"></div>
</div>
<div class="field w-half">
<div class="field-label">Current Status <span class="field-id">pay_current_status</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">New Job Title <span class="field-id">pay_new_job_title</span></div>
<div class="field-value"></div>
</div>
<div class="field w-half">
<div class="field-label">New Supervisor <span class="field-id">pay_new_supervisor</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">New Branch <span class="field-id">pay_new_branch</span></div>
<div class="field-value"></div>
</div>
<div class="field w-half">
<div class="field-label">New Division <span class="field-id">pay_new_division</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">New Division Lead <span class="field-id">pay_new_division_lead</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">New Pay Type <span class="field-id">pay_new_pay_type</span></div>
<div class="field-value"></div>
</div>
<div class="field w-half">
<div class="field-label">Current Pay Type <span class="field-id">pay_current_pay_type</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-quarter">
<div class="field-label">Current Salary <span class="field-id">pay_current_salary</span></div>
<div class="field-value"></div>
</div>
<div class="field w-quarter">
<div class="field-label">New Salary <span class="field-id">pay_new_salary</span></div>
<div class="field-value"></div>
</div>
<div class="field w-quarter">
<div class="field-label">New Pay Rate ($/hr) <span class="field-id">pay_new_rate_hourly</span></div>
<div class="field-value"></div>
</div>
<div class="field w-quarter">
<div class="field-label">Percent Change <span class="field-id">pay_percent_change</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field w-half">
<div class="field-label">Current PTO Accrual <span class="field-id">pay_current_pto_accrual</span></div>
<div class="field-value"></div>
</div>
<div class="field w-half">
<div class="field-label">New PTO Accrual <span class="field-id">pay_new_pto_accrual</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-row">
<div class="field">
<div class="field-label">Additional Comments or Remarks <span class="field-id">pay_comments</span></div>
<div class="field-value tall"></div>
</div>
</div>
<!-- ACKNOWLEDGEMENT -->
<div class="ack-section">
<div class="ack-title">Acknowledgement</div>
<div class="ack-text">In signing this document, I acknowledge that I have received the information outlined above.</div>
<div class="sig-row">
<div class="sig-block">
<div class="sig-line"></div>
<div class="sig-label">Employee Signature</div>
</div>
<div class="sig-block" style="flex: 0 0 200px;">
<div class="sig-line"></div>
<div class="sig-label">Date</div>
</div>
</div>
</div>
<!-- APPROVAL SECTION -->
<div class="approval-section">
<div class="approval-title">Approval</div>
<div class="approval-grid">
<!-- APPROVER 1 -->
<div class="approval-block">
<div class="approval-block-title">First Approver</div>
<div class="field-row" style="margin-bottom:8px;">
<div class="field">
<div class="field-label">Name <span class="field-id">approval_1_name</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-label" style="margin-bottom:4px;">Signature <span class="field-id">approval_1_signature</span></div>
<div class="sig-line" style="min-height:40px; margin-bottom:8px;"></div>
<div class="field-label" style="margin-bottom:4px;">Status <span class="field-id">approval_1_status</span></div>
<div class="status-badge"></div>
</div>
<!-- APPROVER 2 -->
<div class="approval-block">
<div class="approval-block-title">Second Approver</div>
<div class="field-row" style="margin-bottom:8px;">
<div class="field">
<div class="field-label">Name <span class="field-id">approval_2_name</span></div>
<div class="field-value"></div>
</div>
</div>
<div class="field-label" style="margin-bottom:4px;">Signature <span class="field-id">approval_2_signature</span></div>
<div class="sig-line" style="min-height:40px; margin-bottom:8px;"></div>
<div class="field-label" style="margin-bottom:4px;">Status <span class="field-id">approval_2_status</span></div>
<div class="status-badge"></div>
</div>
</div>
</div>
</div>
</body>
</html>
Ce que vous avez créé
Vous disposez désormais d’un processus complet de demande à double approbation avec deux portails distincts : l’un pour les employés, l’autre pour les administrateurs. Les nouvelles réponses entrent automatiquement dans la première étape d’approbation. Les décisions des approbateurs font avancer le statut ou rejettent la demande sans que personne ait à mettre à jour un champ manuellement. Chaque approbateur ne voit que ce qui lui est attribué. Les employés peuvent consulter leur statut en temps réel. Et chaque demande approuvée peut être exportée sous forme de PDF signé.
Le même schéma logique s’étend à trois étapes d’approbation ou plus : il suffit d’ajouter une section pour un troisième approbateur dans le formulaire et d’étendre les règles en conséquence.
Démarrer plus vite avec un modèle
Inutile de tout créer de zéro. Le modèle Employee request workflow form contient le formulaire, la logique et la structure, prêts à être personnalisés.
Prêt à le créer ?
💬 Obtenir l’aide de notre équipe concierge Notre équipe vous aidera à configurer cette solution pour votre cas d’usage.
📅 Réserver une démo pour une configuration Team/Enterprise Découvrez comment les équipes utilisent Formaloo à grande échelle avec des autorisations et des intégrations avancées.



