Plugin Runtime & Data
PluginDataStore, PluginExecutionLog, and PluginWebhookSubscription — the three entities powering plugin data persistence, execution monitoring, and event subscription.
Once a plugin is installed and active, three runtime entities handle its ongoing operation: PluginDataStore for persisting plugin state, PluginExecutionLog for monitoring API call health, and PluginWebhookSubscription for receiving platform events.
PluginDataStore Entity
Key-value data store entry scoped to a plugin installation and tenant. Plugins use this to persist arbitrary JSON data organized by namespace and key. Tracks the serialized size for quota enforcement.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Primary key |
| PluginInstallationId | Guid | FK to the plugin installation that owns this data entry |
| TenantId | Guid | Tenant scope — ensures strict data isolation between tenants |
| Namespace | string | Logical grouping for keys (e.g. "config", "cache", "state") |
| Key | string | Key within the namespace (unique per installation + namespace + key) |
| ValueJson | string | Serialized JSON value (default: "{}") |
| ValueSizeBytes | long | Byte size of ValueJson for quota enforcement |
PluginExecutionLog Entity
Immutable audit log entry recording a single plugin API execution. Captures the HTTP method, endpoint, response status code, duration in milliseconds, and success/failure status. Used for monitoring plugin health and debugging.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Primary key |
| PluginInstallationId | Guid | FK to the installation that made this API call |
| TenantId | Guid | Tenant context for this log entry |
| Endpoint | string | API endpoint path that was called (e.g. "/api/v1/plugin-api/v1/data/...") |
| HttpMethod | string | HTTP method used (GET, POST, PUT, DELETE) |
| HttpStatusCode | int? | HTTP response status code returned (null if request never completed) |
| DurationMs | int | Total round-trip duration of the API call in milliseconds |
| IsSuccess | bool | Whether the call completed with a 2xx status code |
| ErrorMessage | string? | Error description if the call failed (null on success) |
| ExecutedAt | DateTime | UTC timestamp when this API call was executed (default: DateTime.UtcNow) |
PluginWebhookSubscription Entity
Represents a webhook subscription registered by a plugin installation. When the specified platform event type fires, the system dispatches an HTTP POST to the callback URL. Subscriptions can be deactivated (IsActive=false) without deletion.
| Field | Type | Description |
|---|---|---|
| Id | Guid | Primary key |
| PluginInstallationId | Guid | FK to the installation registering this subscription |
| TenantId | Guid | Tenant scope for this subscription |
| EventType | string | Platform event type to listen for (e.g. "user.created", "tenant.updated") |
| CallbackUrl | string | HTTPS URL that receives HTTP POST payloads when the event fires |
| IsActive | bool | Whether this subscription is active and will receive deliveries (default: true) |
Webhook Delivery Flow
The platform uses an outbox pattern for reliable webhook delivery. Events are first written to the outbox, then delivered asynchronously to the plugin's CallbackUrl with exponential backoff retries.