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 Type | Description | Trigger |
---|---|---|
customer.created | New customer created on the platform | Customer registration |
command.failed | Command execution failed | Command failure |
command.succeeded | Command execution succeeded | Command completion |
device.discovered | New device connected to platform | Device connection |
device.updated | Device data updated | Device state change |
device.disconnected | Device disconnected from platform | Device disconnection |
enrollment.approved | Program enrollment approved | Enrollment approval |
site.created | New site created on platform | Site 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" } }
Key | Description |
---|---|
id | The unique identifier for the customer. |
workspaceId | The ID of the workspace associated with the customer. |
referenceId | The reference ID for the customer. |
organizationId | The ID of the organization associated with the customer. |
updatedAt | The date and time when the customer was last updated. |
createdAt | The date and time when the customer was created. |
email | The email address of the customer. |
firstName | The first name of the customer. |
lastName | The last name of the customer. |
phone | The 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" } }
Key | Description |
---|---|
workspaceId | The ID of the workspace associated with the command. |
commandId | The unique identifier for the command. |
deviceId | The ID of the device on which the command was executed. |
error.message | The error that occurred. |
issuedAt | The date and time when the command was issued. |
executedAt | The 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" } }
Key | Description |
---|---|
workspaceId | The ID of the workspace associated with the command. |
commandId | The unique identifier for the command. |
deviceId | The ID of the device on which the command was executed. |
issuedAt | The date and time when the command was issued. |
executedAt | The 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 } } }
Key | Description |
---|---|
deviceId | The unique identifier for the device. |
workspaceId | The ID of the workspace associated with the device. |
organizationId | The ID of the organization associated with the device. |
updatedAt | The 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. |
createdAt | The date and time when the device was created. |
manufacturer.slug | The human-readable identifier of the manufacturer of the device. |
manufacturer.displayName | The display name of the manufacturer of the device. |
deviceModel.slug | The human-readable identifier of the device model. |
deviceModel.displayName | The display name of the device model. |
deviceType | The type of device (e.g. battery). |
tags | An array of tags associated with the device. |
customer.id | The unique identifier for the customer associated with the device. |
customer.referenceId | The reference ID for the customer associated with the device. |
customer.email | The email address of the customer associated with the device. |
customer.firstName | The first name of the customer associated with the device. |
customer.lastName | The last name of the customer associated with the device. |
customer.phone | The phone number of the customer associated with the device. |
site.id | The unique identifier for the site associated with the device. |
site.name | The name of the site associated with the device. |
site.address.streetAddress1 | The first line of the street address of the site associated with the device. |
site.address.streetAddress2 | The second line of the street address of the site associated with the device. |
site.address.city | The city of the site associated with the device. |
site.address.state | The state of the site associated with the device. |
site.address.postalCode | The postal code of the site associated with the device. |
site.address.country | The country of the site associated with the device. |
site.longitude | The longitude of the geographical coordinates of the site associated with the device. |
site.latitude | The latitude of the geographical coordinates of the site associated with the device. |
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" } } }
Key | Description |
---|---|
deviceId | The unique identifier for the device. |
workspaceId | The ID of the workspace associated with the device. |
organizationId | The ID of the organization associated with the device. |
updatedAt | The 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. |
createdAt | The date and time when the device was created. |
manufacturer.slug | The human-readable identifier of the manufacturer of the device. |
manufacturer.displayName | The display name of the manufacturer of the device. |
deviceModel.slug | The human-readable identifier of the device model. |
deviceModel.displayName | The display name of the device model. |
deviceType | The type of device (e.g. battery). |
tags | An array of tags associated with the device. |
customer.id | The unique identifier for the customer associated with the device. |
customer.referenceId | The reference ID for the customer associated with the device. |
customer.email | The email address of the customer associated with the device. |
customer.firstName | The first name of the customer associated with the device. |
customer.lastName | The last name of the customer associated with the device. |
customer.phone | The phone number of the customer associated with the device. |
site.id | The unique identifier for the site associated with the device. |
site.name | The name of the site associated with the device. |
site.address.streetAddress1 | The first line of the street address of the site associated with the device. |
site.address.streetAddress2 | The second line of the street address of the site associated with the device. |
site.address.city | The city of the site associated with the device. |
site.address.state | The state of the site associated with the device. |
site.address.postalCode | The postal code of the site associated with the device. |
site.address.country | The country of the site associated with the device. |
site.longitude | The longitude of the geographical coordinates of the site associated with the device. |
site.latitude | The latitude of the geographical coordinates of the site associated with the device. |
state | An object containing the current state of the device. |
state.id | Unique identifier for this state instance. |
state.charge | The current charge of the device in watt-hours. |
state.chargePercentage | The current charge level as a percentage. |
state.chargingState | The current charging status of the device. |
state.whConsumed | The watt-hours consumed by the device. |
state.chargeRate | The rate at which the device is charging or discharging. |
state.backupReserve | The percentage of charge reserved for backup. |
state.gridStatus | The current status of the grid connection. |
state.gridPower | The power currently drawn from or supplied to the grid. |
state.gridEnergy | The energy exchanged with the grid. |
state.createdAt | The 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). |
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 } } }
Key | Description |
---|---|
deviceId | The unique identifier for the device. |
workspaceId | The ID of the workspace associated with the device. |
organizationId | The ID of the organization associated with the device. |
updatedAt | The 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. |
createdAt | The date and time when the device was created. |
manufacturer.slug | The human-readable identifier of the manufacturer of the device. |
manufacturer.displayName | The display name of the manufacturer of the device. |
deviceModel.slug | The human-readable identifier of the device model. |
deviceModel.displayName | The display name of the device model. |
deviceType | The type of device (e.g. battery). |
tags | An array of tags associated with the device. |
customer.id | The unique identifier for the customer associated with the device. |
customer.referenceId | The reference ID for the customer associated with the device. |
customer.email | The email address of the customer associated with the device. |
customer.firstName | The first name of the customer associated with the device. |
customer.lastName | The last name of the customer associated with the device. |
customer.phone | The phone number of the customer associated with the device. |
site.id | The unique identifier for the site associated with the device. |
site.name | The name of the site associated with the device. |
site.address.streetAddress1 | The first line of the street address of the site associated with the device. |
site.address.streetAddress2 | The second line of the street address of the site associated with the device. |
site.address.city | The city of the site associated with the device. |
site.address.state | The state of the site associated with the device. |
site.address.postalCode | The postal code of the site associated with the device. |
site.address.country | The country of the site associated with the device. |
site.longitude | The longitude of the geographical coordinates of the site associated with the device. |
site.latitude | The latitude of the geographical coordinates of the site associated with the device. |
Enrollment Approved
Fired whenever an enrollment is approved.
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" } } }
Key | Description |
---|---|
workspaceId | The ID of the workspace associated with the enrollment. |
organizationId | The ID of the organization associated with the enrollment. |
customer.id | The ID of the customer associated with the enrollment. |
customer.workspaceId | The ID of the workspace associated with the customer. |
customer.organizationId | The ID of the organization associated with the customer. |
customer.email | The email address of the customer. |
customer.phone | The phone number of the customer. |
customer.firstName | The first name of the customer. |
customer.lastName | The last name of the customer. |
customer.referenceId | The reference ID for the customer. |
customer.updatedAt | The date and time when the customer was last updated. |
customer.createdAt | The date and time when the customer was created. |
program.manager | The 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 } } }
Key | Description |
---|---|
id | The unique identifier for the site. |
workspaceId | The ID of the workspace associated with the site. |
referenceId | The reference ID for the site. |
siteName | The name of the site. |
updatedAt | The date and time when the site was last updated. |
createdAt | The date and time when the site was created. |
location.latitude | The latitiude of the geographical coordinates of the site. |
location.longitude | The 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
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
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.
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!