Visma.net Payroll integration
Connect Huma to Visma.net Payroll to keep employee profiles, positions, absence and salary in sync
Table of contents
- Roles and access
- How data flows
- Before you start
- Set up the integration
- After the integration is active
- Supported fields
- Error log and troubleshooting
- FAQ
- Related articles
Roles and access
| Role in Huma | System role with full access to Organization |
| Role in Visma.net Payroll | «Integration administrator», and access to «Visma.net App Store» |
| Permissions for the Huma app in Visma | «Read employees» and «Write employees» |
| Extra for absence sync | «Calendar API» |
💡 Not sure which roles you need in Visma.net Payroll? Contact Visma support for guidance.
⚠️ If you change the permissions for the Huma app in Visma, it can take up to 1 hour before the changes are available in Huma.
How data flows
| Data | Huma → Visma | Visma → Huma | When |
|---|---|---|---|
| Profile fields | ✅ Automatic | ✅ Manual only | Huma changes are sent in real time. Visma changes are brought in when you click «Sync users». |
| New employees | ✅ Manual only | ✅ Manual only | During «Sync users» |
| Positions | ✅ Automatic | ❌ | When a position is created or changed in Huma |
| Absence | ✅ Automatic | ❌ | When absence is approved in Huma and has an end date |
| Salary | ✅ Automatic | ❌ | When salary is created, changed or deleted in Huma |
⚠️ Historical data is not transferred. Only positions, absence and salary created or changed after you turn on each setting are sent to Visma.net Payroll.
Before you start
- You have a System role with full access to Organization in Huma.
- You, or a colleague, can log in to Visma.net Payroll as an administrator with access to «Visma.net App Store».
- Employees who exist in both systems have the same email address in Huma and Visma. Huma matches employees by email only.
- Salary is registered in NOK in Huma. Visma.net Payroll only accepts NOK.
- If you want to sync absence:
- Absence must be set up in Huma first (absence types or work schedules).
- The absence types (event codes) you want to use must exist in Visma.
- «Calendar API» must be enabled for the Huma app in Visma.
🔗 Getting started with Payroll & accounting integrations
Set up the integration
Step 1: Get the Tenant ID from Visma.net Payroll
- Log in to Visma.net Payroll as an administrator with access to «Visma.net App Store».
- Go to «Visma.net App Store», then find and open the «Huma HR» app.
- Under «Activate the service now», click «Set permissions».
- Enable «Read employees» and «Write employees».
- If you want to sync absence, also enable «Calendar API».
- Click «Integrate».
- Click your name in the top right corner and copy the «Tenant ID».


Step 2: Connect Huma to Visma.net Payroll
- In Huma, go to «Integrations» and select «Visma.net Payroll».
- Read the «Overview» and «Details» tabs.
- Click «Set up» in the top right corner.
- Give the connection a name.
- Choose who should be part of this connection: everyone, or a specific team, location or company.
- Click «Continue».
- Paste the «Tenant ID» from Visma.
- Confirm that you have the legal authority to accept the terms on behalf of your organization.
- Click «Continue».
🔗 Need more than one connection, for example one per company? See Multiple integrations.


Step 3: Choose what to sync
You can change all of these settings later.
| Setting | When it's on | When it's off |
|---|---|---|
| Positions: Create, update and delete | Position changes in Huma are sent to Visma. | Positions are not sent. |
| Salary: Create, update and delete in Visma.net Payroll when updated in Huma | Salary changes in Huma are sent to Visma. If a salary's start date doesn't match an existing salary in Visma, a new one is created. | Salary is not sent. |
| Absence: Create, update and delete in Visma.net Payroll when updated in Huma | Approved absence is sent to the calendar in Visma. | Absence is not sent. |
💡 Entering historical positions? Turn position sync off while you enter them. Historical positions aren't meant for the payroll system and can cause errors in the payroll timeline. Turn it on before you create positions that start today or in the future.
💡 If you turn on absence sync after the integration is set up, click «Reconnect» on the integration page afterwards.

Step 4: Map absence types
You only do this step if absence sync is on.
- Go through each absence type in Huma.
- Select the matching absence type (event code) in Visma.
- Leave any type you don't want to send unmapped.
- Click «Save».
💡 You can change the mapping later. Click ··· on the integration page and select «Map absence types».

Step 5: Sync users to activate the integration
After setup, the integration page says «This integration has been set up, but is not active». Nothing is sent until you complete this step.
- Click «Sync users».
- Matching users are employees with the same email in both systems.
- Click «View users» to see fields with different or missing values.
- For each case, choose to update Huma with the value from Visma, update Visma with the value from Huma, or leave it.
- Click «Next».
- Non-matching users are employees that exist in only one system.
- Choose whether to create all of them, only the ones you select, or none.
- Choose the direction: Visma → Huma, or Huma → Visma.
- Click «Sync users».
The status changes to «Connected and active». You'll get an email with the result.
💡 Note
Before you sync, decide which system has the most up-to-date information. Your choices here overwrite data.
⚠️ Users missing required fields are not synced until the missing values are added.
⚠️ Only employees with a start date in Visma of today or earlier are created in Huma. Employees with a future start date are shown during «Sync users», but are not created.


After the integration is active

What happens automatically
- Changes to supported profile fields in Huma are sent to Visma in real time.
- Positions, absence and salary are sent when they change in Huma, if those settings are on.
When you need to sync manually
Click «Sync users» when:
- You have changed a supported field in Visma and want it in Huma.
- You have added employees in Visma that should be created in Huma.
- You have added employees in Huma that should be created in Visma. New employees are never created in Visma automatically.
New employees created from Huma
Employees created in Visma from Huma get the status «Draft». A Visma user must open the employee, click «Edit draft» and fill in the fields Visma requires before the employee becomes active. If you're unsure which fields this applies to, contact Visma support.

When an employee leaves
Deactivated in Huma:
- The employee is not deactivated in Visma.
- The employee is locked for updates from the integration.
Deleted in Huma:
- The employee is not deleted in Visma.
- The next «Sync users» suggests creating them in Huma again.
- The employee can't be synced if they were changed in Visma after they were deleted in Huma.
💡 To end the employment in Visma, set the contract end date and end reason on the position in Huma. See Supported fields.
Change settings or the Tenant ID
- Go to the Visma.net Payroll integration in Huma.
- Click ··· in the top right corner.
- Select an option:
- «Edit connection settings» to change sync settings or the Tenant ID.
- «Edit connection details» to change the name or who is part of the connection.
- «Map absence types» to change the absence mapping.
⚠️ After you turn absence sync on or off, click «Reconnect» on the integration page.
⚠️ If you change the permissions for the Huma app in Visma, wait up to 1 hour before you change the integration settings in Huma.
Disconnect or remove
- Disconnect: Stops syncing but keeps your configuration.
- Remove: Stops syncing and deletes all stored configuration.
Supported fields
Profile fields
Changes in Huma are sent automatically. Changes in Visma are brought in with «Sync users».
| Huma field | Field in Visma.net Payroll | Required | Notes |
|---|---|---|---|
| Email address | Company email | ✅ | Used to match employees. Must be unique in Huma. Huma uses the company email in Visma, or the first email if there is no company email. If only a private email exists in Visma, updating the email in Huma adds a work email in Visma. API name: emails[].address |
| Employee ID | Employee number | ✅ | Must be unique in Huma. Maximum 12 characters. Only updated in Visma for employees in draft mode. API name: number |
| First name | First name | From Huma: the current name in Visma gets an end date, and the new name is added from today. From Visma: the current name is used. API name: personNames[].firstName |
|
| Last name | Last name | Same as first name. API name: personNames[].lastName |
|
| Phone number | Company phone | Must be unique in Huma. API name: phones[].number |
|
| Address | Address (Street, Postcode, City, Country) | The second address line in Huma is not sent. API names: address.streetName, address.zipCode, address.cityName, address.countryCode |
|
| Bank account | Salary payment method | Norwegian account numbers are sent as a local bank account. International accounts are sent as IBAN + BIC. National account numbers from other countries are sent as «Cash». API name: salaryPaymentMethod |
|
| Identifications | National identity number / D-number | Only Norwegian national identity numbers and D-numbers. The date of birth must match the first six digits. The integration can't remove this value in Visma. API names: personIds[].personId.id, personIds[].personId.typeOfId, personIds[].personId.country |
Positions (Huma → Visma)
| Huma field | Field in Visma.net Payroll | Required | Notes |
|---|---|---|---|
| Contract start date | Start date | ✅ | Used to find the position in Visma. API name: positions[].activeStart |
| Contract end date | End date | Only sent with a supported end reason, and only if the date is today or later. API name: positions[].activeEnd |
|
| End reason | End reason | Never sent without an end date. API name: positions[].positionEndReason |
|
| Position percentage | Position percentage | API name: positions[].partTimeFactor |
|
| Contract type | Employment form | Only sent for positions of type «Ordinary» or «Maritime» in Visma. API name: positions[].employmentForm |
End reason
| End reason in Huma | Ends the position in Visma? |
|---|---|
| The employee has resigned | ✅ |
| The employer has terminated the employee | ✅ |
| The contract, engagement, or temporary position has expired | ✅ |
| Change of payroll system or accountant | ✅ |
| Internal transfer, Other, or not set | ❌ The employment continues in Visma. |
Contract type
| Contract type in Huma | Sent to Visma as |
|---|---|
| Permanent | Permanent (fast) |
| Temporary, Seasonal, Trainee, Job training program | Temporary (midlertidig) |
| Casual | Temporary employee on call (midlertidigAnsattSomTilkallingsvikar) |
| Consultant, Freelance, Third party, Other | Not sent |
Absence (Huma → Visma)
| Huma field | Field in Visma.net Payroll | Required | Notes |
|---|---|---|---|
| Absence type | Event code | ✅ | Set up in Step 4. API name: eventcode |
| Time period | From date / To date | ✅ | API names: startDate, endDate |
| Percentage | Percent | ✅ | The event code in Visma must allow grading. Visma doesn't allow graded vacation. API names: inputType, properties.percent |
| Note | Comment | Shown when the absence is approved in Visma. API name: comment |
Salary (Huma → Visma)
| Huma field | Field in Visma.net Payroll | Required | Notes |
|---|---|---|---|
| From date | From date | If no value is set, there is no start date in Visma. API name: salaryInformation.activeStart |
|
| To date | To date | If no value is set, there is no end date in Visma. API name: salaryInformation.activeEnd |
|
| Amount | Hourly salary / Monthly salary / Annual salary | ✅ | Must be in NOK. Hourly, monthly and annual amounts are sent as they are. Weekly amounts are converted to hourly salary using the weekly working hours in Visma. API names: salaryInformation.hourlySalary, salaryInformation.monthlySalary, salaryInformation.yearlySalary |
| Interval | Contract salary type | Hourly or weekly → Hourly. Monthly → Monthly. Annual → Yearly. API name: salaryInformation.contractSalaryType |
|
| Interval | Salary type | Hourly or weekly → Variable salary. Monthly or annual → Fixed salary. API name: salaryInformation.salaryType |
Error log and troubleshooting
Where to find the error log
- Go to the Visma.net Payroll integration in Huma.
- Open the «Error log» tab.
Errors are grouped by day. Each entry shows a message, the time, the employee it applies to and a level:
| Level | Meaning |
|---|---|
| 🔴 Error | Something was not sent to Visma. You need to act. |
| 🟡 Warning | Something needs your attention. |
| 🔵 Info | For your information. No action needed. |
Integration status
| Status on the integration page | What to do |
|---|---|
| This integration has been set up, but is not active | Click «Sync users» to activate it. |
| Connected and active | Everything is running. |
Common errors
| Error message (or part of it) | What it means | How to fix |
|---|---|---|
| Can not find unique or non-overlapping position in Visma… | Huma can't find exactly one position in Visma that covers the dates of the position in Huma. | Check the positions in Visma. Make sure one position covers the start and end date, then save the position in Huma again. |
| Position not synced to Visma: this change would leave a gap… | The change would leave a gap in the position percentage or contract type timeline. Visma doesn't allow gaps. | Make sure the history matches in Huma and Visma, then try again. |
| Position not synced to Visma: Huma and Visma have drifted… | Visma doesn't have the values Huma expected, often because someone changed the position directly in Visma. | Compare the position in Huma and Visma. Correct the difference, then try the change in Huma again. |
| …overlaps with existing part time factor / employment form… | The change overlaps with existing values in Visma. | Update Visma manually, or adjust the dates in Huma. |
| Can not sync position end to Visma: contract end date … is in the past | Only end dates that are today or later are sent. This protects historical payroll data. | Register the end of employment manually in Visma. |
| Position deletion is not propagated to Visma | The position was deleted in Huma only. | Close the position manually in Visma if needed. |
| Salary modification impossible because of an overlapping salary in Visma | Visma already has a different salary in the same period. | Correct the salaries in Visma, then save the salary in Huma again. |
| Salary in another currency than NOK | Visma.net Payroll only accepts NOK. The salary is not sent. | Register the salary in NOK in Huma, or manually in Visma. |
| More than one matching absence found… | Visma has more than one absence that matches the absence in Huma. | Remove the duplicate in Visma, then change the absence in Huma again. |
When Visma rejects absence
If Visma rejects an absence, Huma marks it as rejected, notifies the relevant people and logs the error. Common reasons:
- The employee has no active employment in Visma for the period, is inactive, or has a future start date.
- The event code doesn't allow grading, or has a limit on the number of occurrences that is exceeded.
- The absence conflicts with absence already registered in Visma.
- The employee card in Visma is missing information, such as salary, working hours, or a position percentage above 0 %.
- The absence types and balances are not assigned in the calendar in Visma.
FAQ
Why are changes I make in Visma not showing in Huma?
Changes only go automatically from Huma to Visma. To bring changes from Visma into Huma, click «Sync users».
How are positions matched between Huma and Visma?
Huma looks for the one position in Visma that covers the contract start date and end date. Within that position, Huma matches the position percentage and contract type by their previous dates and values. If nothing matches, the change is not sent, and the error is logged. This protects your payroll data in Visma.
What happens if I delete a position or a salary in Huma?
A deleted position is not sent to Visma. The position stays in Visma, and you must close it there if needed. A deleted salary is also deleted in Visma.
How is sick leave handled?
When sick leave is sent from Huma, the medical certificate option is enabled in Visma, with the same start date as in Huma. Self-certification does not enable the medical certificate option.
Why can't I send «Sick child» absence to Visma?
Visma requires a child to be registered on the absence. Huma doesn't send this, so you must fill in «Child» manually in Visma.
Is absence from Huma automatically approved in Visma?
It depends on the settings for each event code in Visma. Contact Visma support if you're unsure.
How is absence time calculated in Visma?
Visma calculates the time based on its own work schedule settings. Make sure the calendar settings in Huma and Visma match, so days off and public holidays are calculated correctly.
What happens during a salary revision in Huma?
Huma sends the changes for each employee. If a change would affect more than one employment in Visma for the same employee, the error is logged and nothing is updated in Visma for that employee.
Why do salary rows in Huma and Visma no longer match?
Visma merges consecutive salary rows with the same amount. If you create several identical salary rows in Huma in a row, the systems can get out of sync. For employees who are not in draft mode, Visma doesn't allow salary history to be deleted, only cleared.
Related articles
🔗 Getting started with Payroll & accounting integrations
🔗 How positions work in integrations
🔗 How absence works in integrations
🔗 How salary works in integrations