Skip to main content

How to build an employee compensation change approval workflow with automatic calculations in Formaloo

Learn how to build a two-stage compensation change approval workflow in Formaloo, with formula variables that calculate rate changes and an auto-generated PDF change notice.

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

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.


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


Ready-to-use templates


Learn more how-tos

Did this answer your question?