> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getprescience.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Payroll deductions

> Deduct each employee's share of the premium through payroll.

Employers choose, during Prescience setup, how much of each premium they cover: between 50% and 100% of the employee-only premium, and between 50% and 100% of the added premium for dependents. Employees pay the rest through payroll. If your platform runs payroll, you deduct that share.

Everything you need is on two endpoints you already call:

* **`GET /groups/{groupId}/members`**: each employee's coverage and `deduction`.
* **`GET /groups/{groupId}/account`**: the plan, including the per-tier premium split (`plan.tiers`) and the employer's chosen percentages (`plan.employerContribution`).

Both return `404 not_found` until the group is enrolled.

## One employee's deduction

From `GET /groups/{groupId}/members`, for an employee covering a spouse and a child under a plan where the employer covers 100% of employee-only premium and 90% of the added premium for dependents:

```json theme={null}
{
  "memberId": "mem_66ab029b5b1e",
  "externalId": "emp_0009",
  "email": "tom@northstarlabs.com",
  "status": "active",
  "coverage": {
    "status": "enrolled",
    "electionStatus": "active",
    "tier": "family",
    "coveredDependents": [
      {
        "relationship": "spouse"
      },
      {
        "relationship": "child"
      }
    ],
    "effectiveDate": "2026-09-01"
  },
  "deduction": {
    "medical": {
      "employeeMonthlyCents": 12240,
      "employerMonthlyCents": 171360,
      "totalMonthlyCents": 183600
    },
    "dentalVision": null,
    "perPaycheck": {
      "frequency": "biweekly",
      "paychecksPerYear": 26,
      "employeeCents": 5649,
      "employerCents": 79089
    },
    "preTax": true,
    "reason": null,
    "billing": {
      "monthlyRateCents": 183600,
      "source": "quote_rate_schedule",
      "schedule": "quoted"
    },
    "billingReason": null,
    "rateMismatch": false
  }
}
```

* `deduction.medical.employeeMonthlyCents` is the employee's monthly medical share. It comes from the employer's approved plan terms, the same amount the employee saw when enrolling.
* `deduction.dentalVision` is set when the employee has active dental or vision coverage with an employee contribution.
* `deduction.perPaycheck.employeeCents` is what to deduct from each paycheck: the monthly total (medical plus dental and vision) converted with the payroll calendar Prescience has on file: monthly × 12 ÷ 52 for `weekly`, × 12 ÷ 26 for `biweekly`, and divided by the pay days in a month for `days_of_month`. `perPaycheck` is `null` when no payroll calendar is on file; use the monthly amounts with your own calendar instead.
* `deduction.perPaycheck.employerCents` is the company's medical contribution per paycheck (`medical.employerMonthlyCents`, converted and rounded the same way). Post it as the employer contribution for the pay period, for example as `company_contribution_amount` on the employee's Check benefit. It is `0` for a waiver.
* `deduction.perPaycheck.paychecksPerYear` is the number of pay runs a year on that calendar (52, 26, or 12 × the pay days in a month). `employeeCents × paychecksPerYear ÷ 12` matches the monthly total to within rounding; see [Rounding](#rounding).
* `deduction.preTax` is `true` when the employer runs a Section 125 premium-only plan, so the deduction is pre-tax.
* `deduction.billing` is what the employer is billed each month for this household, from Prescience's verified rate schedule. It is there so both sides can reconcile; don't deduct from it. `deduction.rateMismatch` is `true` when it differs from `medical.totalMonthlyCents` by more than \$1. The deduction still applies, but tell Prescience. When there's no billed rate, `billing` is `null` and `billingReason` says why (`no_rate_schedule`, `billing_baseline_pending` or `household_not_billable`). Both are `null` for members who aren't enrolled.

## Rounding

Each per-paycheck amount is rounded once, to whole cents: `round(monthly ÷ paychecks per month)`, where paychecks per month is 52/12 for `weekly`, 26/12 for `biweekly`, or the pay days in a month for `days_of_month`. The same amount applies to every paycheck, so a year of paychecks can differ from 12 × the monthly amount by a few cents. For Tom above, 26 × $56.49 = $1,468.74 against 12 × $122.40 = $1,468.80, six cents short.

The monthly amounts (`medical`, `dentalVision`) are the source of truth. Pick one:

* **Accept the drift.** At most half a cent per paycheck, so under \$0.27 a year on a weekly calendar. Prescience does not reconcile employee deductions against the monthly amount.
* **True up on the last paycheck of the plan year.** Deduct `12 × monthly − employeeCents × (paychecksPerYear − 1)` on the final paycheck before `plan.coverageEnd`, and do the same for `employerCents` against `medical.employerMonthlyCents`.

## Coverage tiers

The plan prices three tiers. `coverage.tier` on `/members` and `plan.tiers[].tier` on `/account` use the same three values, set by how many dependents the employee covers:

| Covered dependents | `tier`              |
| ------------------ | ------------------- |
| 0                  | `employee_only`     |
| 1                  | `employee_plus_one` |
| 2 or more          | `family`            |

A spouse, domestic partner and child each count as one dependent. Quotes and the census count four household shapes (`employeeOnly`, `employeeSpouse`, `employeeChildren`, `family`); on the plan, "employee + spouse" and "employee + one child" are both `employee_plus_one`, and an employee with two or more children and no spouse is `family`. To find what an employee pays, match `coverage.tier` to the `plan.tiers` entry with the same `tier`, or read the employee's own `deduction` directly.

## When there's nothing to deduct, or no amount yet

`coverage.status` and `deduction.reason` tell you why.

| `coverage.status`                                  | Deduction                                                                                                           | `deduction.reason`                     |
| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| `enrolled`                                         | The employee's share.                                                                                               | `null`                                 |
| `waived`                                           | `0`: the employee waived medical coverage.                                                                          | `null`                                 |
| `pending_election`                                 | `null`. Deduct nothing yet, including for employees who were added at enrollment but haven't submitted an election. | `election_pending`                     |
| `enrolled` without approved terms                  | `null` until Prescience approves the plan terms.                                                                    | `plan_terms_not_approved`              |
| `enrolled`, employee waived but dependents covered | `null`. Prescience reviews dependent-only coverage.                                                                 | `dependent_only_coverage_needs_review` |
| `enrolled`, a tier rate missing                    | `null`                                                                                                              | `rate_missing`                         |
| `ineligible`                                       | `null`                                                                                                              | `ineligible`                           |
| `terminated`                                       | `null`. Stop deducting.                                                                                             | `terminated`                           |
| `cobra`                                            | `null`. COBRA continuants pay Prescience directly, not through payroll.                                             | `cobra_paid_directly`                  |

Never treat `null` as zero.

## The plan-level split

`plan.tiers` on `GET /groups/{groupId}/account` gives the monthly split, deductible and out-of-pocket maximum for every tier, which is what you show the employer. For the same synthetic plan:

```json theme={null}
[
  {
    "tier": "employee_only",
    "label": "Employee only",
    "totalMonthlyCents": 61200,
    "employerMonthlyCents": 61200,
    "employeeMonthlyCents": 0,
    "dentalVisionEmployeeMonthlyCents": 0,
    "deductibleCents": 0,
    "outOfPocketMaxCents": 100000
  },
  {
    "tier": "employee_plus_one",
    "label": "Employee + 1",
    "totalMonthlyCents": 122400,
    "employerMonthlyCents": 116280,
    "employeeMonthlyCents": 6120,
    "dentalVisionEmployeeMonthlyCents": 0,
    "deductibleCents": 0,
    "outOfPocketMaxCents": 210000
  },
  {
    "tier": "family",
    "label": "Family",
    "totalMonthlyCents": 183600,
    "employerMonthlyCents": 171360,
    "employeeMonthlyCents": 12240,
    "dentalVisionEmployeeMonthlyCents": 0,
    "deductibleCents": 0,
    "outOfPocketMaxCents": 250000
  }
]
```

`plan.employerContribution` holds the percentages the employer chose (`employeePct`, `dependentPct`) and the allowed range. `policyMismatch` is `true` when the approved per-tier amounts differ from what those percentages imply by more than \$1; the approved amounts still apply, but tell Prescience.

## HSA elections

Each employee chooses in Prescience how much of their pay goes into their HSA, pre-tax, for the rest of the tax year. `GET /groups/{groupId}/members` returns that choice as `hsaElection`. Add it to their payroll:

```json theme={null}
"hsaElection": {
  "status": "saved",
  "version": "2026-09-01T16:20:00.000Z",
  "contributionYear": 2026,
  "effectiveDate": "2026-09-01",
  "targetCents": 300000,
  "contributionLimit": "family"
}
```

* `targetCents` is the total to withhold from `effectiveDate` through December 31 of `contributionYear`. Split it across the employee's remaining paychecks on your calendar: you know the real pay dates, locked payrolls, missed checks and terminations.
* `contributionLimit` is Check's `hsa_contribution_limit` (`single` or `family`) for the employee's `hsa` benefit.
* `version` changes whenever the employee saves a new election. Apply each version once; when it changes, recompute the split from the new `effectiveDate`.
* `hsaElection` is `null` when the employee hasn't made an election. `targetCents: 0` means they elected nothing. Don't treat the two the same.
* It is the **saved election only**. It doesn't say what was withheld or deposited, and reading it doesn't authorize Prescience to collect anything.

Who does what:

| Step                                                                                    | Who        |
| --------------------------------------------------------------------------------------- | ---------- |
| Employee saves the election; Prescience enforces the contribution limits                | Prescience |
| Split `targetCents` across your paychecks and withhold it pre-tax (Check `hsa` benefit) | You        |
| Report what was actually withheld on each completed payroll                             | You        |
| Deposit the withheld money into the employee's HSA                                      | Prescience |

Check records the deduction and lowers take-home pay; it doesn't deposit the money. Prescience deposits only what you report as withheld. How those results reach Prescience is agreed during onboarding.

## Keeping deductions current

Sync `GET /groups/{groupId}/members` daily and before each payroll run. A deduction changes when an employee enrolls, waives, adds or removes a dependent, or when Prescience approves new plan terms (`plan.termsRevision` on `/account` increases). New hires and terminations still originate in your platform and reach Prescience through [census sync](/guides/census-sync).
