What you'll build
A compensation change request workflow where HR or a manager submits a salary, bonus, or title change, and two approvers sign off on it in sequence. The rate change amount and percent are calculated by formula variables, not a field formula, so the numbers stay accurate even if someone edits unrelated fields on the form later. Once both approvers sign off, Formaloo generates a PDF change notice automatically and emails it out.
When to use this
HR handles compensation changes over email and spreadsheets, and nobody has a clean record of who approved what and when.
A manager needs to approve a raise before it goes to finance, and finance needs to confirm the budget before payroll gets updated.
You migrated from a tool where calculated totals lived in a field formula, and editing an unrelated field later quietly broke the number.
You need an audit trail: who requested the change, who approved each stage, and a formal document to prove it.
Payroll updates get missed because there's no clear signal that a change was approved and is ready to process.
Part 1 — Build the compensation change request form
This is the form that captures the request. Every public field feeds either the rate-change calculation or the approval record, and the admin-only fields carry the two-stage decision, routing, and audit trail. The fastest way to build all of it at once is Magic Create.
1. Start a new project: From your Formaloo homepage, click + New > Form. This gives you one form pre-attached, ready to build on.
2. Open Magic Create: From your Formaloo homepage, click Magic Create, then describe your form in text instead of building it field by field.
3. Paste this prompt into Magic Create: "Build a compensation change request form. Public fields: requester's email address (email), employee's full name (short text), employee ID or number (short text), department (short text), employee's current job title (short text), type of compensation change as a dropdown with options salary increase, salary decrease, bonus adjustment, title and pay change, employee's new job title (short text, only shown if the change type is title and pay change), current annual salary (number), proposed new annual salary (number), reason for the change as a dropdown with options merit increase, promotion, market adjustment, retention, other, a short text field to specify the reason if other is selected, effective date (date), and additional context for approvers (long text). Also add these admin-only fields: status as a dropdown with options pending manager review, pending finance review, approved, declined; a Stage 1 approver assignee field; a Stage 2 approver assignee field; a Stage 1 decision single choice field with options approve and decline; a Stage 1 decision date field; a Stage 2 decision single choice field with options approve and decline, hidden until Stage 1 is approved; a Stage 2 decision date field; a salary band check dropdown with options within band, above band needs exception, below band; a budget source dropdown with options department budget, compensation adjustment pool, promotion budget, other; a decline reason long text field; a payroll system updated single choice field with options yes and no; and an internal notes long text field." Click Create.
4. Verify the fields Magic Create generated: Your form should look like this. Magic Create will have generated most of it. Verify each field and field ID matches the table below exactly, since the calculation and logic steps later depend on these IDs.
Field | Field ID | Type |
What's the requester's email address? | requester_email | |
What's the employee's full name? | employee_name | Short text |
What's the employee's ID or employee number? | employee_id | Short text |
What department does the employee work in? | department | Short text |
What's the employee's current job title? | current_job_title | Short text |
What type of compensation change is this? | change_type | Dropdown |
What's the employee's new job title? | new_job_title | Short text |
What's the employee's current annual salary? | current_salary | Number |
What's the proposed new annual salary? | proposed_salary | Number |
What's the reason for this compensation change? | change_reason | Dropdown |
Please specify the reason | reason_other | Short text |
When should this change take effect? | effective_date | Date |
Any additional context for the approvers? | additional_notes | Long text |
Status | status | Dropdown |
Stage 1 approver | stage1_approver | Assignee |
Stage 2 approver | stage2_approver | Assignee |
Stage 1 decision (manager review) | stage1_decision | Single choice |
Stage 1 decision date | stage1_decision_date | Date |
Stage 2 decision (finance review) | stage2_decision | Single choice |
Stage 2 decision date | stage2_decision_date | Date |
Salary band check | salary_band_check | Dropdown |
Budget source | budget_source | Dropdown |
Decline reason | decline_reason | Long text |
Payroll system updated | payroll_updated | Single choice |
Internal notes | internal_notes | Long text |
📖 For more on admin-only fields and why they matter here, see what are admin-only fields and how they help.
Part 2 — Add the rate-change formula variables
This is the part that makes the workflow niche. Instead of calculating the rate change with a live field formula tied directly to the salary fields, you'll use two formula variables. A variable's calculated value is tied to its own stable ID, so if you go back later and edit, rename, or reorganize unrelated fields on the form, the calculation doesn't quietly break. That's the exact problem teams run into when they migrate off tools that only support flat calculated fields.
1. Open the Variables panel: In your form editor, find the Variables section and click + Add.
2. Create the rate change amount variable: Select Formula, give it the ID rate_change_amount, title it "Rate change amount," and set the default formula to proposed_salary-current_salary.
3. Create the rate change percent variable: Click + Add again, select Formula, give it the ID rate_change_percent, title it "Rate change percent," and set the default formula to rate_change_amount/current_salary*100.
Note: Formaloo formulas don't support parentheses. Both formulas here are already flattened into two steps for that reason, which is also why the calculation lives in two separate variables instead of one.
Note: If this is a salary decrease, rate_change_amount and rate_change_percent will come out negative. That's expected and gets reflected as-is on the change notice.
Part 3 — Set up the two-stage approval logic
This is where the two-stage sequence gets enforced. The Stage 2 decision field stays dormant until the Stage 1 approver signs off, the status field updates automatically at every step, and a handful of fields only appear when they're actually relevant. Magic Logic can generate all of these rules from one prompt.
1. Open Advanced logic: In your form editor, open Advanced logic in the settings panel on the right side, then go to the Logic tab.
2. Open Magic Logic: Click Magic Logic in the top right corner of the Logic panel.
3. Paste this prompt: "If the type of compensation change is title and pay change, show the new job title field, otherwise keep it hidden. If the reason for the change is other, show the specify-the-reason field, otherwise keep it hidden. When the form is submitted, set status to pending manager review. If Stage 1 decision is approve, show the Stage 2 decision and Stage 2 decision date fields and set status to pending finance review, otherwise keep the Stage 2 fields hidden. If Stage 1 decision is decline, show the decline reason field and set status to declined. If Stage 2 decision is approve, set status to approved. If Stage 2 decision is decline, show the decline reason field and set status to declined." Click Generate Rules.
4. Review and approve the rules: Approve, redo, or cancel each rule the AI previews. Once you approve, Formaloo applies them for a final review pass.
5. Save your logic: Make any manual adjustments if needed, then click Save in the top right corner.
📖 For the full range of what logic can do here, see what is logic in Formaloo.
Part 4 — Create the workflow's email templates
You'll need five templates: a submission confirmation, a notification for each approval stage, and an outcome email for approval and decline. Build all five as custom email templates so you can reuse the AI body prompts and attach the PDF later.
1. Open the email template builder: Click your profile icon, go to Apps & integrations, find Custom email templates, and click + Add new template.
2. Build the submission confirmation: Name the template, set the subject to "Compensation change request submitted for @employee_name," clear the body, add an AI block, and enter: "Write a warm, professional confirmation email to an HR partner or manager who just submitted a compensation change request. Confirm the request was received, restate the employee's name and the type of change requested, and let them know it now moves to manager review. Keep it to 3-4 sentences." Save.
3. Build the Stage 1 approver notification: Set the subject to "Compensation change request awaiting your review for @employee_name," add an AI block, and enter: "Write a factual notification to a manager that a compensation change request needs their review. State the employee's name, department, current job title, current salary, proposed salary, the rate change amount and percent, the change reason, and the effective date. End with an instruction to open the record and submit a decision. Keep prose to 3 sentences and let a data table carry the detail." Save.
4. Build the Stage 2 approver notification: Set the subject to "Compensation change cleared manager review, needs finance sign-off for @employee_name," add an AI block, and enter: "Write a factual notification to a finance reviewer that a request passed manager review and needs financial approval. Include employee name, department, current salary, proposed salary, rate change amount, rate change percent, budget source, and the salary band check result. End with an instruction to review and record a decision." Save.
5. Build the approval outcome email: Set the subject to "Approved: compensation change for @employee_name," add an AI block, and enter: "Write a warm, clear confirmation that the compensation change has been fully approved. Summarize the current salary, new salary, rate change amount, rate change percent, and effective date. Mention that the official change notice is attached as a PDF. 4 sentences max." Save.
6. Build the decline outcome email: Set the subject to "Update on the compensation change request for @employee_name," add an AI block, and enter: "Write an empathetic, professional email explaining the compensation change request was not approved, referencing the decline reason. Stay neutral and factual, 3-4 sentences." Save.
📖 For more on building and formatting these templates, see how to create and send custom email templates.
Part 5 — Turn on notifications for every stage
With the templates built, wire each one to the moment it should fire. The submission confirmation and the first approver notification go out immediately on submit. Everything after that depends on a status or decision change, so those go through conditional logic.
1. Turn on the submission confirmation: From the right sidebar of the form editor, click Notify, turn on Send email to respondent, and select the submission confirmation template. This sends to the requester's email field.
2. Send the Stage 1 approver notification on submit: In Advanced logic, under On submit, add a Send email rule using the Stage 1 approver template, sent to the Stage 1 approver.
3. Send the Stage 2 approver notification conditionally: Under On update, add a rule: when status is changed to pending finance review, send email using the Stage 2 approver template, sent to the Stage 2 approver.
4. Send the approval outcome conditionally: Under On update, add a rule: when status is changed to approved, send email using the approval outcome template, sent to the requester.
5. Send the decline outcome conditionally: Under On update, add a rule: when status is changed to declined, send email using the decline outcome template, sent to the requester.
📖 For more on conditional triggers like these, see how to send and receive conditional email notifications.
Part 6 — Generate the compensation change notice PDF
Once both approvers sign off, the workflow should produce a formal record on its own instead of someone drafting a change letter by hand.
1. Open the PDF template builder: Click your profile icon, go to Apps & integrations, find Custom PDF templates, and click + Add new template.
2. Switch to HTML view: Toggle the editor to HTML and paste your compensation change notice code. It should reference employee details, the current and proposed salary, @rate_change_amount, @rate_change_percent, budget source, salary band check, and both approvers' names and decision dates.
3. Name and save the template.
4. Trigger the PDF on final approval: Back in Advanced logic, under On update, add a rule: when status is changed to approved, generate PDF using this template.
5. Attach the PDF to the approval email: Edit the approval outcome email's On update rule from Part 5 to attach the newly generated PDF.
Part 7 — Turn your project into a role-based approval portal
The last piece gives requesters, both approvers, and HR their own scoped view instead of everyone working off the same raw table.
1. Activate the portal: Open your project, click the gear icon in the top-right corner, and select Activate client portal.
2. Run the setup wizard: Click Manage users, then Setup wizard, and choose New user directory so requesters and approvers can log in and be scoped to their own records.
3. Configure portal settings: Set your login options, sign-up permissions, and branding.
4. Enable the user profile on your form: Link the user directory to the compensation change form so logged-in users can be matched to their own submissions.
5. Add your user roles: In the User Directory, open Edit profile fields, find User roles, and add Requester, Stage 1 approver, Stage 2 approver, and HR admin.
6. Build the Requesters group: Add a submission form page, a "My requests" table, and filtered tables for pending, approved, and declined requests.
7. Restrict the Requesters group to each person's own data: Switch to edit mode on each table's data block, click Options > Manage access, select the profile field, and turn on Allow users to view only their data.
8. Build the Manager review and Finance review groups: Add a "requests to review" table and a "reviewed by me" table for each role.
9. Restrict those groups to each approver's assigned records: Repeat the same Manage access steps, this time selecting the relevant assignee field and turning on Allow assignees to view only their data.
10. Build the HR admin and Reports groups: Add a Kanban board grouped by status, filtered tables for each pipeline stage and for payroll follow-up, and charts for average rate change by department and requests by status.
11. Restrict page access: For the HR admin and Reports pages, click the three-dot menu on each page, select Access, and restrict it to the HR admin role only.
12. Publish your portal.
Tip: You can set a custom domain on this portal instead of the default Formaloo URL, available on the Business plan or through the Brand removal add-on.
📖 For the full setup path, see how to create a portal and manage users' access and how to create and assign user roles in your portal.
What you now have
A compensation change request moves through manager and finance approval automatically, with the status field and portal views updating at every step. The rate change amount and percent are calculated by formula variables that stay accurate even as the rest of the form evolves. The moment finance signs off, a PDF change notice generates and lands in the requester's inbox, and HR has a payroll follow-up view so nothing approved ever sits unprocessed.
What's next
Reuse the same field IDs across every HR form Once
current_salary,proposed_salary, and the rest of these field IDs are set, you can pull them into any other email, PDF, or AI prompt in your workspace. → How to dynamically pull form data into custom emails, PDFs, and AI promptsBuild more logic manually as the workflow grows Magic Logic covers everything in this guide, but if you need to add a rule by hand later, like routing by department, this walks through the manual builder. → How to add advanced logic to your form
Add more filtered views as your team scales The portal pages here cover the core pipeline, but you can keep adding filtered tables for any edge case your HR team runs into. → How to sort and filter your submissions data
Ready-to-use templates
Employee request workflow — Handles internal request routing for HR and ops teams. Swap in the compensation fields and status stages from this guide to turn it into the same two-stage approval.
Scholarship & grant application with scoring and approval — Uses calculated scores and a multi-reviewer approval chain, the same pattern behind the rate-change calculation and Stage 1/Stage 2 sequence here.
Patient intake & consent workflow for healthcare — Built around conditional admin-only fields and a Kanban pipeline, which map directly onto the Stage 1/Stage 2 dormancy logic in this workflow.
Don't have a form yet? Create one in seconds with Magic Create — describe what you need and Formaloo builds the form for you.
Learn more how-tos
The generic version of this workflow If you don't need formula-variable calculations or a PDF change notice, the simpler version of this pattern works for any two-approver request. → How to build a dual-approval request workflow
Calculated scoring across multiple reviewers See the same variable-based calculation approach applied to reviewer scoring instead of salary figures. → Scholarship & grant application with scoring and approval workflow
Conditional admin fields and a pipeline view This workflow's Stage 1/Stage 2 dormancy logic and Kanban pipeline both trace back to the same pattern used here. → How to build a patient intake and consent workflow for healthcare clinics
