# 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