The plan.launched event
Sent when a Call+ plan is launched. Carries the fiche complémentaire figures (ATN, précompte professionnel, cotisations sociales) and the identifiers to match the beneficiary, employer and accounting firm.
plan.launched is sent when a Call+ plan is launched — the beneficiary has accepted the offer and the plan takes effect on our side. Plans launched in-app trigger the event within minutes. Launches recorded through our back-office are picked up by a periodic sync during business hours and can arrive later. Either way you keep a comfortable lead time before the fiche's payroll period (see the 60-day rule below).
Not triggered by simulations.
POST /api/v1/simulationsruns a hypothetical calculation and never emits this event. The figures inplan.launchedare the plan's actual values at launch, not a simulation estimate.
Request format
POST <your endpoint>
Content-Type: application/json
X-Callplus-Event-Id: 3f8e9a3c-6a68-4c69-9a1d-1f9f8b1f2a34
X-Callplus-Event-Type: plan.launched
X-Callplus-Signature: t=1786356000,v1=<hex HMAC-SHA256>
| Header | Description |
|---|---|
X-Callplus-Event-Id | Same value as eventId in the body — usable for dedup before parsing. |
X-Callplus-Event-Type | Same value as eventType in the body. |
X-Callplus-Signature | HMAC signature — see Verifying webhook signatures. |
Example — apiVersion 1
{
"eventId": "3f8e9a3c-6a68-4c69-9a1d-1f9f8b1f2a34",
"eventType": "plan.launched",
"apiVersion": 1,
"occurredAt": "2026-08-10T12:00:00+02:00",
"data": {
"dealId": "9c0d5c1e-8f4b-4d2a-b1c7-2e3f4a5b6c7d",
"accountingFirm": { "companyNumber": "0111222333", "name": "Fiduciaire Example SRL" },
"employer": { "companyNumber": "0999888777", "name": "ACME SRL" },
"beneficiary": {
"nationalRegisterNumber": "85051512345",
"firstName": "Marie",
"lastName": "Martin",
"email": "[email protected]",
"language": "FR"
},
"plan": {
"entryDate": "2026-09-01",
"taxationDate": "2026-10-31",
"planType": "FULL",
"currency": "EUR",
"referenceSalary": 85000.00,
"benefitInKind": 12345.67,
"withholdingTax": 6543.21,
"socialContributions": null
}
}
}Fields
All fields listed below are always present in the payload; "nullable" means the value can be JSON null. Parse defensively.
data
data| Field | Type | Nullable | Description |
|---|---|---|---|
dealId | UUID | no | Stable identifier of the plan on our side — use it as your external reference. |
accountingFirm | object | no | The accounting firm (fiduciaire) managing the plan. The object is always present; its fields are null when no firm is recorded. In events delivered to you, companyNumber is filled in — delivery requires the firm's consent. |
employer | object | no | The company offering the plan. The object is always present; its fields are null when not yet recorded. |
beneficiary | object | no | The beneficiary of the plan. The object is always present; its individual fields can each be null. |
plan | object | no | The plan figures and dates. |
data.accountingFirm / data.employer
data.accountingFirm / data.employer| Field | Type | Nullable | Description |
|---|---|---|---|
companyNumber | string | yes | Belgian company number (BCE/KBO) of the legal entity, as recorded on our side — formatting may vary (with or without dots). Normalize to the 10 digits before matching. |
name | string | yes | Legal entity name. |
data.beneficiary
data.beneficiary| Field | Type | Nullable | Description |
|---|---|---|---|
nationalRegisterNumber | string | yes | Belgian national register number — the payroll matching key. Formatting may vary; normalize to the 11 digits before matching. |
firstName, lastName | string | yes | Beneficiary's name. |
email | string | yes | Beneficiary's email address. |
language | string | yes | FR or NL. |
data.plan
data.plan| Field | Type | Nullable | Description |
|---|---|---|---|
entryDate | date (ISO 8601) | no | The plan's launch/offer date. Always a valid date in delivered events: a plan whose entry date is missing or invalid on our side is withheld (fail-closed) until it is corrected, so the consent activation date can always be checked. |
taxationDate | date (ISO 8601) | no | entryDate + 60 days — see the 60-day rule below. Derived from entryDate, so likewise always present in delivered events. |
planType | string | no | One of FULL, HALF_ONE_OF_TWO, HALF_TWO_OF_TWO, FULL_FIFTY_PERCENT. |
currency | string | no | Always EUR in apiVersion 1. |
referenceSalary | number | no | Reference salary of the beneficiary, in euros. |
benefitInKind | number | no | Benefit in kind (ATN/VAA) of the plan, in euros. |
withholdingTax | number | yes | Professional withholding tax (précompte professionnel) on the benefit in kind, in euros. |
socialContributions | number | yes | Cotisations sociales, in euros — null for plans where the social contributions are zero or borne elsewhere. The key is always present, never omitted. |
Terminology: webhook fields vs. Simulation API fields
Webhook field names align with the Simulation API: accountingFirm, referenceSalary and benefitInKind are the same concepts as the request fields of POST /api/v1/simulations, and withholdingTax matches result.withholdingTax in the simulation response. The Belgian payroll terms map as follows:
| Field | Belgian term |
|---|---|
benefitInKind | ATN / avantage de toute nature (VAA) |
withholdingTax | Précompte professionnel |
socialContributions | Cotisations sociales |
accountingFirm | Fiduciaire |
Note that data.plan.planType has its own set of values (the plan's lifecycle type) and is not the same enum as the Simulation API's plan.type. Also note the webhook carries the plan's actual figures at launch, while the Simulation API returns estimates.
The 60-day rule: which payroll period gets the fiche
Under the Belgian stock-option law of 26 March 1999, the benefit in kind is taxable at attribution, which the law fixes at the 60th day after the offer (the offer must be accepted in writing within those 60 days). The employer withholds the précompte professionnel in the payroll month of that attribution date.
This is why the payload carries both dates: taxationDate = entryDate + 60 days. The fiche complémentaire belongs in the payroll period containing taxationDate, not entryDate. The event is sent at launch, giving you roughly two months of lead time before that payroll period closes.
This is integration guidance, not tax advice. Confirm the fiscal treatment for your specific situation with your own advisors.
Updated 15 days ago