Skip to main content

useCompensationForm

useCompensationForm(input: UseCompensationFormProps): HookLoadingResult | UseCompensationFormReady

Headless hook for creating or updating a compensation row on a job — FLSA classification, pay rate, payment unit, effective date, and optional minimum-wage adjustment.

Remarks

Companion hook to useJobForm. Jobs and their compensations are separate entities in the Gusto API and this hook focuses exclusively on the compensation side. Presence of compensationId selects the verb:

Hook config / submit optionsModeAPI call
{ jobId, compensationId }updatePUT /v1/compensations/:compensationId (with version)
{ jobId } (no compensationId)createPOST /v1/jobs/:jobId/compensations
{ employeeId } + submit { jobId, compensationId, compensationVersion }updatePUT /v1/compensations/:compensationId (with the supplied version)
{ employeeId } + submit { jobId } (no compensationId)createPOST /v1/jobs/:options.jobId/compensations

Use the submit-options form for the onboarding stub-fill chain: after useJobForm.actions.onSubmit() creates a job, capture the auto-created compensation's UUID and version from the response, and pass them as { jobId, compensationId, compensationVersion } to this hook's onSubmit to PUT the stub.

The hook exposes several derived helpers for driving UX — static entity-derived values under data.* (effective-date bounds, pending future compensations) and reactive flags under status.* (the willDeleteSecondaryJobs carve-out, plus FLSA-specific alerts for commission-only and owner classifications). When willDeleteSecondaryJobs is true in update mode, the hook also locks the effectiveDate field (forces to today, renders disabled) until the FLSA selection is reverted.

Example

Example
import { useCompensationForm, SDKFormProvider } from '@gusto/embedded-react-sdk'

function CompensationForm({ employeeId, jobId }: { employeeId: string; jobId: string }) {
const comp = useCompensationForm({ employeeId, jobId })
if (comp.isLoading) return null

const { Fields } = comp.form
return (
<form onSubmit={e => { e.preventDefault(); comp.actions.onSubmit() }}>
<SDKFormProvider formHookResult={comp}>
{Fields.FlsaStatus && <Fields.FlsaStatus label="Employee type" />}
<Fields.Rate label="Compensation amount" />
<Fields.PaymentUnit label="Payment unit" />
{Fields.EffectiveDate && <Fields.EffectiveDate label="Effective date" />}
</SDKFormProvider>
{comp.status.willDeleteSecondaryJobs && (
<p>Saving will remove this employee's secondary jobs.</p>
)}
<button type="submit" disabled={comp.status.isPending}>Save</button>
</form>
)
}

Props

UseCompensationFormProps

Configuration options for useCompensationForm.

Remarks

Presence or absence of compensationId selects the API verb — see the compensationId field description. employeeId is optional so the hook can be composed alongside an employee-creation step. jobId is optional in update mode (derived from the loaded compensation) and required in create mode (scopes the POST); supply it at submit time via CompensationSubmitOptions.jobId when the parent job is created in the same submit chain.

PropertyTypeDescription
compensationId?stringPresent → update mode (PUT /v1/compensations/:id). Omitted → create mode (POST /v1/jobs/:jobId/compensations).
defaultValues?Partial<CompensationFormData>Pre-fill form values. Server data takes precedence on update mode.
employeeId?stringUUID of the employee whose compensation is being created or edited. Drives data fetching for derived helpers (jobs list, work address, minimum wages). May be omitted when composing alongside an employee-creation step.
jobId?stringThe parent job's UUID. Required in create mode (scopes POST /v1/jobs/:jobId/compensations). Optional in update mode — the parent job is derived from the loaded compensation.
optionalFieldsToRequire?CompensationOptionalFieldsToRequireOverride fields that are optional on a given mode to be required. See CompensationOptionalFieldsToRequire.
shouldFocusError?booleanAuto-focus the first invalid field on submit. Set to false when using composeSubmitHandler so submit-time focus is coordinated across multiple forms. Defaults to true.
validationMode?"onChange" | "onBlur" | "onSubmit" | "onTouched" | "all"Passed through to react-hook-form. Defaults to 'onSubmit'.
withEffectiveDateField?booleanWhen false, hides Fields.EffectiveDate (becomes undefined) and removes effectiveDate from schema validation. In this mode the hook does not read any form value at submit time — effective_date is omitted from the request body unless explicitly supplied via CompensationSubmitOptions.effectiveDate. This matches the options-only convention of other form hooks, and means the willDeleteSecondaryJobs carve-out's form-state side effects do not leak onto the wire (there is no field to render them in anyway). Defaults to true.

Returns

HookLoadingResult | UseCompensationFormReady

A HookLoadingResult while data is loading, or a UseCompensationFormReady once ready.

UseCompensationFormResult

UseCompensationFormResult = HookLoadingResult | UseCompensationFormReady

Discriminated union returned by useCompensationForm — either the loading state or the ready state.

Remarks

Use this type when threading the hook result through helpers (e.g. presentational components). Discriminate on isLoading to narrow to UseCompensationFormReady.


UseCompensationFormReady

Ready-state shape returned by useCompensationForm once data has loaded.

Remarks

Discriminated by isLoading: false. Extends BaseFormHookReady with the compensation-specific data, status, actions, and form.Fields shape. Static, entity-derived values live under data.*; reactive values that flip with form input live under status.*.

PropertyTypeDescription
actionsobjectSubmit actions exposed by the hook.
actions.onSubmit(options?: CompensationSubmitOptions) => Promise<HookSubmitResult<Compensation> | undefined>Validates the form, runs the appropriate create/update mutation, and resolves to a HookSubmitResult containing the saved compensation. Resolves to undefined on validation failure or mutation error. Accepts CompensationSubmitOptions for threading IDs/version into the onboarding stub-fill chain.
dataobjectCompensation-specific data payload: the loaded compensation, the parent job, available minimum wages, and effective-date bounds.
data.compensationCompensation | nullThe compensation row loaded for update; null in create mode.
data.currentJobJob | nullThe parent job. In update mode it's derived from the loaded compensation; in create mode it's looked up by jobId. null if neither resolves.
data.hasPendingFutureCompensationbooleanTrue when at least one future-dated compensation already exists for this job.
data.maximumEffectiveDatestring | nullUpper bound for effectiveDate — the next scheduled future compensation's effective date, when one exists.
data.minimumEffectiveDatestring | nullLower bound for effectiveDate (typically the parent job's hire date).
data.minimumWagesMinimumWage[]Minimum wages available at the employee's active work location. Empty when no location is set or no minimums are defined.
errorHandlingHookErrorHandlingError state and recovery actions.
formobjectForm bindings: pre-bound field components, per-field metadata, submission values, and react-hook-form internals.
form.FieldsCompensationFormFields-
form.fieldsMetadataCompensationFieldsMetadata-
form.getFormSubmissionValues() => CompensationFormData | undefined-
form.hookFormInternalsHookFormInternals<CompensationFormData>-
isLoadingfalseAlways false in this branch; discriminates from HookLoadingResult.
statusobjectSubmission state and reactive flags derived from current form input. isPending is true while a create/update mutation is in flight; mode reflects whether the next submit will create or update; the show*Alert flags drive FLSA-specific inline warnings.
status.isPendingbooleantrue while a create or update mutation is in flight.
status.mode"create" | "update"Reflects whether the next submit will POST a new compensation or PUT an existing one.
status.showCommissionFederalMinimumPayAlertbooleanTrue when the current flsaStatus is COMMISSION_ONLY_EXEMPT (Commission Only/No Overtime). Render the federal-minimum-pay warning alert when this flag is true. While this flag is true, Fields.Rate and Fields.PaymentUnit are also undefined (the hook forces rate=0, paymentUnit=YEAR on the form values).
status.showCommissionMinimumWageAlertbooleanTrue when the current flsaStatus is COMMISSION_ONLY_NONEXEMPT (Commission Only/Eligible for overtime). Render the local-minimum-wage warning alert when this flag is true. While this flag is true, Fields.Rate and Fields.PaymentUnit are also undefined (the hook forces rate=0, paymentUnit=YEAR on the form values).
status.showOwnerSalaryAlertbooleanTrue when the current flsaStatus is OWNER (Owner's draw). Render an informational alert noting that the IRS requires S-corp owners to pay themselves a reasonable salary for similar work before taking distributions.
status.willDeleteSecondaryJobsbooleanTrue when submitting the form right now would delete the employee's secondary jobs server-side (the "carve-out" branch). Reactive: derived from the current flsaStatus form value, the loaded compensation, and the other-jobs count, so this flips as you change inputs. Conditions: update mode, the loaded compensation is Nonexempt, the form's flsaStatus has been changed to a non-Nonexempt value, and the employee has at least one secondary job. While this flag is true the hook also takes the effectiveDate field over: it forces the form value to today (so submits route through a PUT that immediately deletes secondaries) and exposes fieldsMetadata.effectiveDate.isDisabled = true so Fields.EffectiveDate renders as disabled. On revert (FLSA back to Nonexempt) the prior effectiveDate is restored. Render an inline warning keyed off this flag — no separate confirmation step is needed.

Fields

CompensationFormFields

Pre-bound field components exposed on useCompensationForm().form.Fields.

Remarks

Each property is either the field component or undefined. A field is undefined when conditions for rendering it aren't met — see each member for its visibility rule. Always null-check conditional fields (e.g. {Fields.FlsaStatus && <Fields.FlsaStatus ... />}) before rendering.

PropertyTypeDescription
TitleComponentType<TitleFieldProps>Bound to title. Title text input. Always available. Optional in both modes unless optionalFieldsToRequire requires it.
AdjustForMinimumWageComponentType<AdjustForMinimumWageFieldProps> | undefinedBound to adjustForMinimumWage. Minimum-wage adjustment checkbox. undefined unless flsaStatus === Nonexempt, the employee's work location has minimum wages, and the state supports tip credits.
EffectiveDateComponentType<EffectiveDateFieldProps> | undefinedBound to effectiveDate. Effective-date picker. undefined when withEffectiveDateField: false; supply the value via CompensationSubmitOptions.effectiveDate in that mode.
FlsaStatusComponentType<FlsaStatusFieldProps> | undefinedBound to flsaStatus. FLSA classification select. undefined when the status is not user-editable (e.g. secondary jobs that must match the primary).
MinimumWageIdComponentType<MinimumWageIdFieldProps> | undefinedBound to minimumWageId. Minimum-wage selection. undefined unless Fields.AdjustForMinimumWage is rendered and checked.
PaymentUnitComponentType<PaymentUnitFieldProps> | undefinedBound to paymentUnit. Payment unit select. undefined for commission-only FLSA statuses (the hook forces paymentUnit=Year).
RateComponentType<RateFieldProps> | undefinedBound to rate. Compensation amount input. undefined for commission-only FLSA statuses, which don't accept a partner-supplied rate.

AdjustForMinimumWage

Bound to adjustForMinimumWage. Minimum-wage adjustment checkbox. undefined unless flsaStatus === Nonexempt, the employee's work location has minimum wages, and the state supports tip credits.

{form.Fields.AdjustForMinimumWage && (
<form.Fields.AdjustForMinimumWage label="Adjust for minimum wage" />
)}

AdjustForMinimumWageFieldProps

HookFieldProps<CheckboxHookFieldProps>

Props accepted by useCompensationForm's Fields.AdjustForMinimumWage component.

PropertyTypeDescription
labelstringVisible label rendered above the field.
FieldComponent?ComponentType<CheckboxProps>Replaces the default checkbox UI component; must accept the same props as CheckboxProps.

Also accepts description, formHookResult from CheckboxHookFieldProps.


EffectiveDate

Bound to effectiveDate. Effective-date picker. undefined when withEffectiveDateField: false; supply the value via CompensationSubmitOptions.effectiveDate in that mode.

{form.Fields.EffectiveDate && (
<form.Fields.EffectiveDate
label="Effective date"
validationMessages={{
REQUIRED: '…',
EFFECTIVE_DATE_BEFORE_HIRE: '…',
EFFECTIVE_DATE_BEFORE_MIN: '…',
}}
/>
)}

CompensationEffectiveDateFieldProps

HookFieldProps<DatePickerHookFieldProps<CompensationEffectiveDateValidation>>

Props accepted by useCompensationForm's Fields.EffectiveDate component.

PropertyTypeDescription
labelstringVisible label rendered above the field.
FieldComponent?ComponentType<DatePickerProps>Replaces the default date picker UI component; must accept the same props as DatePickerProps.
validationMessages?ValidationMessages<CompensationEffectiveDateValidation>Custom error text keyed by validation error code.

Also accepts description, formHookResult, maxDate, minDate, portalContainer from DatePickerHookFieldProps.


FlsaStatus

Bound to flsaStatus. FLSA classification select. undefined when the status is not user-editable (e.g. secondary jobs that must match the primary).

{form.Fields.FlsaStatus && (
<form.Fields.FlsaStatus
label="Flsa status"
validationMessages={{ REQUIRED: '…' }}
/>
)}

FlsaStatusFieldProps

HookFieldProps<SelectHookFieldProps<CompensationRequiredValidation, FlsaStatusType>>

Props accepted by useCompensationForm's Fields.FlsaStatus component.

PropertyTypeDescription
labelstringVisible label rendered above the field.
placeholderstringPlaceholder text displayed when no option is selected. Required so empty dropdowns always communicate the action — pass an empty string only when a default value is guaranteed.
FieldComponent?ComponentType<SelectProps>Replaces the default select UI component; must accept the same props as SelectProps.
getOptionLabel?(entry: FlsaStatusType) => stringMaps a raw option entry to its display label; when omitted, options use the labels provided by the hook.
validationMessages?ValidationMessages<CompensationRequiredValidation>Custom error text keyed by validation error code.

Also accepts description, formHookResult, portalContainer from SelectHookFieldProps.


MinimumWageId

Bound to minimumWageId. Minimum-wage selection. undefined unless Fields.AdjustForMinimumWage is rendered and checked.

{form.Fields.MinimumWageId && (
<form.Fields.MinimumWageId
label="Minimum wage id"
validationMessages={{ REQUIRED: '…' }}
/>
)}

MinimumWageIdFieldProps

HookFieldProps<SelectHookFieldProps<CompensationRequiredValidation, MinimumWage>>

Props accepted by useCompensationForm's Fields.MinimumWageId component.

PropertyTypeDescription
labelstringVisible label rendered above the field.
placeholderstringPlaceholder text displayed when no option is selected. Required so empty dropdowns always communicate the action — pass an empty string only when a default value is guaranteed.
FieldComponent?ComponentType<SelectProps>Replaces the default select UI component; must accept the same props as SelectProps.
getOptionLabel?(entry: MinimumWage) => stringMaps a raw option entry to its display label; when omitted, options use the labels provided by the hook.
validationMessages?ValidationMessages<CompensationRequiredValidation>Custom error text keyed by validation error code.

Also accepts description, formHookResult, portalContainer from SelectHookFieldProps.


PaymentUnit

Bound to paymentUnit. Payment unit select. undefined for commission-only FLSA statuses (the hook forces paymentUnit=Year).

{form.Fields.PaymentUnit && (
<form.Fields.PaymentUnit
label="Payment unit"
validationMessages={{ REQUIRED: '…' }}
/>
)}

PaymentUnitFieldProps

HookFieldProps<SelectHookFieldProps<CompensationRequiredValidation, PaymentUnit>>

Props accepted by useCompensationForm's Fields.PaymentUnit component.

PropertyTypeDescription
labelstringVisible label rendered above the field.
placeholderstringPlaceholder text displayed when no option is selected. Required so empty dropdowns always communicate the action — pass an empty string only when a default value is guaranteed.
FieldComponent?ComponentType<SelectProps>Replaces the default select UI component; must accept the same props as SelectProps.
getOptionLabel?(entry: PaymentUnit) => stringMaps a raw option entry to its display label; when omitted, options use the labels provided by the hook.
validationMessages?ValidationMessages<CompensationRequiredValidation>Custom error text keyed by validation error code.

Also accepts description, formHookResult, portalContainer from SelectHookFieldProps.


Rate

Bound to rate. Compensation amount input. undefined for commission-only FLSA statuses, which don't accept a partner-supplied rate.

{form.Fields.Rate && (
<form.Fields.Rate
label="Rate"
validationMessages={{
REQUIRED: '…',
RATE_MINIMUM: '…',
RATE_EXEMPT_THRESHOLD: '…',
}}
/>
)}

RateFieldProps

HookFieldProps<NumberInputHookFieldProps<RateValidation>>

Props accepted by useCompensationForm's Fields.Rate component.

PropertyTypeDescription
labelstringVisible label rendered above the field.
FieldComponent?ComponentType<NumberInputProps>Replaces the default number input UI component; must accept the same props as NumberInputProps.
validationMessages?ValidationMessages<RateValidation>Custom error text keyed by validation error code.

Also accepts description, format, formHookResult, max, min, placeholder from NumberInputHookFieldProps.


Title

Bound to title. Title text input. Always available. Optional in both modes unless optionalFieldsToRequire requires it.

<form.Fields.Title
label="Title"
validationMessages={{ REQUIRED: '…' }}
/>

CompensationTitleFieldProps

HookFieldProps<TextInputHookFieldProps<CompensationRequiredValidation>>

Props accepted by useCompensationForm's Fields.Title component.

PropertyTypeDescription
labelstringVisible label rendered above the field.
FieldComponent?ComponentType<TextInputProps>Replaces the default text input UI component; must accept the same props as TextInputProps.
validationMessages?ValidationMessages<CompensationRequiredValidation>Custom error text keyed by validation error code.

Also accepts description, formHookResult, placeholder, transform from TextInputHookFieldProps.

Validations

CompensationEffectiveDateValidation

CompensationEffectiveDateValidation = "REQUIRED" | "EFFECTIVE_DATE_BEFORE_HIRE" | "EFFECTIVE_DATE_BEFORE_MIN"

Validation error codes emitted by the effectiveDate field of useCompensationForm.

Remarks

Use these as keys in validationMessages on Fields.EffectiveDate. See CompensationErrorCodes for the full description of each code.


CompensationRequiredValidation

CompensationRequiredValidation = "REQUIRED"

The required-field error code produced by useCompensationForm fields that only emit REQUIRED.

Remarks

Used as the validationMessages key for the title, FLSA status, payment unit, and minimum-wage selection fields. See CompensationErrorCodes.


RateValidation

RateValidation = "REQUIRED" | "RATE_MINIMUM" | "RATE_EXEMPT_THRESHOLD"

Validation error codes emitted by the rate field of useCompensationForm.

Remarks

Use these as keys in validationMessages on Fields.Rate. See CompensationErrorCodes for the full description of each code.

Utility types

CompensationErrorCode

CompensationErrorCode = "REQUIRED" | "RATE_MINIMUM" | "RATE_EXEMPT_THRESHOLD" | "PAYMENT_UNIT_OWNER" | "PAYMENT_UNIT_COMMISSION" | "RATE_COMMISSION_ZERO" | "EFFECTIVE_DATE_BEFORE_HIRE" | "EFFECTIVE_DATE_BEFORE_MIN"

Union of every error code produced by the useCompensationForm schema.


CompensationErrorCodes

const CompensationErrorCodes: object

Validation error codes produced by the useCompensationForm schema.

Remarks

Use these constants as the keys in a field's validationMessages prop to map an error code to a user-facing message.

CodeWhen it triggers
REQUIREDA required field is empty (per mode and optionalFieldsToRequire).
RATE_MINIMUMrate is less than $1.00 for non-commission FLSA statuses.
RATE_EXEMPT_THRESHOLDFLSA Exempt employees must clear the federal salary threshold (annualized).
PAYMENT_UNIT_OWNEROwner FLSA status requires paymentUnit === 'Paycheck'.
PAYMENT_UNIT_COMMISSIONCommission-only FLSA statuses require paymentUnit === 'Year'.
RATE_COMMISSION_ZEROCommission-only FLSA statuses require rate === 0.
EFFECTIVE_DATE_BEFORE_HIREeffectiveDate precedes the parent job's hireDate.
EFFECTIVE_DATE_BEFORE_MINeffectiveDate precedes the caller-supplied minimum (typically tomorrow).

Example

import { CompensationErrorCodes } from '@gusto/embedded-react-sdk'

<Fields.Rate
label="Compensation amount"
validationMessages={{
[CompensationErrorCodes.REQUIRED]: 'Amount is required',
[CompensationErrorCodes.RATE_MINIMUM]: 'Amount must be at least $1.00',
[CompensationErrorCodes.RATE_EXEMPT_THRESHOLD]: 'Exempt employees must meet the salary threshold',
}}
/>

Type Declaration

NameType
EFFECTIVE_DATE_BEFORE_HIRE"EFFECTIVE_DATE_BEFORE_HIRE"
EFFECTIVE_DATE_BEFORE_MIN"EFFECTIVE_DATE_BEFORE_MIN"
PAYMENT_UNIT_COMMISSION"PAYMENT_UNIT_COMMISSION"
PAYMENT_UNIT_OWNER"PAYMENT_UNIT_OWNER"
RATE_COMMISSION_ZERO"RATE_COMMISSION_ZERO"
RATE_EXEMPT_THRESHOLD"RATE_EXEMPT_THRESHOLD"
RATE_MINIMUM"RATE_MINIMUM"
REQUIRED"REQUIRED"

CompensationFieldsMetadata

Metadata for each useCompensationForm field, exposed on form.fieldsMetadata.

Remarks

Includes per-field isDisabled, isRequired, and the dynamic option list for select fields (flsaStatus, paymentUnit, minimumWageId). effectiveDate additionally carries minDate / maxDate derived from the parent job's hire date and any pending future compensation.


CompensationFormData

Shape of the form values managed by useCompensationForm.

Remarks

Accepted as defaultValues on useCompensationForm and returned by form.getFormSubmissionValues() once the form has validated. effectiveDate is an ISO date string (YYYY-MM-DD) or null; flsaStatus is optional so the field can render an empty placeholder when nothing is preselected (requiredness is enforced on submit per mode).

Properties

PropertyTypeDescription
adjustForMinimumWageboolean-
effectiveDatestring | nullThe effective date a new compensation should take effect on. - create mode (compensationId absent): required; partners typically default to the parent job's hireDate (onboarding stub-fill) or a future date (rate change). Must be on or after hireDate. Server-side this maps to POST /v1/jobs/:jobId/compensations. - update mode (compensationId present): optional; if omitted the API keeps the existing effective date. The hireDate lower bound is not enforced — loaded values may legitimately predate the hire date. Maps to PUT /v1/compensations/:id.
flsaStatus"Exempt" | "Salaried Nonexempt" | "Nonexempt" | "Owner" | "Commission Only Exempt" | "Commission Only Nonexempt" | undefined-
minimumWageIdstring-
paymentUnit"Hour" | "Week" | "Month" | "Year" | "Paycheck"-
ratenumber-
titlestringOptional in both modes. Setting title here scopes the change to this compensation's effectiveDate — pair it with a future-dated comp to schedule a promotion title alongside a rate change. Use useJobForm.Fields.Title instead when creating a job (title is required by the API on job creation) or when renaming the active role immediately, and avoid rendering both fields on the same screen.

CompensationOptionalFieldsToRequire

CompensationOptionalFieldsToRequire = OptionalFieldsToRequire<typeof requiredFieldsConfig>

Override which fields are required on a given submission mode of useCompensationForm.

Remarks

Each mode key lists the fields that are optional by default for that mode but should be promoted to required. adjustForMinimumWage is always required and minimumWageId is automatically required when adjustForMinimumWage is true — neither is configurable here.

FieldRequired on createRequired on updateConfigurable?
flsaStatusYesNoYes (on update)
paymentUnitYesNoYes (on update)
rateYesNoYes (on update)
effectiveDateYesNoYes (on update)
titleNoNoYes (either mode)
adjustForMinimumWageYesYesNo
minimumWageIdWhen toggle is onWhen toggle is onNo

Example

const compensation = useCompensationForm({
employeeId,
jobId,
compensationId,
optionalFieldsToRequire: {
update: ['title', 'rate'],
},
})

CompensationSubmitOptions

Optional values supplied to useCompensationForm's actions.onSubmit at submit time.

Remarks

Use these to override hook-construction props when an ID isn't known at mount — most commonly the onboarding stub-fill chain, where useJobForm creates the parent job and returns the auto-created stub compensation, and the IDs and version are threaded into this hook's onSubmit to PUT the stub.

Properties

PropertyTypeDescription
compensationId?stringOverride compensationId — when present, forces update (PUT) routing regardless of hook construction.
compensationVersion?stringCompensation version for optimistic locking on PUT. Required when forcing update routing post-create (e.g. updating the auto-created stub returned from POST /v1/employees/:id/jobs). When omitted, the hook reads the version from its cached currentCompensation.
effectiveDate?stringSupply effectiveDate at submit time. When withEffectiveDateField is true, this overrides the form's value. When withEffectiveDateField is false, this is the only way to put effective_date on the wire — the form value is not read in that mode (matching the options-only convention of useWorkAddressForm / useHomeAddressForm / useJobForm).
jobId?stringOverride jobId — required when creating a compensation if not configured at hook construction (e.g. when the parent job was just created in the same submit chain).

Endpoints