Axiomatic

Events

Understand how financial events flow through the system and drive automated journal entries.

Overview

In Axiomatic, all financial activity enters the system as events. An event represents something that happened — an invoice was issued, a payment was received, payroll was processed. The posting engine automatically transforms events into double-entry journal entries based on your DSL rules.

This event-sourced approach means your ledger is always a derived view of the underlying business events, providing a complete audit trail.

How Events Work

  1. An event is created — either manually, via API, or automatically from imported bank transactions
  2. The posting engine processes it — matching the event type against your published DSL rules
  3. Journal entries are generated — across all books for the entity (e.g. GAAP, Tax, Management)
  4. The event is marked as posted — with a link to the resulting journal entries

Each event is processed idempotently — it will never be double-posted to the same book.

Event Structure

Every event contains:

FieldDescription
entityIdThe entity this event belongs to
typeThe event type (e.g. invoice_issued, payment_received)
timestampWhen the event occurred
payloadA JSON object with the event's financial data
sourceHow the event was created (e.g. MANUAL, SYSTEM, IMPORT)
idempotencyKeyOptional key to prevent duplicate event creation

Common Event Types

Event TypeDescriptionTypical Posting
invoice_issuedCustomer invoice createdDR Accounts Receivable, CR Revenue
payment_receivedPayment from a customerDR Cash, CR Accounts Receivable
payroll_processedPayroll run completedDR Expense, CR Cash
vendor_billBill received from a vendorDR Expense, CR Accounts Payable
vendor_paymentPayment to a vendorDR Expense, CR Cash
debt_paymentCredit card or loan paymentDR Liability, CR Cash
income_receivedIncome received (non-invoice)DR Cash, CR Income
crypto_receivedCrypto payment receivedDR Crypto Cash, CR Revenue
capital_contributionCapital invested into entityDR Cash, CR Equity
investment_madeInvestment purchasedDR Investment Asset, CR Cash

Posting Statuses

Every event carries a posting status that tells you what happened when it was processed:

StatusMeaning
PostedSuccessfully created journal entries
Pending ApprovalJournal entries created but awaiting approval
ReversedOriginal entries have been reversed
FailedProcessing encountered an error (e.g. missing account mapping or FX rate)
UnpostedNo matching rule found, or not yet processed

You can filter events by posting status to quickly find items that need attention.

Creating Events

Via API

POST /api/events
{
  "entityId": "your-entity-id",
  "type": "invoice_issued",
  "timestamp": "2025-06-15T00:00:00Z",
  "payload": {
    "invoice_number": "INV-2025-042",
    "counterparty": "Acme Corp",
    "total_amount": "10000.00",
    "currency": "USD",
    "description": "Advisory services — June 2025"
  }
}

The event is automatically processed through the posting engine upon creation. The response includes the processing result with any journal entries created or errors encountered.

From Bank Transactions

When you import bank transactions (via Plaid or CSV), the reconciliation engine can automatically create events from matched transactions. Each imported transaction is classified by type and promoted to an event, which then flows through the posting engine.

Manually in the UI

Navigate to the Events page and create events directly. This is useful for recording activity that doesn't come from an external feed, such as journal adjustments, accruals, or one-off transactions.

Batch Processing

Process all unprocessed events for an entity at once:

POST /api/process
{
  "entityId": "your-entity-id"
}

This processes events in chronological order and returns a summary with counts of processed, skipped, and errored events. Already-posted events are safely skipped.

Reversals

Events are never deleted. If a posting was incorrect, the system creates a reversal entry — a mirror journal entry that zeros out the original. The original entry is marked as REVERSED and the reversal is linked to it for a complete audit trail.

Reclassification

If an event was posted under the wrong type, you can reclassify it:

  1. The original journal entries are reversed
  2. A new correction event is created (linked to the original via correlationId)
  3. The correction event is processed with the new event type and payload
  4. The full chain is preserved: original → reversal → correction → new entries

On this page