Overview
Toolio now supports email notifications for Data Alerts, allowing users to receive real-time email alerts when importer or integration issues occur. Previously, Data Alerts were only visible within the Toolio application itself - requiring users to log in and check the Data Alerts panel or Import History page. With this release, technical team members and stakeholders who may not be actively working in Toolio can stay informed about data pipeline issues without needing to monitor the application directly.
Subscribing to Email Notifications
Users can manage their notification subscriptions from the Settings area within Toolio:
Navigate to Settings > Organization Settings > Notifications > Subscriptions
Click to create a new subscription
Select the notification channel (Email or Webhook)
Choose which event types to subscribe to
Save the subscription
Once subscribed, the user will receive an email each time the selected alert type is triggered for their tenant.
There are also 2 methods of notification delivery (more details below):
Channel | Description |
Sends alert notifications directly to the subscribed user's email address. | |
Webhook | Sends alert payloads to a configured webhook endpoint for programmatic consumption. |
Supported Alert Event Types
The following event types are available for subscription:
Event Type | Description |
IMPORT_JOB_FAILED | Triggered when a data import does not complete successfully. |
IMPORT_JOB_MISSING | Triggered when a recent expected import is not found. (Trigger threshold configured via Missing Import Alerts) |
INTEGRATION_FAILED | Triggered when there is a connection issue with an integration (e.g., Shopify). |
IMPORT_JOB_STARTED | Triggered when a data import job begins processing. |
IMPORT_JOB_COMPLETED | Triggered when a data import job finishes processing successfully. |
IMPORT_JOB_COMPLETED_WITH_ERRORS | Triggered when a data import job finishes processing successfully, but there are unsuccessful line items from the job. |
You can simply define any email(s) you'd like to deliver notifications to in the configuration menu.
Notification emails are sent with the following subject line format:
Toolio Report: [EVENT_TYPE] Context - Error Type - Date
For example:
Toolio Report: [IMPORT_JOB_MISSING] Sale - Missing Import - 2026-01-28
The email body includes:
The alert details (event type, context, and error information)
A direct link to the Data Alerts view inside Toolio — the same view a user would see by navigating to Data Alerts within the application
Webhook
Webhook-specific config requires:
urlmust be a valid URIheadersare optional
If headers are configured, they are forwarded on the outbound webhook request:
{
"url": "https://hooks.example.com/toolio",
"headers": {
"Authorization": "12345",
"Tenant": "demo"
}
}
Webhook Event Payloads
When an event fires, Toolio sends an HTTP POST with a JSON body to your configured webhook URL. Your endpoint should respond with a 2xx status to acknowledge receipt.
Envelope Fields
Every webhook payload shares the same top-level structure:
Field | Type | Required | Description |
eventType | string | Yes | The event that triggered this delivery |
eventOccurredAt | integer | Yes | Unix timestamp in milliseconds when the event occurred |
payload | object | Yes | Event-specific data (see each event below) |
IMPORT_JOB_FAILED
Triggered when a data import job encounters a fatal error and cannot finish processing.
Channels: Email, Webhook, In-App
Payload Fields
Field | Type | Required | Description |
integration | string | Yes | Source system name (e.g. Shopify, Cin7) |
resource | string | Yes | The resource type being imported (e.g. Sale, Product) |
importer | string | Yes | Internal importer configuration name |
filename | string | Yes | Name of the uploaded file |
status | string | Yes | Always "failed" for this event |
lineCount | integer | No | Total number of lines in the file |
skippedLineCount | integer | No | Lines skipped during processing |
errorCount | integer | No | Number of lines that encountered errors |
message | string | No | Human-readable description of the failure reason |
uploadedAt | datetime | No | ISO 8601 — when the file was uploaded |
startedAt | datetime | No | ISO 8601 — when processing began |
finishedAt | datetime | No | ISO 8601 — when processing ended |
Example
{ "eventType": "IMPORT_JOB_FAILED", "eventOccurredAt": 1706500800000, "payload": { "integration": "Shopify", "resource": "Sale", "importer": "shopify_sales_daily", "filename": "sales_2026-01-28.csv", "status": "failed", "lineCount": 15230, "skippedLineCount": 0, "errorCount": 47, "message": "Column mismatch: expected 12 columns, found 11 on line 482", "uploadedAt": "2026-01-28T06:00:00.000Z", "startedAt": "2026-01-28T06:01:12.000Z", "finishedAt": "2026-01-28T06:03:45.000Z" } }IMPORT_JOB_MISSING
Triggered when Toolio expected a scheduled import to arrive but it was not received within the configured window.
Channels: Email, Webhook, In-App
Payload Fields
Field | Type | Required | Description |
resource | string | Yes | The resource type that was expected but not received |
Example
{ "eventType": "IMPORT_JOB_MISSING", "eventOccurredAt": 1706500800000, "payload": { "resource": "Sale" } }IMPORT_JOB_STARTED
Sent as soon as Toolio starts processing an uploaded file.
Channels: Email, Webhook
Payload Fields
Field | Type | Required | Description |
integration | string | Yes | Source system name |
resource | string | Yes | The resource type being imported |
importer | string | Yes | Internal importer configuration name |
filename | string | Yes | Name of the uploaded file |
status | string | Yes | Always "processing" for this event |
lineCount | integer | No | Total number of lines in the file |
uploadedAt | datetime | No | ISO 8601 — when the file was uploaded |
startedAt | datetime | No | ISO 8601 — when processing began |
Example
{ "eventType": "IMPORT_JOB_STARTED", "eventOccurredAt": 1706500800000, "payload": { "integration": "Cin7", "resource": "Product", "importer": "cin7_products", "filename": "products_2026-01-28.csv", "status": "processing", "lineCount": 8421, "uploadedAt": "2026-01-28T06:00:00.000Z", "startedAt": "2026-01-28T06:01:05.000Z" } }IMPORT_JOB_COMPLETED
Sent when all rows in the uploaded file were processed without any errors.
Channels: Email, Webhook
Payload Fields
Field | Type | Required | Description |
integration | string | Yes | Source system name |
resource | string | Yes | The resource type imported |
importer | string | Yes | Internal importer configuration name |
filename | string | Yes | Name of the uploaded file |
status | string | Yes | Always "completed" for this event |
lineCount | integer | No | Total number of lines in the file |
skippedLineCount | integer | No | Lines intentionally skipped during processing |
uploadedAt | datetime | No | ISO 8601 — when the file was uploaded |
startedAt | datetime | No | ISO 8601 — when processing began |
finishedAt | datetime | No | ISO 8601 — when processing completed |
Example
{ "eventType": "IMPORT_JOB_COMPLETED", "eventOccurredAt": 1706500800000, "payload": { "integration": "Cin7", "resource": "Product", "importer": "cin7_products", "filename": "products_2026-01-28.csv", "status": "completed", "lineCount": 8421, "skippedLineCount": 3, "uploadedAt": "2026-01-28T06:00:00.000Z", "startedAt": "2026-01-28T06:01:05.000Z", "finishedAt": "2026-01-28T06:04:32.000Z" } }IMPORT_JOB_COMPLETED_WITH_ERRORS
Triggered when an import job completes but one or more rows failed validation or processing. The job is considered complete — partial data may have been imported.
Channels: Email, Webhook
Payload Fields
Field | Type | Required | Description |
integration | string | Yes | Source system name |
resource | string | Yes | The resource type being imported |
importer | string | Yes | Internal importer configuration name |
filename | string | Yes | Name of the uploaded file |
status | string | Yes | Always "completed_with_errors" for this event |
lineCount | integer | No | Total number of lines in the file |
skippedLineCount | integer | No | Lines skipped during processing |
errorCount | integer | No | Number of rows that failed |
message | string | No | Summary of what went wrong |
uploadedAt | datetime | No | ISO 8601 — when the file was uploaded |
startedAt | datetime | No | ISO 8601 — when processing began |
finishedAt | datetime | No | ISO 8601 — when processing ended |
Example
{ "eventType": "IMPORT_JOB_COMPLETED_WITH_ERRORS", "eventOccurredAt": 1706500800000, "payload": { "integration": "Shopify", "resource": "Sale", "importer": "shopify_sales_daily", "filename": "sales_2026-01-28.csv", "status": "completed_with_errors", "lineCount": 15230, "skippedLineCount": 12, "errorCount": 5, "message": "5 rows failed validation", "uploadedAt": "2026-01-28T06:00:00.000Z", "startedAt": "2026-01-28T06:01:12.000Z", "finishedAt": "2026-01-28T06:03:45.000Z" } }INTEGRATION_FAILED
Sent when Toolio encounters an error communicating with a connected external system. Use activityId to look up the specific activity in your integration logs.
Channels: Email, Webhook, In-App
Payload Fields
Field | Type | Required | Description |
integration | string | Yes | The integration that failed (e.g. Shopify) |
resource | string | Yes | The resource associated with the failure |
activityId | integer | No | Integration activity ID for cross-referencing logs (nullable) |
Example
{ "eventType": "INTEGRATION_FAILED", "eventOccurredAt": 1706500800000, "payload": { "integration": "Shopify", "resource": "Sale", "activityId": 9812 } }


