Skip to main content

Webhooks in Qondor

A reference for all available webhooks in Qondor, including payload examples and common integration use cases.

Written by Martin Moen

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 once

  • timestamp: when the event occurred, in UTC

  • topic: the webhook type, for example OfferSentV1

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"}
Did this answer your question?