Webhook event

ProjectCreatedEvent

Sodtrack sends this payload when a new project is created in the platform, regardless of the channel it originated from: the admin panel, the Integration API (Project Creation), the execution of a bu…

Sodtrack sends POST with Content-Type: application/json to the endpoint configured for your tenant. See webhooks overview for delivery and security guidance.

Payload

Payload
{
  "timestamp": 1761494400,
  "userTriggererEmail": "pedro.rojas@example.com",
  "project": {
    "id": 88,
    "reference": "PROJ-EXT-100",
    "name": "Living room remodeling",
    "status": "created",
    "description": "Full remodeling of the living room",
    "startDate": null,
    "endDate": null,
    "createdDate": "2025-03-10T14:22:00.000Z",
    "customer": {
      "id": 2001,
      "email": "laura.gomez@example.com",
      "phone": "+56987654321",
      "name": "Laura",
      "lastname": "Gómez",
      "reference": "EXT-CUSTOMER-REF-001"
    },
    "provider": {
      "id": 42,
      "isCompany": true,
      "user": {
        "id": 5120,
        "email": "contacto@serviciosdelsur.example.com",
        "phone": "+56912345678",
        "name": "Servicios del Sur",
        "lastname": "SpA"
      }
    },
    "service": {
      "id": 10,
      "name": "Instalación"
    },
    "address": {
      "id": 3001,
      "address": "Av. Providencia 1234",
      "formatted_address": "Av. Providencia 1234, Santiago, Chile",
      "coordinate": {
        "lng": -70.58645659063548,
        "lat": -33.43324794409109
      },
      "areas": []
    },
    "dynamicFieldValues": [
      {
        "id": 910,
        "value": "1500 USD",
        "dynamicField": {
          "id": 12,
          "name": "estimated_budget",
          "label": "Estimated budget",
          "type": "text",
          "value": ""
        }
      }
    ]
  }
}

Purpose

Sodtrack sends this payload when a new project is created in the platform, regardless of the channel it originated from: the admin panel, the Integration API (Project Creation), the execution of a budget that generates bookings, or the creation of bookings that open a new project.

The payload is a snapshot of the project at the moment of creation, together with its customer, provider, service and address, so the receiving system can register the project locally without any additional call to Sodtrack. Bookings are not part of this payload: each booking is notified with BookingCreatedEvent, which carries the id and reference of its project.


Trigger Condition

This webhook is triggered when:

  • A new project has been successfully persisted in the Sodtrack system, and

  • The project-level dynamic field values received on creation have been saved.

The event is emitted right after the project is created, before any shopping cart or booking is linked to it.


Example Use Cases

  • Register Sodtrack projects in the store or ERP system as soon as they are created.

  • Link the bookings received later through BookingCreatedEvent to a project already stored locally, using project.id or project.reference.

  • Keep third-party dashboards synchronized with project creation activity.


Field Definitions

📋 Event

FieldTypeDescription
timestampnumberMoment the event was built, as a Unix timestamp in seconds.
userTriggererEmailstringEmail of the user that created the project. system when no user is associated with the request.

📁 Project — project

FieldTypeDescription
project.idnumberUnique Sodtrack project ID.
project.referencestringnull
project.namestringProject name.
project.statusstringProject status. "created" for a newly created project.
project.descriptionstringnull
project.startDatestringnull
project.endDatestringnull
project.createdDatestringProject creation timestamp.
project.customerobjectnull
project.providerobjectnull
project.serviceobjectnull
project.addressobjectnull
project.dynamicFieldValuesarrayProject-level dynamic field values (see Dynamic field value). Empty when there are none.

🧍 Customer — project.customer

Current values read from the customer record when the event is emitted.

FieldTypeDescription
project.customer.idnumberSodtrack customer ID.
project.customer.referencestringnull
project.customer.namestringCustomer first name.
project.customer.lastnamestringCustomer last name.
project.customer.emailstringCustomer email.
project.customer.phonestringnull

👷 Provider — project.provider

FieldTypeDescription
project.provider.idnumberSodtrack provider ID of the provider assigned to the project.
project.provider.isCompanybooleantrue when the provider is a company.
project.provider.userobjectUser data of the provider (id, name, lastname, email, phone).
project.provider.parentobjectOnly present when the provider belongs to a company: the company (id, isCompany, user).

🏠 Address — project.address

FieldTypeDescription
project.address.idnumberSodtrack address ID.
project.address.addressstringAddress as entered.
project.address.formatted_addressstringNormalized address as resolved by Sodtrack.
project.address.coordinateobjectnull
project.address.areasarrayAlways empty in this event.

🧩 Dynamic field value — project.dynamicFieldValues[]

FieldTypeDescription
idnumberValue ID.
valuestringLoaded value.
dynamicFieldobjectField definition (id, name, label, type, value).

Payload Example

json
{
  "timestamp": 1761494400,
  "userTriggererEmail": "pedro.rojas@example.com",
  "project": {
    "id": 88,
    "reference": "PROJ-EXT-100",
    "name": "Living room remodeling",
    "status": "created",
    "description": "Full remodeling of the living room",
    "startDate": null,
    "endDate": null,
    "createdDate": "2025-03-10T14:22:00.000Z",
    "customer": {
      "id": 2001,
      "email": "laura.gomez@example.com",
      "phone": "+56987654321",
      "name": "Laura",
      "lastname": "Gómez",
      "reference": "EXT-CUSTOMER-REF-001"
    },
    "provider": {
      "id": 42,
      "isCompany": true,
      "user": {
        "id": 5120,
        "email": "contacto@serviciosdelsur.example.com",
        "phone": "+56912345678",
        "name": "Servicios del Sur",
        "lastname": "SpA"
      }
    },
    "service": {
      "id": 10,
      "name": "Instalación"
    },
    "address": {
      "id": 3001,
      "address": "Av. Providencia 1234",
      "formatted_address": "Av. Providencia 1234, Santiago, Chile",
      "coordinate": {
        "lng": -70.58645659063548,
        "lat": -33.43324794409109
      },
      "areas": []
    },
    "dynamicFieldValues": [
      {
        "id": 910,
        "value": "1500 USD",
        "dynamicField": {
          "id": 12,
          "name": "estimated_budget",
          "label": "Estimated budget",
          "type": "text",
          "value": ""
        }
      }
    ]
  }
}

Project created through Project Creation, without provider, service or address:

json
{
  "timestamp": 1761494400,
  "userTriggererEmail": "system",
  "project": {
    "id": 90,
    "reference": "PROJ-EXT-102",
    "name": "Kitchen repair",
    "status": "created",
    "description": null,
    "startDate": null,
    "endDate": null,
    "createdDate": "2025-04-02T11:00:00.000Z",
    "customer": {
      "id": 2001,
      "email": "laura.gomez@example.com",
      "phone": "+56987654321",
      "name": "Laura",
      "lastname": "Gómez",
      "reference": "EXT-CUSTOMER-REF-001"
    },
    "provider": null,
    "service": null,
    "address": null,
    "dynamicFieldValues": []
  }
}

Business Rules & Constraints

When the webhook is sent

  • The event is emitted for every project created in Sodtrack. The payload carries no field identifying the origin channel.

  • The event is emitted asynchronously. A delivery failure does not affect the creation of the project.

Projects and bookings

  • The project is notified before any shopping cart or booking is linked to it, so this payload never includes bookings.

  • Each booking is notified separately with BookingCreatedEvent, which includes the id and reference of its project. Use them to link the booking to the project received in this event.

  • To retrieve the full project later, including its shopping carts and bookings, use Get Project.

Provider

  • When the provider assigned to the project belongs to a company, provider describes the assigned provider and the company is in provider.parent.

  • For an independent provider or a company, provider.parent is not present.

Nullable objects

  • customer, provider, service and address can each be null as a whole, not only their inner fields. A receiver must not assume the objects are present.

  • address.coordinate is null when the address was registered without geolocation.

Data and format

  • All identifiers are delivered as numbers.

  • timestamp is a Unix timestamp in seconds. Dates (createdDate, startDate, endDate) use ISO 8601 (UTC).

  • address.coordinate is a flat object with lng and lat properties. It is not GeoJSON.

  • Inside address and provider, field names keep Sodtrack's internal format (for example formatted_address, isCompany).