Skip to main content

Events

Real-time notifications for system changes and device activity

Events are the core of Texture's power—the platform was built as an event-driven system from the ground up, unlike traditional data warehouses that only provide historical analysis. This event-driven architecture enables real-time responsiveness, immediate automation, and proactive energy management that static data systems simply cannot match.

Every change in your energy infrastructure—device connections, state updates, command executions, and system modifications—triggers events that flow through Texture's real-time processing engine. This gives you immediate visibility and control over your energy systems, enabling automated workflows and proactive monitoring that transform how you manage energy infrastructure.

Each event follows the Standard Webhook Specification for maximum compatibility with existing integrations. Events are delivered as JSON payloads with consistent structure, making them easy to process and integrate into your applications****.****


Why Events?

Unlike traditional energy management systems that rely on periodic data polling and batch processing, Texture's event-driven architecture provides immediate responsiveness and real-time control. Events enable you to:

  • Monitor Real-Time Activity — Get immediate notifications when devices connect, disconnect, or update
  • Track Command Execution — Know when commands succeed or fail across your device fleet
  • Automate Workflows — Trigger actions based on specific events and conditions
  • Maintain System Health — Proactively identify and respond to device issues
  • Audit System Changes — Keep a complete record of all platform activity
  • Integrate with External Systems — Connect events to your existing tools and workflows
  • Enable Real-Time Control — Respond instantly to grid conditions, price signals, or device states
  • Scale Automation — Build complex, multi-device automation that traditional systems cannot support

Events transform static energy data into dynamic, actionable intelligence—making Texture fundamentally different from traditional data warehouses that can only tell you what happened yesterday.


Event Structure

All events follow a consistent structure for easy processing:

  • JSON Format — All events are delivered as JSON objects
  • Type Property — Each event has a type property indicating the event category
  • Version Control — Events include a version property using semantic versioning
  • Unique Keys — Every event has a unique key property for deduplication
  • Standard Webhooks — Compatible with the Standard Webhook Specification

This consistent structure ensures reliable event processing and integration across your systems.


Available Event Types

Texture currently offers eight core event types that cover the essential aspects of energy system monitoring:

Event TypeDescriptionTrigger
customer.createdNew customer created on the platformCustomer registration
command.failedCommand execution failedCommand failure
command.succeededCommand execution succeededCommand completion
device.discoveredNew device connected to platformDevice connection
device.updatedDevice data updatedDevice state change
device.disconnectedDevice disconnected from platformDevice disconnection
enrollment.approvedProgram enrollment approvedEnrollment approval
site.createdNew site created on platformSite creation

Each event type provides specific data relevant to its context, enabling targeted automation and monitoring.


Event Types and Payloads

Customer Created

Fired whenever a customer is created on the Texture platform.

{
  "type": "customer.created",
  "version": "0.0.1",
  "key": "cc0e387d55ab78fb204c5c2225eff0aa6a9ca3f32a8d5542f75fe9b8bd972d87",
  "timestamp": "2024-08-22T15:54:52.013Z",
  "data": {
    "id": "cllzcbw0t00016g7dfua590dd",
    "workspaceId": "cllzcf9xe00066g7dcsxyq1e5",
    "referenceId": "user-123456",
    "organizationId": "cm6y0mhhy00000cl4hz6i78ik",
    "updatedAt": "2024-08-22T15:54:52.013Z",
    "createdAt": "2024-08-22T15:54:52.013Z",
    "email": "bjones@texturehq.com",
    "firstName": "Bob",
    "lastName": "Jones",
    "phone": "+15551234567"
  }
}
KeyDescription
idThe unique identifier for the customer.
workspaceIdThe ID of the workspace associated with the customer.
referenceIdThe reference ID for the customer.
organizationIdThe ID of the organization associated with the customer.
updatedAtThe date and time when the customer was last updated.
createdAtThe date and time when the customer was created.
emailThe email address of the customer.
firstNameThe first name of the customer.
lastNameThe last name of the customer.
phoneThe phone number of the customer.

Command Failed

Fired whenever a command run against a device fails.

{
  "type": "command.failed",
  "version": "0.0.2",
  "key": "cc0e387d55ab78fb204c5c2225eff0aa6a9ca3f32a8d5542f75fe9b8bd972d87",
  "timestamp": "2024-08-22T15:54:52.013Z",
  "data": {
    "workspaceId": "cllzcf9xe00066g7dcsxyq1e5",
    "commandId": "cllzcbw0t00016g7dfua590dd",
    "deviceId": "cllzcbw0t00016g7dfua590dd",
    "error": {
      "message": "Failed to execute command"
    },
    "issuedAt": "2023-09-01T20:48:24.967Z",
    "executedAt": "2023-09-01T20:48:24.967Z"
  }
}
KeyDescription
workspaceIdThe ID of the workspace associated with the command.
commandIdThe unique identifier for the command.
deviceIdThe ID of the device on which the command was executed.
error.messageThe error that occurred.
issuedAtThe date and time when the command was issued.
executedAtThe date and time when the command was executed.

Command Succeeded

Fired whenever a command run against a device succeeds.

{
  "type": "command.succeeded",
  "version": "0.0.2",
  "key": "cc0e387d55ab78fb204c5c2225eff0aa6a9ca3f32a8d5542f75fe9b8bd972d87",
  "timestamp": "2024-08-22T15:54:52.013Z",
  "data": {
    "workspaceId": "cllzcf9xe00066g7dcsxyq1e5",
    "commandId": "cllzcbw0t00016g7dfua590dd",
    "deviceId": "cllzcbw0t00016g7dfua590dd",
    "issuedAt": "2023-09-01T20:48:24.967Z",
    "executedAt": "2023-09-01T20:48:24.967Z"
  }
}
KeyDescription
workspaceIdThe ID of the workspace associated with the command.
commandIdThe unique identifier for the command.
deviceIdThe ID of the device on which the command was executed.
issuedAtThe date and time when the command was issued.
executedAtThe date and time when the command was executed.

Device Discovered

Fired when a new device is connected to the Texture platform.

{
  "type": "device.discovered",
  "version": "1.0.0",
  "key": "cc0e387d55ab78fb204c5c2225eff0aa6a9ca3f32a8d5542f75fe9b8bd972d87",
  "timestamp": "2024-08-22T15:54:52.013Z",
  "data": {
    "deviceId": "cllzcbw0t00016g7dfua590dd",
    "workspaceId": "cllzcf9xe00066g7dcsxyq1e5",
    "organizationId": "cm6y391is00000cjlea9361ht",
    "updatedAt": "2024-08-22T15:54:52.013Z",
    "createdAt": "2024-08-22T15:54:52.013Z",
    "manufacturer": {
      "slug": "tesla",
      "displayName": "Tesla"
    },
    "deviceModel": {
      "slug": "tesla:powerwall",
      "displayName": "Powerwall"
    },
    "deviceType": "battery",
    "tags": [
      "battery",
      "powerwall"
    ],
    "customer": {
      "id": "cllzcbw0t00016g7dfua590dd",
      "email": "bjones@texturehq.com",
      "firstName": "Bob",
      "lastName": "Jones",
      "phone": "+15551234567"
    },
    "site": {
      "id": "cllzcbw0t00016g7dfua590dd",
      "name": "Empire State Building",
      "address": {
        "streetAddress1": "20 W 34th St",
        "city": "New York",
        "state": "NY",
        "postalCode": "10118",
        "country": "US"
      },
      "longitude": -73.985428,
      "latitude": 40.748817
    }
  }
}
KeyDescription
deviceIdThe unique identifier for the device.
workspaceIdThe ID of the workspace associated with the device.
organizationIdThe ID of the organization associated with the device.
updatedAtThe timestamp when this update was created. This is the timestamp of the request the OEM's API returned, not necessarly the timestamp of when the state was actually updated on the device. For that see state.createdAt.
createdAtThe date and time when the device was created.
manufacturer.slugThe human-readable identifier of the manufacturer of the device.
manufacturer.displayNameThe display name of the manufacturer of the device.
deviceModel.slugThe human-readable identifier of the device model.
deviceModel.displayNameThe display name of the device model.
deviceTypeThe type of device (e.g. battery).
tagsAn array of tags associated with the device.
customer.idThe unique identifier for the customer associated with the device.
customer.referenceIdThe reference ID for the customer associated with the device.
customer.emailThe email address of the customer associated with the device.
customer.firstNameThe first name of the customer associated with the device.
customer.lastNameThe last name of the customer associated with the device.
customer.phoneThe phone number of the customer associated with the device.
site.idThe unique identifier for the site associated with the device.
site.nameThe name of the site associated with the device.
site.address.streetAddress1The first line of the street address of the site associated with the device.
site.address.streetAddress2The second line of the street address of the site associated with the device.
site.address.cityThe city of the site associated with the device.
site.address.stateThe state of the site associated with the device.
site.address.postalCodeThe postal code of the site associated with the device.
site.address.countryThe country of the site associated with the device.
site.longitudeThe longitude of the geographical coordinates of the site associated with the device.
site.latitudeThe latitude of the geographical coordinates of the site associated with the device.
tip

Device Type Filtering

When configuring a destination, you can specify which device types should trigger events for a given destination. For example, you could configure a webhook to receive only Battery device updates, and Texture will filter events accordingly.

Device Updated

Fired whenever we get updated data for a device.

{
  "type": "device.updated",
  "version": "1.0.0",
  "key": "cc0e387d55ab78fb204c5c2225eff0aa6a9ca3f32a8d5542f75fe9b8bd972d87",
  "timestamp": "2024-08-22T15:54:52.013Z",
  "data": {
    "deviceId": "cllzcbw0t00016g7dfua590dd",
    "workspaceId": "cllzcf9xe00066g7dcsxyq1e5",
    "organizationId": "cm6y391is00000cjlea9361ht",
    "updatedAt": "2024-08-22T15:54:52.013Z",
    "createdAt": "2024-08-22T15:54:52.013Z",
    "manufacturer": {
      "slug": "tesla",
      "displayName": "Tesla"
    },
    "deviceModel": {
      "slug": "tesla:powerwall",
      "displayName": "Powerwall"
    },
    "deviceType": "battery",
    "tags": [
      "battery",
      "powerwall"
    ],
    "customer": {
      "id": "cllzcbw0t00016g7dfua590dd",
      "email": "bjones@texturehq.com",
      "firstName": "Bob",
      "lastName": "Jones",
      "phone": "+15551234567"
    },
    "site": {
      "id": "cllzcbw0t00016g7dfua590dd",
      "name": "Empire State Building",
      "address": {
        "streetAddress1": "20 W 34th St",
        "city": "New York",
        "state": "NY",
        "postalCode": "10118",
        "country": "US"
      },
      "longitude": -73.985428,
      "latitude": 40.748817
    },
    "state": {
      "id": "cltyhxpy406poq4z3zx19y2fs",
      "charge": 18069.15789473684,
      "chargePercentage": 59.30925587453832,
      "chargingState": "charging",
      "whConsumed": 0,
      "chargeRate": -2290,
      "backupReserve": 30,
      "gridStatus": "idle",
      "gridPower": 0,
      "gridEnergy": 0,
      "isStormModeEnabled": true,
      "isStormModeActive": false,
      "createdAt": "2024-03-19T14:55:10.493Z"
    }
  }
}
KeyDescription
deviceIdThe unique identifier for the device.
workspaceIdThe ID of the workspace associated with the device.
organizationIdThe ID of the organization associated with the device.
updatedAtThe timestamp when this update was created. This is the timestamp of the request the OEM's API returned, not necessarly the timestamp of when the state was actually updated on the device. For that see state.createdAt.
createdAtThe date and time when the device was created.
manufacturer.slugThe human-readable identifier of the manufacturer of the device.
manufacturer.displayNameThe display name of the manufacturer of the device.
deviceModel.slugThe human-readable identifier of the device model.
deviceModel.displayNameThe display name of the device model.
deviceTypeThe type of device (e.g. battery).
tagsAn array of tags associated with the device.
customer.idThe unique identifier for the customer associated with the device.
customer.referenceIdThe reference ID for the customer associated with the device.
customer.emailThe email address of the customer associated with the device.
customer.firstNameThe first name of the customer associated with the device.
customer.lastNameThe last name of the customer associated with the device.
customer.phoneThe phone number of the customer associated with the device.
site.idThe unique identifier for the site associated with the device.
site.nameThe name of the site associated with the device.
site.address.streetAddress1The first line of the street address of the site associated with the device.
site.address.streetAddress2The second line of the street address of the site associated with the device.
site.address.cityThe city of the site associated with the device.
site.address.stateThe state of the site associated with the device.
site.address.postalCodeThe postal code of the site associated with the device.
site.address.countryThe country of the site associated with the device.
site.longitudeThe longitude of the geographical coordinates of the site associated with the device.
site.latitudeThe latitude of the geographical coordinates of the site associated with the device.
stateAn object containing the current state of the device.
state.idUnique identifier for this state instance.
state.chargeThe current charge of the device in watt-hours.
state.chargePercentageThe current charge level as a percentage.
state.chargingStateThe current charging status of the device.
state.whConsumedThe watt-hours consumed by the device.
state.chargeRateThe rate at which the device is charging or discharging.
state.backupReserveThe percentage of charge reserved for backup.
state.gridStatusThe current status of the grid connection.
state.gridPowerThe power currently drawn from or supplied to the grid.
state.gridEnergyThe energy exchanged with the grid.
state.createdAtThe timestamp when this state update occurred (which may be different than the event timestamp if the state was batched and sent slightly delayed which is the case for some OEMs).
note

Device-Specific State Data

The state object varies by device type. For example, a battery will have different state data than an inverter. See our Data Models documentation for detailed information about device-specific state structures.

Most device update events are triggered from device state updates, which typically occur on 5 or 15-minute intervals. We're continuously working to provide tighter interval telemetry data and enhanced filtering capabilities.

Device Disconnected

Fired whenever a device disconnects from the Texture platform.

{
  "type": "device.disconnected",
  "version": "1.0.0",
  "key": "cc0e387d55ab78fb204c5c2225eff0aa6a9ca3f32a8d5542f75fe9b8bd972d87",
  "timestamp": "2024-08-22T15:54:52.013Z",
  "data": {
    "deviceId": "cllzcbw0t00016g7dfua590dd",
    "workspaceId": "cllzcf9xe00066g7dcsxyq1e5",
    "organizationId": "cm6y391is00000cjlea9361ht",
    "updatedAt": "2024-08-22T15:54:52.013Z",
    "createdAt": "2024-08-22T15:54:52.013Z",
    "manufacturer": {
      "slug": "tesla",
      "displayName": "Tesla"
    },
    "deviceModel": {
      "slug": "tesla:powerwall",
      "displayName": "Powerwall"
    },
    "deviceType": "battery",
    "tags": [
      "battery",
      "powerwall"
    ],
    "customer": {
      "id": "cllzcbw0t00016g7dfua590dd",
      "email": "bjones@texturehq.com",
      "firstName": "Bob",
      "lastName": "Jones",
      "phone": "+15551234567"
    },
    "site": {
      "id": "cllzcbw0t00016g7dfua590dd",
      "name": "Empire State Building",
      "address": {
        "streetAddress1": "20 W 34th St",
        "city": "New York",
        "state": "NY",
        "postalCode": "10118",
        "country": "US"
      },
      "longitude": -73.985428,
      "latitude": 40.748817
    }
  }
}
KeyDescription
deviceIdThe unique identifier for the device.
workspaceIdThe ID of the workspace associated with the device.
organizationIdThe ID of the organization associated with the device.
updatedAtThe timestamp when this update was created. This is the timestamp of the request the OEM's API returned, not necessarly the timestamp of when the state was actually updated on the device. For that see state.createdAt.
createdAtThe date and time when the device was created.
manufacturer.slugThe human-readable identifier of the manufacturer of the device.
manufacturer.displayNameThe display name of the manufacturer of the device.
deviceModel.slugThe human-readable identifier of the device model.
deviceModel.displayNameThe display name of the device model.
deviceTypeThe type of device (e.g. battery).
tagsAn array of tags associated with the device.
customer.idThe unique identifier for the customer associated with the device.
customer.referenceIdThe reference ID for the customer associated with the device.
customer.emailThe email address of the customer associated with the device.
customer.firstNameThe first name of the customer associated with the device.
customer.lastNameThe last name of the customer associated with the device.
customer.phoneThe phone number of the customer associated with the device.
site.idThe unique identifier for the site associated with the device.
site.nameThe name of the site associated with the device.
site.address.streetAddress1The first line of the street address of the site associated with the device.
site.address.streetAddress2The second line of the street address of the site associated with the device.
site.address.cityThe city of the site associated with the device.
site.address.stateThe state of the site associated with the device.
site.address.postalCodeThe postal code of the site associated with the device.
site.address.countryThe country of the site associated with the device.
site.longitudeThe longitude of the geographical coordinates of the site associated with the device.
site.latitudeThe latitude of the geographical coordinates of the site associated with the device.

Enrollment Approved

Fired whenever an enrollment is approved.

caution

Grid Services Required

This event is only available for organizations that have opted in to Grid Services. If you're interested in Grid Services, please reach out to our team.

{
  "type": "enrollment.approved",
  "version": "0.0.1",
  "key": "8f7d3b2e1a9c6f4e0d5b8a7c2e1f3d5b8a7c2e1f3d5b8a7c2e1f3d5b8a7c2e1f",
  "timestamp": "2024-03-20T14:30:00Z",
  "data": {
    "workspaceId": "clm2n3o4p5q6r7s8t9u0v1w2x",
    "organizationId": "cla1b2c3d4e5f6g7h8i9j0k1l",
    "customer": {
      "id": "cm3excw3h000008jsdjqm42lc",
      "workspaceId": "cm3exhlu0000008mb7j2gay6m",
      "organizationId": "cm3exhssc000108mbcjbi5x8r",
      "email": "jdoe@aol.com",
      "firstName": "Jane",
      "lastName": "Doe",
      "referenceId": "cust-123456-abcdef",
      "updatedAt": "2024-03-20T14:30:00Z",
      "createdAt": "2024-03-20T14:30:00Z"
    },
    "program": {
      "manager": "GridCo Energy Services"
    }
  }
}
KeyDescription
workspaceIdThe ID of the workspace associated with the enrollment.
organizationIdThe ID of the organization associated with the enrollment.
customer.idThe ID of the customer associated with the enrollment.
customer.workspaceIdThe ID of the workspace associated with the customer.
customer.organizationIdThe ID of the organization associated with the customer.
customer.emailThe email address of the customer.
customer.phoneThe phone number of the customer.
customer.firstNameThe first name of the customer.
customer.lastNameThe last name of the customer.
customer.referenceIdThe reference ID for the customer.
customer.updatedAtThe date and time when the customer was last updated.
customer.createdAtThe date and time when the customer was created.
program.managerThe manager of the program associated with the enrollment.

Site Created

Fired whenever a site is created on the Texture platform.

{
  "type": "site.created",
  "version": "0.0.1",
  "key": "cc0e387d55ab78fb204c5c2225eff0aa6a9ca3f32a8d5542f75fe9b8bd972d87",
  "timestamp": "2024-08-22T15:54:52.013Z",
  "data": {
    "id": "cllzcbw0t00016g7dfua590dd",
    "workspaceId": "cllzcf9xe00066g7dcsxyq1e5",
    "referenceId": "user-123456",
    "updatedAt": "2024-08-22T15:54:52.013Z",
    "createdAt": "2024-08-22T15:54:52.013Z",
    "siteName": "Empire State Building",
    "location": {
      "longitude": -73.985428,
      "latitude": 40.748817
    }
  }
}
KeyDescription
idThe unique identifier for the site.
workspaceIdThe ID of the workspace associated with the site.
referenceIdThe reference ID for the site.
siteNameThe name of the site.
updatedAtThe date and time when the site was last updated.
createdAtThe date and time when the site was created.
location.latitudeThe latitiude of the geographical coordinates of the site.
location.longitudeThe longitude of the geographical coordinates of the site.

Event Processing and Integration

Webhook Delivery

Events are delivered via webhooks to your configured destinations. Each destination can be configured with:

  • Event Type Filters — Specify which event types to receive
  • Device Type Filters — Filter events by specific device types
  • Custom Headers — Add authentication or custom headers
  • Retry Logic — Automatic retry for failed deliveries
caution

Webhook Reliability

Ensure your webhook endpoints are highly available and respond quickly (within 10 seconds). Texture will retry failed deliveries, but persistent failures may result in event loss. Monitor your webhook health in the Dashboard.

Event Deduplication

Each event includes a unique key property that's a hash of the event data. This enables:

  • Duplicate Detection — Avoid processing the same event multiple times
  • Reliable Processing — Ensure idempotent event handling
  • Audit Trail — Maintain complete event history

Integration Patterns

Common integration patterns include:

  • Real-Time Dashboards — Display live system status and activity
  • Automated Alerts — Trigger notifications for critical events
  • Workflow Automation — Execute actions based on event triggers
  • Data Synchronization — Keep external systems updated with platform changes

Best Practices

  • Handle Event Ordering — Events may arrive out of order; design your handlers accordingly
tip

Event Ordering Strategy

Use the event timestamp field for ordering when sequence matters. For critical workflows, consider implementing a simple queue or using the event key for deduplication to ensure reliable processing.

  • Implement Idempotency — Use the event key to prevent duplicate processing
  • Monitor Webhook Health — Track delivery success rates and response times
  • Plan for Event Volume — Design your systems to handle expected event frequency
  • Test Event Handling — Validate your event processing logic with test events
  • Monitor Event Latency — Track time from event occurrence to processing

Next Steps

  • Configure Destinations — Set up webhook endpoints to receive events
  • Implement Event Handlers — Build logic to process and respond to events
  • Monitor Event Activity — Use the Dashboard to track event delivery and processing
  • Explore Advanced Filtering — Configure device-specific and event-type filtering

Events provide the real-time foundation for monitoring, automation, and integration across your energy infrastructure in Texture.


note

Expanding Event Types

We're continually adding more event types as we build out the Texture platform. If there's an event type you'd like to see, please let us know!