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/simulations runs a hypothetical calculation and never emits this event. The figures in plan.launched are 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>
HeaderDescription
X-Callplus-Event-IdSame value as eventId in the body — usable for dedup before parsing.
X-Callplus-Event-TypeSame value as eventType in the body.
X-Callplus-SignatureHMAC 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

FieldTypeNullableDescription
dealIdUUIDnoStable identifier of the plan on our side — use it as your external reference.
accountingFirmobjectnoThe 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.
employerobjectnoThe company offering the plan. The object is always present; its fields are null when not yet recorded.
beneficiaryobjectnoThe beneficiary of the plan. The object is always present; its individual fields can each be null.
planobjectnoThe plan figures and dates.

data.accountingFirm / data.employer

FieldTypeNullableDescription
companyNumberstringyesBelgian 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.
namestringyesLegal entity name.

data.beneficiary

FieldTypeNullableDescription
nationalRegisterNumberstringyesBelgian national register number — the payroll matching key. Formatting may vary; normalize to the 11 digits before matching.
firstName, lastNamestringyesBeneficiary's name.
emailstringyesBeneficiary's email address.
languagestringyesFR or NL.

data.plan

FieldTypeNullableDescription
entryDatedate (ISO 8601)noThe 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.
taxationDatedate (ISO 8601)noentryDate + 60 days — see the 60-day rule below. Derived from entryDate, so likewise always present in delivered events.
planTypestringnoOne of FULL, HALF_ONE_OF_TWO, HALF_TWO_OF_TWO, FULL_FIFTY_PERCENT.
currencystringnoAlways EUR in apiVersion 1.
referenceSalarynumbernoReference salary of the beneficiary, in euros.
benefitInKindnumbernoBenefit in kind (ATN/VAA) of the plan, in euros.
withholdingTaxnumberyesProfessional withholding tax (précompte professionnel) on the benefit in kind, in euros.
socialContributionsnumberyesCotisations 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:

FieldBelgian term
benefitInKindATN / avantage de toute nature (VAA)
withholdingTaxPrécompte professionnel
socialContributionsCotisations sociales
accountingFirmFiduciaire

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.


Did this page help you?