Employer Cancellation
Employer Cancellation
A cancellation request records that an employer is ending payroll with Salsa. It carries the reason they are leaving, the jurisdictional filing instructions, and optional context about the decision. Salsa derives the filing and tax payment responsibility end date from the request, so the reason and the jurisdictional details are what actually drive behavior. Existing requests are readable via employer(id:).cancellationRequests.
New to our GraphQL API? Start with basic concepts.
Creating a cancellation request
input CreateCancellationRequestInput {
employerId: ID!
"Last day the subscription is active"
subscriptionEndDate: Date
feedbackNotes: String
reason: EmployerCancellationReason!
details: CancellationJurisdictionalDetailsInput!
statedReasons: [String!]
destinationProvider: String
leavingPartnerPlatform: Boolean
}
"Exactly one country branch must be provided."
input CancellationJurisdictionalDetailsInput @oneOf {
usaDetails: UnitedStatesEmployerCancellationDetailsInput
canDetails: CanadaEmployerCancellationDetailsInput
}
input UnitedStatesEmployerCancellationDetailsInput {
salsaResponsibleForFilingsAndTaxPayments: Boolean!
"The last quarter Salsa is responsible for filing and tax payments"
lastQuarter: Int
"The last year Salsa is responsible for filing and tax payments"
lastYear: Int
}
input CanadaEmployerCancellationDetailsInput {
"Whether Salsa is responsible for filings at year-end"
salsaResponsibleForFilings: Boolean!
lastYear: Int
}| Field | Type | Required | Notes |
|---|---|---|---|
employerId | ID! | yes | Employer being cancelled. |
reason | EmployerCancellationReason! | yes | CLOSING_BUSINESS or SWITCHING_PAYROLL_PROVIDER. Drives the filing responsibility end date. Treat the enum as open and handle unrecognized values. |
details | CancellationJurisdictionalDetailsInput! | yes | @oneOf — supply exactly one of usaDetails or canDetails. |
subscriptionEndDate | Date | no | Last active day of the subscription. Supersedes the deprecated effectiveDate. |
feedbackNotes | String | no | Free-form notes captured with the request. |
statedReasons | [String!] | no | The employer's own reasons from your cancellation form, stored verbatim. |
destinationProvider | String | no | Payroll provider the employer is moving to. |
leavingPartnerPlatform | Boolean | no | true when the employer is leaving your platform entirely, not just Salsa payroll. |
The last three fields are pure pass-through context; they do not affect filing or tax calculations.
Filing responsibility
filingAndTaxPaymentResponsibilityEndDate on the returned details is derived, not supplied. When salsaResponsibleForFilingsAndTaxPayments is false, responsibility ends with the last pay date on service and lastQuarter/lastYear are optional. When it is true, lastQuarter and lastYear are required for U.S. employers and the reason selects the rule: SWITCHING_PAYROLL_PROVIDER resolves to the end of the requested quarter, while CLOSING_BUSINESS extends through the end of the filing year (covering zero filings, annual returns and worker forms). Requesting a quarter earlier than the most recently closed one is rejected. Canada takes canDetails with salsaResponsibleForFilings and lastYear; responsibility is resolved at year-end granularity.
Example
mutation CreateCancellationRequest($input: CreateCancellationRequestInput!) {
createCancellationRequest(input: $input) {
cancellationRequest {
id
effectiveDate
reason
details {
salsaResponsibleForFilings
salsaResponsibleForTaxPayments
filingAndTaxPaymentResponsibilityEndDate
}
}
}
}{
"input": {
"employerId": "er_200010001",
"subscriptionEndDate": "2026-09-30",
"reason": "SWITCHING_PAYROLL_PROVIDER",
"statedReasons": ["It costs too much", "I couldn't get the help I needed"],
"destinationProvider": "ADP",
"leavingPartnerPlatform": true,
"details": {
"usaDetails": {
"salsaResponsibleForFilingsAndTaxPayments": true,
"lastQuarter": 3,
"lastYear": 2026
}
},
"feedbackNotes": "Switching to ADP, Q3 2026."
}
}Deleting a cancellation request
A pending cancellation submitted in error can be removed with deleteCancellationRequest, which takes the request id and returns the deleted request.
mutation DeleteCancellationRequest($input: DeleteCancellationRequestInput!) {
deleteCancellationRequest(input: $input) {
cancellationRequest {
id
}
}
}Updated about 16 hours ago
