Qondor supports webhooks so you can pipe events from the platform straight into the tools your team uses. This article covers every available webhook, what fires it, and a few ways people actually use them.
Webhooks are set up by the Qondor team. When you get in touch, send us:
The endpoint URL you want Qondor to POST to
Which topics you need (one or several)
Whether it should cover all your offices, a specific office group, or a single office
An authentication header key and value if your endpoint requires it
HOW WEBHOOKS WORK
Each webhook is an HTTP POST to your endpoint with a JSON body. Payloads use camelCase and always include three fields at the top:
webhookId: a unique UUID per event, useful for deduplication if your endpoint receives the same event more than oncetimestamp: when the event occurred, in UTCtopic: the webhook type, for exampleOfferSentV1
Delivery is async, so expect a short delay between the event in Qondor and the POST arriving at your endpoint.
AVAILABLE WEBHOOKS
OFFER SENT
Triggered when an offer is sent to a customer.
Common uses: log the send event in your CRM and start a follow-up task; notify your sales team in Slack or Teams; update a deal stage to "Offer sent".
Request body
{ "webhookId": "84f48600-cdfc-477e-8257-916f9f3f7094", "timestamp": "2024-10-18T07:32:12.3678338Z", "topic": "OfferSentV1", "projectId": 1, "projectNo": "[Project No]", "projectName": "[Project Name]", "projectMainCustomerContactPersonEmail": "[Customer ContactPerson Email]", "offerId": 1, "offerHeading": "[Offer Heading]", "offerLanguage": "nb-NO", "offerValidUntil": "2024-11-01T08:32:12.3678146", "offerLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1", "directLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1&offerId=1", "customerId": 1, "customerName": "[Customer Name]", "customerExternalReference": "[Customer External Reference]"}
OFFER ANSWERED
Triggered when a customer responds to an offer.
Common uses: alert the account manager and trigger an approval workflow; update the deal to "Accepted" or "Declined" in your CRM; kick off onboarding steps automatically.
Request body
{ "webhookId": "859c49b3-55ba-46b6-95b2-038a34352e56", "timestamp": "2024-10-18T07:30:27.6387497Z", "topic": "OfferAnsweredV1", "projectId": 1, "projectNo": "[Project No]", "projectName": "[Project Name]", "projectMainCustomerContactPersonEmail": "[Customer ContactPerson Email]", "offerId": 1, "offerHeading": "[Offer Heading]", "offerLanguage": "nb-NO", "offerValidUntil": "2024-11-01T08:30:27.6387301", "offerLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1", "directLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1&offerId=1", "customerId": 1, "customerName": "[Customer Name]", "customerExternalReference": "[Customer External Reference]"}
OFFER COMMENT TO CUSTOMER CREATED
Triggered when a comment is sent to a customer from Adminweb.
Common uses: forward comments to a team channel so account managers stay in the loop; log the touchpoint on the CRM timeline.
Request body
{ "webhookId": "db44e0f6-b06a-4070-9740-efd89ceaedfb", "timestamp": "2024-10-18T07:29:14.7362436Z", "topic": "OfferCommentToCustomerCreatedV1", "projectId": 1, "projectNo": "[Project No]", "projectName": "[Project Name]", "projectMainCustomerContactPersonEmail": "[Customer ContactPerson Email]", "offerId": 1, "offerHeading": "[Offer Heading]", "offerLanguage": "nb-NO", "offerLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1", "directLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1&offerId=1#feedback?rootItemId=1", "customerId": 1, "customerName": "[Customer Name]", "customerExternalReference": "[Customer External Reference]", "commentedOn": "[Product or Group Name]", "commentText": "[Comment Text]"}
OFFER PUBLISH STATE CHANGED
Triggered when an offer's published state changes, both from the publish or unpublish toggle and when an offer is sent (sending an offer publishes it). isPublished is the new state and wasPublished the previous one, so you can tell a publish from an unpublish. Sending a previously unpublished offer delivers both OfferSentV1 and this webhook.
Common uses: keep an external "live offers" view in sync without polling; post to a channel when an offer goes live or is taken down.
Request body
{
"webhookId": "9f1c2d34-5e6f-47a8-9b0c-1d2e3f4a5b6c",
"timestamp": "2026-06-12T09:15:00.0000000Z",
"topic": "OfferPublishStateChangedV1",
"isPublished": true,
"wasPublished": false,
"projectId": 1,
"projectNo": "[Project No]",
"projectName": "[Project Name]",
"projectMainCustomerContactPersonEmail": "[Customer ContactPerson Email]",
"offerId": 1,
"offerHeading": "[Offer Heading]",
"offerLanguage": "nb-NO",
"offerValidUntil": "2026-07-01T08:00:00",
"offerLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1",
"directLink": "https://app.qondor.com/CustomerWeb/Home?projectId=1&offerId=1",
"customerId": 1,
"customerName": "[Customer Name]",
"customerExternalReference": "[Customer External Reference]"
}
PROJECT CREATED
Triggered when a new project is created in Qondor.
Common uses: create a matching record in your ERP or CRM; provision a Slack or Teams space for the project team; set up folder structures or task boards.
Request body
{ "webhookId": "7930960d-66c4-4db0-8f73-cb0564fa854b", "timestamp": "2024-10-18T07:32:46.3737922Z", "topic": "ProjectCreatedV1", "officeId": 1, "officeInternalName": "[Office Name]", "officeExternalReference": "[Office External Reference]", "projectId": 1, "projectNo": "[Project No]", "projectName": "[Project Name]"}
PROJECT STATUS CHANGED
Triggered when the status of a project changes. Possible values: Pending (1), Confirmed (2), Finished (3), Cancelled (4).
Common uses: when a project is confirmed, trigger invoicing or send a welcome pack; when finished, archive records and send a customer satisfaction survey; when cancelled, release resources and update your CRM.
Request body
{ "webhookId": "ae8532f2-b332-4161-943e-25fdc8d9f7e8", "timestamp": "2024-10-18T07:33:04.8506613Z", "topic": "ProjectStatusChangedV1", "officeId": 1, "officeInternalName": "[Office Name]", "officeExternalReference": "[Office External Reference]", "projectId": 1, "projectNo": "[Project No]", "projectName": "[Project Name]", "oldStatus": 1, "oldStatusText": "Pending", "newStatus": 2, "newStatusText": "Confirmed", "customerId": 1, "customerName": "[Customer Name]", "customerExternalReference": "[Customer External Reference]"}
BOOKING CONFIRMED
Triggered when a booking is confirmed. This is the richest payload: it carries the office, the project (with dates and category), the booking itself, the booker, every attending participant (with their custom field answers in participantFieldsV2), and the billing address.
Common uses: sync confirmed bookings into a CRM or finance system; create or update the company, contact and project members in an external tool; start fulfilment once a booking is approved.
Enum fields such as bookingType, participant status and custom field type include both a numeric value and a readable Text field next to it.
Request body
{
"webhookId": "3b2a1c0d-4e5f-6a7b-8c9d-0e1f2a3b4c5d",
"timestamp": "2026-05-13T07:45:10.0000000Z",
"topic": "BookingConfirmedV1",
"officeId": 1,
"officeInternalName": "[Office Name]",
"officeExternalReference": "[Office External Reference]",
"projectId": 1,
"projectNo": "[Project No]",
"projectName": "[Project Name]",
"projectStartDate": "2026-09-01T00:00:00",
"projectEndDate": "2026-09-03T00:00:00",
"projectCategory": "[Project Category]",
"teamId": 1,
"teamName": "[Team Name]",
"teamExternalReference": "[Team External Reference]",
"bookingReference": 12345,
"bookingStatus": "Approved",
"bookingType": 2,
"bookingTypeText": "Multi",
"bookingRegisteredDate": "2026-05-13T07:44:50",
"bookingLastEditedDate": "2026-05-13T07:45:05",
"booker": {
"participantReference": "11111111-1111-1111-1111-111111111111",
"firstName": "[Booker First Name]",
"lastName": "[Booker Last Name]",
"email": "[Booker Email]",
"phone": "[Booker Mobile Number]",
"isBooker": true,
"status": 10,
"statusText": "Attending",
"company": "[Booker Company]",
"externalReference": "[Booker External Reference]",
"checkInCode": "[Check-in Code]",
"participantCategoryId": 1,
"participantCategoryName": "[Participant Category Name]",
"participantFieldsV2": [
{
"customFieldId": 1,
"heading": "[Custom Field Heading]",
"type": 1,
"typeText": "Single line text",
"internalName": "[Internal Name]",
"answers": [ { "text": "[Custom Field Answer]" } ]
}
]
},
"participants": [
{
"participantReference": "22222222-2222-2222-2222-222222222222",
"firstName": "[Participant First Name]",
"lastName": "[Participant Last Name]",
"email": "[Participant Email]",
"phone": "[Participant Mobile Number]",
"isBooker": false,
"status": 10,
"statusText": "Attending",
"company": "[Participant Company]",
"externalReference": "[Participant External Reference]",
"checkInCode": "[Check-in Code]",
"participantCategoryId": 1,
"participantCategoryName": "[Participant Category Name]",
"participantFieldsV2": []
}
],
"billingAddress": {
"recipient": "[Billing Company]",
"contactPerson": "[Billing Contact Person]",
"email": "[Billing Email]",
"company": "[Billing Company]",
"addressLine1": "[Address Line 1]",
"addressLine2": "[Address Line 2]",
"postCode": "[Post Code]",
"city": "[City]",
"country": "[Country]",
"organisationNumber": "[Organisation Number]",
"vatNumber": "[VAT Number]",
"invoiceReference": "[Invoice Reference]",
"costCentre": "[Cost Centre]"
}
}
PING
Sends a minimal payload with no event data. Use this to confirm your endpoint is reachable and correctly configured before subscribing to live events.
Request body
{ "webhookId": "ab744426-839a-4d4d-97aa-514e06870bb8", "timestamp": "2024-10-18T07:32:30.3857483Z", "topic": "PingV1"}