Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

23 KiB

Workflow Event Catalog v2 — Domain Event Proposals

This is a proposal/backlog of business-relevant events to add to the Workflow Event Catalog (v2), derived from the NX “domain layer” packages (tickets, clients/contacts, billing, projects, scheduling, documents, integrations, etc).

  • event_type: SCREAMING_SNAKE_CASE (matches existing catalog entries).
  • category: user-facing module grouping used by the catalog UI (Tickets, Billing, Projects, CRM, Email Processing, Integrations, Documents, etc).
  • Payload:
    • Include tenantId on all tenant-scoped events.
    • Include an “actor” where meaningful: actorUserId (staff), actorContactId (client), plus actorType when ambiguous.
    • For state transitions, include previousX / newX.
    • For “entity changed” events, include a normalized changes object (or updatedFields[]).
  • payload_schema_ref naming: payload.<PascalEventName>.v1 (example: payload.TicketStatusChanged.v1).

Already present (avoid duplicating)

Found in code/migrations:

  • COMPANY_CREATED, COMPANY_UPDATED
  • TICKET_CREATED, TICKET_UPDATED, TICKET_CLOSED, TICKET_RESPONSE_STATE_CHANGED
  • PROJECT_CREATED
  • INVOICE_GENERATED, INVOICE_FINALIZED
  • INBOUND_EMAIL_RECEIVED
  • EMAIL_PROVIDER_CONNECTED, EMAIL_PROVIDER_DISCONNECTED

Proposed Events (by category)

Each entry is: event_typeName: Description (payload fields).

Tickets (packages/tickets)

  • TICKET_STATUS_CHANGEDTicket Status Changed: Ticket moved between statuses. (tenantId, ticketId, previousStatusId, newStatusId, actorUserId, changedAt, reason?)
  • TICKET_PRIORITY_CHANGEDTicket Priority Changed: Priority updated. (tenantId, ticketId, previousPriorityId, newPriorityId, actorUserId, changedAt, reason?)
  • TICKET_ASSIGNEDTicket Assigned: Assigned to an agent/team. (tenantId, ticketId, previousAssigneeId?, previousAssigneeType?, newAssigneeId, newAssigneeType, actorUserId, assignedAt)
  • TICKET_UNASSIGNEDTicket Unassigned: Unassigned from agent/team. (tenantId, ticketId, previousAssigneeId, previousAssigneeType, actorUserId, unassignedAt, reason?)
  • TICKET_REOPENEDTicket Reopened: Closed ticket reopened. (tenantId, ticketId, previousStatusId, newStatusId, actorUserId, reopenedAt, reason?)
  • TICKET_MERGEDTicket Merged: Ticket merged into another. (tenantId, sourceTicketId, targetTicketId, actorUserId, mergedAt, reason?)
  • TICKET_SPLITTicket Split: Ticket split into multiple tickets. (tenantId, originalTicketId, newTicketIds, actorUserId, splitAt, reason?)
  • TICKET_TAGS_CHANGEDTicket Tags Changed: Tags applied/removed on ticket. (tenantId, ticketId, addedTagIds?, removedTagIds?, actorUserId, changedAt)
  • TICKET_QUEUE_CHANGEDTicket Queue/Board Changed: Ticket moved between boards/queues. (tenantId, ticketId, previousBoardId?, newBoardId?, actorUserId, changedAt)
  • TICKET_ESCALATEDTicket Escalated: Escalated to higher tier/team/queue. (tenantId, ticketId, fromQueueId?, toQueueId?, actorUserId, escalatedAt, reason?)
  • TICKET_MESSAGE_ADDEDTicket Message Added: Any message/comment added (public/private). (tenantId, ticketId, messageId, visibility(public|internal), authorId, authorType(user|contact), channel(email|portal|ui|api), createdAt, attachmentsCount?)
  • TICKET_CUSTOMER_REPLIEDTicket Customer Replied: Customer reply received (portal/email). (tenantId, ticketId, messageId, contactId, channel, receivedAt, attachmentsCount?)
  • TICKET_INTERNAL_NOTE_ADDEDTicket Internal Note Added: Internal/private note added. (tenantId, ticketId, noteId, actorUserId, createdAt)
  • TICKET_TIME_ENTRY_ADDEDTicket Time Entry Added: Time logged against ticket. (tenantId, ticketId, timeEntryId, actorUserId, minutes, billable, createdAt)

SLA-focused (high-value automation triggers):

  • TICKET_SLA_STAGE_ENTEREDTicket SLA Stage Entered: SLA stage started. (tenantId, ticketId, slaPolicyId, stage(response|resolution|custom), enteredAt, targetAt)
  • TICKET_SLA_STAGE_METTicket SLA Stage Met: SLA met. (tenantId, ticketId, slaPolicyId, stage, metAt, targetAt)
  • TICKET_SLA_STAGE_BREACHEDTicket SLA Stage Breached: SLA breached. (tenantId, ticketId, slaPolicyId, stage, breachedAt, targetAt, overdueBySeconds)

Approvals/escalations (optional but workflow-friendly):

  • TICKET_APPROVAL_REQUESTEDTicket Approval Requested: Request approval (access/spend/change). (tenantId, ticketId, approvalRequestId, approvalType, requestedByUserId, requestedAt, notes?)
  • TICKET_APPROVAL_GRANTEDTicket Approval Granted: Approval granted. (tenantId, ticketId, approvalRequestId, approvedByUserId, approvedAt, conditions?)
  • TICKET_APPROVAL_REJECTEDTicket Approval Rejected: Approval rejected. (tenantId, ticketId, approvalRequestId, rejectedByUserId, rejectedAt, reason?)

Scheduling (packages/scheduling)

  • APPOINTMENT_CREATEDAppointment Created: Appointment scheduled (often tied to a ticket). (tenantId, appointmentId, ticketId?, startAt, endAt, timezone, assigneeId?, assigneeType?, createdByUserId, createdAt, location?)
  • APPOINTMENT_RESCHEDULEDAppointment Rescheduled: Time changed. (tenantId, appointmentId, ticketId?, previousStartAt, previousEndAt, newStartAt, newEndAt, timezone, actorUserId, rescheduledAt, reason?)
  • APPOINTMENT_CANCELEDAppointment Canceled: Appointment canceled. (tenantId, appointmentId, ticketId?, actorUserId, canceledAt, reason?)
  • APPOINTMENT_COMPLETEDAppointment Completed: Marked completed. (tenantId, appointmentId, ticketId?, actorUserId, completedAt, outcome?)
  • APPOINTMENT_NO_SHOWAppointment No-Show: No-show recorded. (tenantId, appointmentId, ticketId?, actorUserId, markedAt, party(customer|agent))
  • APPOINTMENT_ASSIGNEDAppointment Assigned: Assigned/reassigned to an agent/team. (tenantId, appointmentId, ticketId?, previousAssigneeId?, previousAssigneeType?, newAssigneeId, newAssigneeType, actorUserId, assignedAt)
  • SCHEDULE_BLOCK_CREATEDSchedule Block Created: Availability block created. (tenantId, scheduleBlockId, ownerId, ownerType(user|team), startAt, endAt, timezone, actorUserId, createdAt, reason?)
  • SCHEDULE_BLOCK_DELETEDSchedule Block Deleted: Availability block removed. (tenantId, scheduleBlockId, actorUserId, deletedAt, reason?)
  • CAPACITY_THRESHOLD_REACHEDCapacity Threshold Reached: Team/day capacity threshold hit. (tenantId, teamId, date, capacityLimit, currentBooked, triggeredAt)

Field ops (optional, if supported in product):

  • TECHNICIAN_DISPATCHEDTechnician Dispatched: Dispatch action taken. (tenantId, appointmentId, ticketId?, technicianUserId, dispatchedByUserId, dispatchedAt)
  • TECHNICIAN_EN_ROUTETechnician En Route: En route status update. (tenantId, appointmentId, ticketId?, technicianUserId, startedAt, eta?)
  • TECHNICIAN_ARRIVEDTechnician Arrived: Arrival recorded. (tenantId, appointmentId, ticketId?, technicianUserId, arrivedAt, location?)
  • TECHNICIAN_CHECKED_OUTTechnician Checked Out: Completed onsite work. (tenantId, appointmentId, ticketId?, technicianUserId, checkedOutAt, workSummary?)

Projects (packages/projects)

  • PROJECT_UPDATEDProject Updated: Project fields changed. (tenantId, projectId, actorUserId, updatedAt, updatedFields?, changes?)
  • PROJECT_STATUS_CHANGEDProject Status Changed: Project status transition. (tenantId, projectId, previousStatus, newStatus, actorUserId, changedAt)
  • PROJECT_TASK_CREATEDProject Task Created: Task added. (tenantId, taskId, projectId, createdByUserId, createdAt, title, dueDate?, status)
  • PROJECT_TASK_ASSIGNEDProject Task Assigned: Task assigned to user/team. (tenantId, taskId, projectId, assignedToId, assignedToType(user|team), assignedByUserId, assignedAt)
  • PROJECT_TASK_STATUS_CHANGEDProject Task Status Changed: Task status transition. (tenantId, taskId, projectId, previousStatus, newStatus, actorUserId, changedAt)
  • PROJECT_TASK_COMPLETEDProject Task Completed: Task completed. (tenantId, taskId, projectId, completedByUserId, completedAt)
  • PROJECT_TASK_DEPENDENCY_BLOCKEDProject Task Blocked: Dependency blocks progress. (tenantId, taskId, projectId, blockedByTaskId, blockedAt)
  • PROJECT_TASK_DEPENDENCY_UNBLOCKEDProject Task Unblocked: Dependency resolved. (tenantId, taskId, projectId, unblockedByTaskId, unblockedAt)

Project approvals (optional but high-value automations):

  • PROJECT_APPROVAL_REQUESTEDProject Approval Requested: Scope/budget/change approval request. (tenantId, approvalId, projectId, approvalType, requestedByUserId, requestedAt, notes?)
  • PROJECT_APPROVAL_GRANTEDProject Approval Granted: Approval granted. (tenantId, approvalId, projectId, approvalType, approvedByUserId, approvedAt, notes?)
  • PROJECT_APPROVAL_REJECTEDProject Approval Rejected: Approval rejected. (tenantId, approvalId, projectId, approvalType, rejectedByUserId, rejectedAt, reason?)

Billing (packages/billing)

Invoices and collections:

  • INVOICE_SENTInvoice Sent: Invoice delivered to customer. (tenantId, invoiceId, clientId/companyId, sentByUserId, sentAt, deliveryMethod(email|portal|print))
  • INVOICE_STATUS_CHANGEDInvoice Status Changed: Status transition (draft→sent→paid, etc). (tenantId, invoiceId, previousStatus, newStatus, actorUserId, changedAt)
  • INVOICE_DUE_DATE_CHANGEDInvoice Due Date Changed: Due date updated. (tenantId, invoiceId, previousDueDate, newDueDate, actorUserId, changedAt)
  • INVOICE_OVERDUEInvoice Overdue: Invoice became overdue. (tenantId, invoiceId, clientId/companyId, overdueAt, dueDate, amountDue, currency, daysOverdue)
  • INVOICE_WRITTEN_OFFInvoice Written Off: Invoice written off. (tenantId, invoiceId, actorUserId, writtenOffAt, amountWrittenOff, currency, reason?)

Payments:

  • PAYMENT_RECORDEDPayment Recorded: Payment created/recorded. (tenantId, paymentId, clientId/companyId, receivedAt, amount, currency, method, receivedByUserId?, gatewayTransactionId?)
  • PAYMENT_APPLIEDPayment Applied: Payment applied to invoices. (tenantId, paymentId, appliedAt, appliedByUserId, applications[{invoiceId, amountApplied}])
  • PAYMENT_FAILEDPayment Failed: Payment attempt failed. (tenantId, paymentId?, invoiceId?, clientId/companyId, failedAt, amount, currency, method, failureCode?, failureMessage?, retryable?)
  • PAYMENT_REFUNDEDPayment Refunded: Refund issued. (tenantId, paymentId, refundedAt, refundedByUserId, amount, currency, reason?)

Credits:

  • CREDIT_NOTE_CREATEDCredit Note Created: Credit issued. (tenantId, creditNoteId, clientId/companyId, createdByUserId, createdAt, amount, currency, status)
  • CREDIT_NOTE_APPLIEDCredit Note Applied: Credit applied to invoice. (tenantId, creditNoteId, invoiceId, appliedByUserId, appliedAt, amountApplied, currency)
  • CREDIT_NOTE_VOIDEDCredit Note Voided: Credit voided. (tenantId, creditNoteId, voidedByUserId, voidedAt, reason?)

Contracts / recurring:

  • CONTRACT_CREATEDContract Created: Client contract created. (tenantId, contractId, clientId, createdByUserId, createdAt, startDate?, endDate?, status?)
  • CONTRACT_UPDATEDContract Updated: Contract fields changed. (tenantId, contractId, clientId, actorUserId, updatedAt, updatedFields?, changes?)
  • CONTRACT_STATUS_CHANGEDContract Status Changed: Contract lifecycle change. (tenantId, contractId, clientId, previousStatus, newStatus, actorUserId, changedAt)
  • CONTRACT_RENEWAL_UPCOMINGContract Renewal Upcoming: Renewal is approaching. (tenantId, contractId, clientId, renewalAt, daysUntilRenewal)
  • RECURRING_BILLING_RUN_STARTEDRecurring Billing Run Started: Run begins. (tenantId, runId, scheduleId?, startedAt, initiatedByUserId?)
  • RECURRING_BILLING_RUN_COMPLETEDRecurring Billing Run Completed: Run completes. (tenantId, runId, completedAt, invoicesCreated, failedCount, warnings?)
  • RECURRING_BILLING_RUN_FAILEDRecurring Billing Run Failed: Run fails. (tenantId, runId, failedAt, errorCode?, errorMessage, retryable?)

CRM: Clients/Contacts/Interactions (packages/clients, packages/tags)

Clients:

  • CLIENT_CREATEDClient Created: Client/account created. (tenantId, clientId, clientName, createdByUserId, createdAt, status?)
  • CLIENT_UPDATEDClient Updated: Client fields changed. (tenantId, clientId, updatedByUserId, updatedAt, updatedFields?, changes?)
  • CLIENT_STATUS_CHANGEDClient Status Changed: Lifecycle status transition (prospect→active, etc). (tenantId, clientId, previousStatus, newStatus, actorUserId, changedAt)
  • CLIENT_OWNER_ASSIGNEDClient Owner Assigned: Account manager assigned/reassigned. (tenantId, clientId, previousOwnerUserId?, newOwnerUserId, assignedByUserId, assignedAt)
  • CLIENT_MERGEDClient Merged: Client merged into another. (tenantId, sourceClientId, targetClientId, mergedByUserId, mergedAt, strategy?)
  • CLIENT_ARCHIVEDClient Archived: Client archived/deactivated. (tenantId, clientId, archivedByUserId, archivedAt, reason?)

Contacts:

  • CONTACT_CREATEDContact Created: Contact added to client. (tenantId, contactId, clientId, fullName, email?, phoneNumber?, createdByUserId, createdAt)
  • CONTACT_UPDATEDContact Updated: Contact fields changed. (tenantId, contactId, clientId, updatedByUserId, updatedAt, updatedFields?, changes?)
  • CONTACT_PRIMARY_SETPrimary Contact Set: Contact set as client primary/billing. (tenantId, clientId, contactId, previousPrimaryContactId?, setByUserId, setAt)
  • CONTACT_ARCHIVEDContact Archived: Contact deactivated/archived. (tenantId, contactId, clientId, archivedByUserId, archivedAt, reason?)
  • CONTACT_MERGEDContact Merged: Contact merged into another. (tenantId, sourceContactId, targetContactId, mergedByUserId, mergedAt, strategy?)

Interactions/notes:

  • INTERACTION_LOGGEDInteraction Logged: CRM interaction recorded. (tenantId, interactionId, clientId, contactId?, interactionType, channel, occurredAt, loggedByUserId, subject?, outcome?)
  • NOTE_CREATEDNote Created: Note attached to client/contact. (tenantId, noteId, entityType(client|contact), entityId, createdByUserId, createdAt, visibility?, bodyPreview?)

Tags (consider generic, cross-entity):

  • TAG_DEFINITION_CREATEDTag Definition Created: New tag created. (tenantId, tagId, tagName, createdByUserId, createdAt)
  • TAG_DEFINITION_UPDATEDTag Definition Updated: Tag definition changed. (tenantId, tagId, previousName?, newName?, updatedByUserId, updatedAt)
  • TAG_APPLIEDTag Applied: Tag applied to entity. (tenantId, tagId, entityType, entityId, appliedByUserId, appliedAt)
  • TAG_REMOVEDTag Removed: Tag removed from entity. (tenantId, tagId, entityType, entityId, removedByUserId, removedAt)

Documents (packages/documents)

  • DOCUMENT_UPLOADEDDocument Uploaded: Document uploaded into storage. (tenantId, documentId, uploadedByUserId, uploadedAt, fileName, contentType, sizeBytes, storageKey)
  • DOCUMENT_DELETEDDocument Deleted: Document removed. (tenantId, documentId, deletedByUserId, deletedAt, reason?)
  • DOCUMENT_ASSOCIATEDDocument Associated: Document associated to an entity. (tenantId, documentId, entityType, entityId, associatedByUserId, associatedAt)
  • DOCUMENT_DETACHEDDocument Detached: Document association removed. (tenantId, documentId, entityType, entityId, detachedByUserId, detachedAt, reason?)
  • DOCUMENT_GENERATEDDocument Generated: System-generated document created (invoice/PDF/etc). (tenantId, documentId, sourceType, sourceId, generatedByUserId?, generatedAt, fileName)

If/when e-sign workflows exist:

  • DOCUMENT_SIGNATURE_REQUESTEDDocument Signature Requested: Signature requested. (tenantId, documentId, requestId, requestedByUserId, requestedAt, signers[{email, name?}], expiresAt?)
  • DOCUMENT_SIGNEDDocument Signed: Document fully signed. (tenantId, documentId, requestId, signedAt, signerEmail?, signerId?)
  • DOCUMENT_SIGNATURE_EXPIREDDocument Signature Expired: Signature request expired. (tenantId, documentId, requestId, expiredAt)

Email + Notifications + Surveys (packages/email, packages/notifications, packages/surveys)

Email lifecycle:

  • INBOUND_EMAIL_REPLY_RECEIVEDInbound Email Reply Received: Inbound email identified as reply to existing thread/ticket. (tenantId, messageId, threadId, ticketId?, from, to[], subject, receivedAt, provider, matchedBy)
  • OUTBOUND_EMAIL_QUEUEDOutbound Email Queued: Outbound email queued for sending. (tenantId, messageId, threadId?, ticketId?, from, to[], cc[]?, subject, queuedAt, provider)
  • OUTBOUND_EMAIL_SENTOutbound Email Sent: Provider accepted outbound email. (tenantId, messageId, providerMessageId, threadId?, ticketId?, sentAt, provider)
  • OUTBOUND_EMAIL_FAILEDOutbound Email Failed: Provider rejected/failed outbound email. (tenantId, messageId, threadId?, ticketId?, failedAt, provider, errorCode?, errorMessage, retryable?)
  • EMAIL_DELIVEREDEmail Delivered: Provider confirmed delivery. (tenantId, messageId, providerMessageId, to, deliveredAt, provider)
  • EMAIL_BOUNCEDEmail Bounced: Provider reported bounce. (tenantId, messageId, providerMessageId, to, bouncedAt, bounceType(hard|soft), smtpCode?, smtpMessage?)
  • EMAIL_COMPLAINT_RECEIVEDEmail Complaint Received: Recipient complaint/spam report. (tenantId, messageId, providerMessageId, to, complainedAt, provider, complaintType?)
  • EMAIL_UNSUBSCRIBEDEmail Unsubscribed: Recipient unsubscribed. (tenantId, recipientEmail, unsubscribedAt, source, messageId?)

Notifications:

  • NOTIFICATION_SENTNotification Sent: Notification queued/sent. (tenantId, notificationId, channel(email|sms|in_app|push), recipientId, sentAt, templateId?, contextType?, contextId?)
  • NOTIFICATION_DELIVEREDNotification Delivered: Provider confirmed delivery. (tenantId, notificationId, channel, recipientId, deliveredAt, providerMessageId?)
  • NOTIFICATION_FAILEDNotification Failed: Delivery failed. (tenantId, notificationId, channel, recipientId, failedAt, errorCode?, errorMessage, retryable?)
  • NOTIFICATION_READNotification Read: Recipient opened/read notification (trackable channels only). (tenantId, notificationId, channel, recipientId, readAt, client?)

Surveys / CSAT:

  • SURVEY_SENTSurvey Sent: Survey/CSAT request sent. (tenantId, surveyId, surveyType(csat|nps|custom), recipientId, ticketId?, sentAt, channel, templateId?)
  • SURVEY_RESPONSE_RECEIVEDSurvey Response Received: Survey response recorded. (tenantId, surveyId, responseId, recipientId, ticketId?, respondedAt, score, comment?)
  • SURVEY_REMINDER_SENTSurvey Reminder Sent: Reminder sent. (tenantId, surveyId, recipientId, ticketId?, sentAt, channel, reminderNumber)
  • SURVEY_EXPIREDSurvey Expired: Survey expired without response. (tenantId, surveyId, recipientId, ticketId?, expiredAt)
  • CSAT_ALERT_TRIGGEREDCSAT Alert Triggered: CSAT dropped / low score alert. (tenantId, window(daily|weekly|monthly), score, baseline?, delta?, threshold, triggeredAt, scopeType(agent|team|org), scopeId?)

Integrations (packages/integrations)

Sync lifecycle:

  • INTEGRATION_SYNC_STARTEDIntegration Sync Started: Sync job begins. (tenantId, integrationId, provider, connectionId?, syncId, scope?, initiatedByUserId?, startedAt)
  • INTEGRATION_SYNC_COMPLETEDIntegration Sync Completed: Sync finishes successfully. (tenantId, integrationId, provider, connectionId?, syncId, startedAt, completedAt, durationMs, summary{created,updated,deleted,skipped}, warnings?)
  • INTEGRATION_SYNC_FAILEDIntegration Sync Failed: Sync fails. (tenantId, integrationId, provider, connectionId?, syncId, startedAt, failedAt, durationMs, errorCode?, errorMessage, retryable?)
  • INTEGRATION_WEBHOOK_RECEIVEDIntegration Webhook Received: Webhook received. (tenantId, integrationId, provider, connectionId?, webhookId, eventName, receivedAt, rawPayloadRef?)

Auth/connection health:

  • INTEGRATION_CONNECTEDIntegration Connected: Connection established. (tenantId, integrationId, provider, connectionId, connectedAt, connectedByUserId?)
  • INTEGRATION_DISCONNECTEDIntegration Disconnected: Connection removed/invalidated. (tenantId, integrationId, provider, connectionId, disconnectedAt, disconnectedByUserId?, reason?)
  • INTEGRATION_TOKEN_EXPIRINGIntegration Token Expiring: OAuth token nearing expiration. (tenantId, integrationId, provider, connectionId, expiresAt, daysUntilExpiry, notifiedAt)
  • INTEGRATION_TOKEN_REFRESH_FAILEDIntegration Token Refresh Failed: Refresh failed. (tenantId, integrationId, provider, connectionId, failedAt, errorCode?, errorMessage, retryable?)

Mapping/config (useful for “fix my integrations” workflows):

  • EXTERNAL_MAPPING_CHANGEDExternal Mapping Changed: External mapping updated (accounts/tax/service catalog). (tenantId, provider, mappingType, mappingId, actorUserId, changedAt, previousValue?, newValue?)

Assets + Media (packages/assets, packages/media)

  • ASSET_CREATEDAsset Created: Asset record created. (tenantId, assetId, clientId?, createdByUserId, createdAt, assetType?, serialNumber?)
  • ASSET_UPDATEDAsset Updated: Asset fields changed. (tenantId, assetId, updatedByUserId, updatedAt, updatedFields?, changes?)
  • ASSET_ASSIGNEDAsset Assigned: Asset assigned to client/contact/site. (tenantId, assetId, previousOwnerType?, previousOwnerId?, newOwnerType, newOwnerId, actorUserId, assignedAt)
  • ASSET_UNASSIGNEDAsset Unassigned: Asset unassigned. (tenantId, assetId, previousOwnerType, previousOwnerId, actorUserId, unassignedAt, reason?)
  • ASSET_WARRANTY_EXPIRINGAsset Warranty Expiring: Warranty approaching expiration. (tenantId, assetId, expiresAt, daysUntilExpiry, clientId?)

Media lifecycle:

  • FILE_UPLOADEDFile Uploaded: File uploaded to media pipeline. (tenantId, fileId, uploadedByUserId, uploadedAt, fileName, contentType, sizeBytes, storageKey)
  • MEDIA_PROCESSING_SUCCEEDEDMedia Processing Succeeded: Processing complete (thumbnails/virus scan). (tenantId, fileId, processedAt, outputs?, durationMs)
  • MEDIA_PROCESSING_FAILEDMedia Processing Failed: Processing failed. (tenantId, fileId, failedAt, errorCode?, errorMessage, retryable?)