# BambooHR
Source: https://docs.tryrisotto.com/dashboard/settings/people/connect/bamboohr
Connect BambooHR as your HRIS to power employee self-service
Connect BambooHR as your HRIS so Risotto can answer employee questions and take actions like checking PTO balances, submitting time off requests, and updating home addresses. These actions are all controlled by the [People Actions](/dashboard/settings/people/actions) settings.
In the dashboard, BambooHR appears as a row under **Settings > People > Connect** with the description "Allows Risotto to manage HR operations like employee data and time off" and a **Connect** button on the right.
## How the Integration Works
Risotto connects to BambooHR through BambooHR's OAuth 2.0 authorization flow. Each Risotto org installs against a single BambooHR tenant identified by your **company subdomain** (the `acme` in `acme.bamboohr.com`). After install, Risotto stores access and refresh tokens scoped to that tenant and uses them to call the BambooHR REST API on your behalf.
When an employee asks Risotto something that needs HRIS data (i.e. "What's my PTO balance?"), Risotto resolves their BambooHR employee record by matching their work email, then calls only the BambooHR endpoints required to answer that request.
## Install from BambooHR
You must be a BambooHR admin to approve the install.
In the dashboard, go to **Settings > People > Connect** and click **Connect** next to BambooHR. Enter your BambooHR company subdomain (`acme` portion of `acme.bamboohr.com`) and click **Continue**.
You'll be redirected to your BambooHR tenant (`acme.bamboohr.com`) to sign in
and approve the requested OAuth scopes for the Risotto app. BambooHR redirects
you back to the Risotto dashboard once the install is complete.
The BambooHR row in **People Connect** updates to show the integration is connected.
The subdomain accepts lowercase letters, numbers, and hyphens only. If you're
unsure of your subdomain, check the URL you use to sign in to BambooHR.
A BambooHR tenant can only be connected to one Risotto org at a time. If the
same subdomain is already connected to another Risotto org, the install fails
with "Please disconnect BambooHR from your other Risotto org." Disconnect from
the other org first, then retry the install.
## Requested OAuth Scopes
During install, Risotto requests the following BambooHR OAuth scopes:
| Scope | Purpose |
| - | - |
| `offline_access` | Issue refresh tokens so Risotto keeps access without re-prompting your admin |
| `openid`, `email` | Identify the BambooHR account that approved the install |
| `employee` | Read basic employee records |
| `employee:name` | Read first, last, display, and preferred name |
| `employee:contact` | Read work and home email |
| `employee:job` | Read job title, department, division, location, hire date, and supervisor |
| `employee:management` | Read manager / supervisor relationships |
| `sensitive_employee:address` | Read the employee's home address |
| `sensitive_employee:address.write` | Update the employee's home address |
| `time_off` | Read PTO policy types, balances, and existing time off requests |
| `time_off.write` | Submit time off requests on behalf of the requesting employee |
## Data Fields That Sync
Risotto reads only the fields it needs to fulfill an active request. Nothing is written back to BambooHR unless the matching People Action is enabled.
### Employee profile (read)
Pulled from `GET /api/v1/employees/{id}`:
| BambooHR field | Used for |
| - | - |
| `firstName`, `lastName` | Name resolution and personalization |
| `displayName` | Preferred display name in Risotto responses |
| `preferredName` | Fallback display name when `displayName` is empty |
| `workEmail` | Primary identifier matched against the requester's Slack email |
| `homeEmail` | Secondary identifier when `workEmail` is missing |
| `jobTitle` | Employee profile lookups |
| `department` | Employee profile lookups |
| `division` | Employee profile lookups |
| `location` | Work location lookups |
| `hireDate` | Start date lookups |
| `supervisor` | "Who's my manager?" style lookups |
| `supervisorEmail` | Routing requests that need manager approval |
| `employmentHistoryStatus` | Detecting whether the employee is currently active |
### Home address (read and write)
Pulled from `GET /api/v1/employees/{id}` when address access is needed, and written back via `POST /api/v1/employees/{id}` when **Update Home Address** is enabled:
| BambooHR field | Used for |
| - | - |
| `address1` | Street address line 1 |
| `address2` | Street address line 2 |
| `city` | City |
| `state` | State or province |
| `country` | Country |
| `zipcode` | Postal / ZIP code |
### Time off (read and write)
| BambooHR endpoint | Used for |
| - | - |
| `GET /api/v1/employees/{id}/time_off/calculator` | Current balance, units (hours or days), and policy type for each plan the employee is assigned to |
| `GET /api/v1/time_off/requests` (filtered by `employeeId`) | Recent and upcoming time off requests for the employee |
| `POST /api/v1/employees/{id}/time_off/request` | Submit a new time off request. Requests are created with status `requested` and routed for approval |
Discretionary and manual BambooHR policies don't track a running balance, so
Risotto surfaces those as "no tracked balance" rather than a literal `0`.
## Supported Actions
BambooHR supports the following [People Actions](/dashboard/settings/people/actions):
Look up the requesting employee's profile, title, department, work location,
manager, and start date. Turn it on in [Support agent >
Context](/dashboard/settings/support-agent/context).
View the home address on file for the requesting employee.
Update the home address on file for the requesting employee.
Retrieve balances for each policy type the employee is assigned to.
Submit a time off request for the requesting employee. Requests are created
with status `requested` and follow your BambooHR approval flow.
## Terminated Employees
Risotto checks the `employmentHistoryStatus` field on every BambooHR lookup. When the field indicates the employee is no longer active, [People Actions](/dashboard/settings/people/actions) stop running for that employee and requests are escalated, even if their Slack account is still active.
## Disconnecting
To disconnect Risotto from BambooHR, click **Connected** on the BambooHR row in **People Connect**, then click **Disconnect...** and confirm. Risotto revokes its stored access and refresh tokens. To fully remove the app from BambooHR, an admin should also revoke the Risotto authorization from **Account > API Keys & Installed Apps** inside BambooHR.
# HiBob
Source: https://docs.tryrisotto.com/dashboard/settings/people/connect/hibob
Connect HiBob as your HRIS to power employee self-service
Connect HiBob as your HRIS to power employee self-service. Once connected, Risotto can look up employee information, retrieve PTO balances, submit time off requests, and view home addresses on file — controlled by the [People Actions](/dashboard/settings/people/actions) settings.
## Install from the HiBob Marketplace
In the dashboard, HiBob appears as a row under **Settings → People → Connect** with the description "Allows Risotto to manage HR operations like addresses and time off requests" and an **Install** button on the right.
Risotto connects to HiBob through the HiBob Marketplace, it handles authentication and persists OAuth tokens automatically.
In the dashboard, go to **Settings → People → Connect** and click **Install** next to HiBob. You'll be redirected to the HiBob Marketplace.
Sign in to HiBob as an admin if prompted, then approve the requested
permissions for the Risotto app. HiBob redirects you back to the dashboard
once the install is complete.
The HiBob row in **People Connect** updates to show the integration is connected. A toast confirms `HiBob connected successfully`.
Only HiBob admins can install marketplace apps. If the **Install** button
redirects you to HiBob without an approval screen, ask an admin in your
workspace to complete the install.
A HiBob tenant can only be connected to one Risotto org at a time. If the same
HiBob tenant is already connected to another Risotto org the install fails
with "Please disconnect HiBob from your other Risotto org," disconnect from
the other org first, then retry the install.
## Requested Permissions
Risotto requests the following HiBob OAuth scopes during install:
| Scope | Purpose |
| - | - |
| `employee_data:read` | Look up employees and retrieve home addresses |
| `timeoff:read` | Read PTO policy types, balances, and existing time off entries |
| `timeoff:write` | Submit time off requests on behalf of the requesting employee |
## Supported Actions
HiBob supports the following [People Actions](/dashboard/settings/people/actions):
Look up the requesting employee's profile, title, department, work location,
and start date. Turn it on in [Support agent >
Context](/dashboard/settings/support-agent/context).
View the home address on file for the requesting employee.
Retrieve balances for each policy type the employee is assigned to.
Submit a time off request for the requesting employee in days mode.
**Update Home Address** is not supported for HiBob. The HiBob public API does
not expose address writes. Employee addresses can only be edited in the HiBob
UI by the employee or an HR admin.
## Terminated Employees
When HiBob marks an employee as having left the company, Risotto receives a webhook from HiBob and immediately stops [People Actions](/dashboard/settings/people/actions) from running for that employee. Requests from former employees are escalated, even if their Slack account is still active.
## Troubleshooting
HiBob does not always fail loudly. With valid credentials but missing grants, a people search comes back empty and a profile comes back with fields removed, while the connection still shows as connected. Risotto names the cause in the tool result and, for the sticky cases, sends one admin alert until the grant is fixed.
If the connection cannot see any employee at all, Risotto says so: "The HiBob connection is authenticated but cannot see any employees at all." In Bob, add the connection's service user to a permission group whose viewing scope covers employees.
If HiBob returns the employee but the name and other profile fields are missing, Risotto reports that HiBob withheld them. In Bob, grant the connection's permission group view access on the People's data categories (**Basic info** and **Work**).
HiBob accepted the credentials but refused the time off read (HTTP 403). In
Bob, grant the connection's permission group view access on the **Time Off**
category.
HiBob answered with HTTP 401. An org admin must reconnect HiBob under
**Settings > People > Connect**.
## Disconnecting
To disconnect Risotto from HiBob, click **Connected** on the HiBob row in **People Connect**, then click **Disconnect...** and confirm. You'll be redirected to the [HiBob Marketplace](https://app.hibob.com/marketplace/manage-apps) to remove the Risotto app from your workspace, which revokes the OAuth tokens.
# Rippling
Source: https://docs.tryrisotto.com/dashboard/settings/people/connect/rippling
Connect Rippling as your HRIS to power employee self-service
Connect Rippling as your HRIS so Risotto can answer employee HR questions directly in Slack instead of routing them to your People team. Once connected, an employee can ask for their PTO balance, submit a time off request, check their job details, or look up the home address on file.
In the dashboard, Rippling appears as a row under **Settings > People > Connect** with the description "Allows Risotto to manage HR operations like employee data and time off" and an **Install** button on the right.
## Why connect Rippling
"How much PTO do I have left?" and "can I take next Friday off?" are among
the most common requests People teams receive. Risotto answers them from
live Rippling data.
Risotto syncs your employee roster from Rippling, so it knows who works
there without you maintaining a separate user list.
When someone is terminated in Rippling, Risotto stops acting on their
requests.
Employees stay in Slack. They don't need to remember where Rippling lives or
how to navigate it.
## Prerequisites
Have these in place before you start:
* **A Rippling admin account.** Only Rippling admins can install App Shop apps.
* **A Risotto admin account.** Installing, syncing, and disconnecting all require permission to manage the org.
* **Account provisioning configured for Risotto in Rippling.** Rippling's provisioning rules determine which employees are in scope for Risotto. These rules populate the `PROVISIONING` group that Risotto's roster sync reads; without it, the sync has nothing to reconcile and reports a failure.
* **The Rippling company is not connected to another Risotto org.** One Rippling company maps to exactly one Risotto org.
## Install from the Rippling App Shop
Risotto connects to Rippling through the Rippling App Shop. The App Shop handles authentication and Risotto persists OAuth tokens automatically.
Find the Risotto app in the [Rippling App Shop](https://app.rippling.com/apps) and click **Install**, or start from the Risotto dashboard at **Settings → People → Connect** and click **Install** next to Rippling.
Sign in to Rippling as an admin if prompted, then approve the requested
permissions for the Risotto app. Rippling redirects you back to the Risotto
dashboard once approval is complete.
Back in the Risotto dashboard, sign in if prompted and you'll land on
**Settings → People → Connect**, where the install finishes automatically. The
Rippling row updates to show the integration is connected and begins its first
employee sync.
Installing the integration does not by itself let Risotto do anything. Go to **Settings → People → Actions** and enable each [People Action](/dashboard/settings/people/actions) you want available. To let the agent look up the employee record, turn on **Agent access** on the **People** tab of [Support agent > Context](/dashboard/settings/support-agent/context). Every action is off until you turn it on.
Only Rippling admins can install App Shop apps. If the **Install** button
redirects you to Rippling without an approval screen, ask an admin in your
workspace to complete the install.
A Rippling company can only be connected to one Risotto org at a time. If the
same Rippling company is already connected to another Risotto org, the install
fails with "Please disconnect Rippling from your other Risotto org."
Disconnect from the other org first, then retry the install.
## Requested Permissions
During install, Risotto requests access to the following Rippling data through the App Shop integration:
| Access | Purpose |
| - | - |
| Employee profile | Look up name, work email, job title, department, work location, and start date |
| Home address | Read the home address on file for the requesting employee |
| Leave balances | Read PTO policy types and balances for each plan the employee is assigned to |
| Leave requests | Read existing time off requests and submit new ones on the employee's behalf |
| Groups | Read the provisioning group that defines which employees are in scope |
Rippling negotiates the exact permission scopes through the App Shop
integration during approval. Risotto reads only the fields it needs to fulfill
an active request.
## Data Flows
The integration runs four distinct flows. Two keep your roster current in the background; two run only when an employee asks for something.
| Flow | Direction | Trigger |
| - | - | - |
| Employee roster sync | Rippling → Risotto | On install, daily, or on demand |
| Provisioning webhooks | Rippling → Risotto | Rippling sends the event (\~5 minute delay) |
| Employee data lookup | Rippling → Risotto | An employee asks; read live, nothing stored |
| Time off request | Risotto → Rippling | An employee asks and confirms |
### Employee roster sync
Risotto reads the `PROVISIONING` group from Rippling and reconciles its own roster against it. Employees in the group are added or updated; Rippling-sourced identities no longer in the group are marked inactive with an audit entry.
This flow runs at three moments:
* **Once on install**, so a new connection is populated immediately.
* **Once a day**, in an overnight sweep (around 08:20 UTC).
* **On demand**, when an admin clicks **Sync now**.
The sync is idempotent. Re-running it with no upstream change writes nothing. It's also locked per org, so overlapping triggers collapse into the single run already in flight rather than stacking up.
The sync deliberately skips deactivating employees when the picture from
Rippling looks incomplete such as an empty provisioning group, or a roster too large
to read in one pass. A misconfigured group won't silently deactivate your
whole company.
### Provisioning webhooks
Rippling notifies Risotto of employee lifecycle changes as they happen, so terminations don't wait for the overnight sync:
| Event | Effect in Risotto |
| - | - |
| `employee.created` | Adds the employee to the roster |
| `employee.updated` | Refreshes the stored details for a tracked employee |
| `employee.terminated` | Marks the employee inactive; People Actions stop |
| `employee.deleted` | Marks the employee inactive; People Actions stop |
| `company.deleted` | Removes the connection and tears down the roster |
Webhooks are configured on the Risotto app itself, and your Rippling provisioning rules control which employees generate events.
Rippling delivers webhooks with a delay of roughly five minutes.
### Employee data lookup
When an employee asks Risotto for their own HR data, Risotto calls Rippling live and reads only the fields that request needs.
To find the employee, Risotto matches their email against Rippling's `work_email`. The resolved Rippling worker ID is stored on the employee's Risotto identity so later requests skip the lookup.
### Time off request
The only flow that writes to Rippling. When an employee asks for time off, Risotto confirms the details with them first, then creates the request in Rippling with status `pending`, where it enters your normal approval flow. Risotto never approves anything.
### Trigger a sync manually
To force an immediate roster sync without waiting for the overnight run, go to **Settings → People → Connect**, open the menu on the Rippling row, and click **Sync now**.
The Rippling row reports the result inline:
| Status line | Meaning |
| - | - |
| `Employee sync in progress...` | A sync is running now |
| `Employees last synced