Objects / Transaction
Transaction
Canonical transaction record tracking monetary movement, lifecycle, and audit metadata.
Generated from @oods/foundry 0.10.1
Screens
Every screen below was generated from this object by OODS Foundry 0.10.1, in React and Vue, and shows the calls that made it and its content hash. Each runs as its generated app runs, in this site's brand, Aquex, in the theme you choose, with the sample records this object's own file carries. A value no record gives shows as a neutral one, such as an empty value or "Not recorded"; OODS Foundry invents none.
sha256:6585b492cd9f…Open full size: Transaction detail screen generated by OODS Foundry in Reactsha256:9c16817eb735…Open full size: Transaction detail screen generated by OODS Foundry in Vuesha256:741d7c5c8055…Open full size: Transaction list screen generated by OODS Foundry in Reactsha256:5d42d9b2918a…Open full size: Transaction list screen generated by OODS Foundry in Vuesha256:f13daeaf635b…Open full size: Transaction form screen generated by OODS Foundry in Reactsha256:e80c20708933…Open full size: Transaction form screen generated by OODS Foundry in Vuesha256:8a6fdee10a1c…Open full size: Transaction timeline screen generated by OODS Foundry in Reactsha256:03fc758c3f95…Open full size: Transaction timeline screen generated by OODS Foundry in Vuesha256:8049522561e1…Open full size: Transaction card screen generated by OODS Foundry in Reactsha256:bbebee9206f1…Open full size: Transaction card screen generated by OODS Foundry in Vuesha256:dd78bb854340…Open full size: Transaction inline screen generated by OODS Foundry in Reactsha256:8e56d06f00f3…Open full size: Transaction inline screen generated by OODS Foundry in Vuesha256:91e0b956ab66…Open full size: Transaction workflow screen generated by OODS Foundry in Reactsha256:65c2487526ee…Open full size: Transaction workflow screen generated by OODS Foundry in VueThe calls that made the Transaction detail apps, in React and Vue
design_compose {
"object": "Transaction",
"context": "detail",
"preferences": {
"brand": "Aquex",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-e6e999b0",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-e6e999b0",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:6585b492cd9f828fee0b1e4e072a3c40c1dd97349f650145b8ae02480aa71ee2. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-aquex.css
The Vue app's content hash: sha256:9c16817eb7353dab66acc8b4a9a2e967adea2b188760a0c54fec7cd9280492e3. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-aquex.css
The calls that made the Transaction list apps, in React and Vue
design_compose {
"object": "Transaction",
"context": "list",
"preferences": {
"brand": "Aquex",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-42613573",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-42613573",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:741d7c5c80558900eb372abc6bb508c0c1f680c067b6d432f2b8510ecaca0b4f. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-aquex.css
The Vue app's content hash: sha256:5d42d9b2918af4293931712e5e2ed16cefd8274cf1568110e3f6f51c32c048ed. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-aquex.css
The calls that made the Transaction form apps, in React and Vue
design_compose {
"object": "Transaction",
"context": "form",
"preferences": {
"brand": "Aquex",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-c8717e29",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-c8717e29",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:f13daeaf635b48adcc3478ff06906664791100992a1b99020c39d5118c7f06a2. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-aquex.css
The Vue app's content hash: sha256:e80c20708933625437140f2b53f8ff6b749242d6b2f11660704ad740ccbbdf86. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-aquex.css
What design_compose reported:
OODS-V119No view_extensions found for context "timeline" in object "Transaction". Available contexts: list, detail, form, card
The calls that made the Transaction timeline apps, in React and Vue
design_compose {
"object": "Transaction",
"context": "timeline",
"preferences": {
"brand": "Aquex",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-cff1f5b5",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-cff1f5b5",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:8a6fdee10a1c8395510e640e3c3511e626af17e3bf924e14e0526fdf128b567e. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-aquex.css
The Vue app's content hash: sha256:03fc758c3f95d836090020c66a33590b7987f92fb1973009c9a5278f2916d0ac. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-aquex.css
The calls that made the Transaction card apps, in React and Vue
design_compose {
"object": "Transaction",
"context": "card",
"preferences": {
"brand": "Aquex",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-c6dc74d9",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-c6dc74d9",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:8049522561e11b0edd7159abe2dc6ba4730e1eedcbe3f210415ba154c9c1f9b1. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-aquex.css
The Vue app's content hash: sha256:bbebee9206f1240a706c078eab61f3b3c3d826d5c48af0f050bc69d846466574. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-aquex.css
What design_compose reported:
OODS-V119No view_extensions found for context "inline" in object "Transaction". Available contexts: list, detail, form, card
The calls that made the Transaction inline apps, in React and Vue
design_compose {
"object": "Transaction",
"context": "inline",
"preferences": {
"brand": "Aquex",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-f5677433",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-f5677433",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:dd78bb8543404e3d7c16e65e524d4fdc652805c8612682a6b4e8e3b5fafce00d. Its src/ folder: App.tsx, GeneratedUI.tsx, app.css, main.tsx, oods-brand-aquex.css
The Vue app's content hash: sha256:8e56d06f00f309176cbb6089c516f41325269b3ed4e74f25b10114928287d157. Its src/ folder: App.vue, GeneratedUI.vue, app.css, main.ts, oods-brand-aquex.css
What design_compose reported:
OODS-V119No view_extensions found for context "timeline" in object "Transaction". Available contexts: list, detail, form, card
The calls that made the Transaction workflow apps, in React and Vue
design_compose {
"object": "Transaction",
"context": "workflow",
"preferences": {
"brand": "Aquex",
"theme": "light"
}
}
code_generate {
"schemaRef": "compose-d874fac8",
"framework": "react",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}
code_generate {
"schemaRef": "compose-d874fac8",
"framework": "vue",
"profile": "build",
"options": {
"output": "application",
"brand": "Aquex",
"theme": "light",
"payloadMode": "file"
}
}The React app's content hash: sha256:91e0b956ab66b8fe1f62ec1ca299d332b7140dbdc871539b40a788da8607c35c. Its src/ folder: App.tsx, actions.ts, app.css, application.ts, main.tsx, oods-brand-aquex.css, sample-data.ts, screens/, ssr.tsx, store.ts
The Vue app's content hash: sha256:65c2487526ee9ff4218f3bcb8f230d634042085e3a83757519db0455e9cafe9f. Its src/ folder: App.vue, actions.ts, app.css, application.ts, main.ts, oods-brand-aquex.css, sample-data.ts, screens/, ssr.ts, store.ts
Fields
| Field | Type | Description |
|---|---|---|
statusrequired | string | Canonical lifecycle state derived from the states parameter. MoreThis is the single source of truth for the entity's current lifecycle position. Consumed by Colorized to resolve visual tokens, and by view extensions to render StatusBadge and StatusTimeline. |
state_history | StateTransition[] | Chronological log of state transitions. MoreEach entry records the before/after states, timestamp, and (when governance is enabled) the actor, reason, and transition metadata. Rendered by StatusTimeline in the detail and timeline views. Entry structure: - from: string (previous state) - to: string (new state) - timestamp: ISO 8601 datetime - actor_id: string (user/system who triggered the transition, optional) - reason: string (human-readable justification, required when requireTransitionReason is true) - transition_metadata: Record<string, unknown> (arbitrary context, optional) |
allowed_transitions | string[] | Materialized list of valid next states from the current status, computed from the
transitionRules parameter. MoreWhen transitionRules is null (open model), this contains all states except the current one. Used by StatusSelector to disable invalid options and by StatusBadge to indicate available paths. |
created_atrequired | datetime | Timestamp recording when the entity was first created. |
updated_at | datetime | Timestamp for the most recent modification, when available. |
last_eventrequired | string | Lifecycle event associated with the most recent timestamp mutation. |
last_event_at | datetime | Timestamp for the lifecycle event captured in last_event. |
unit_amount_centsrequired | number | Base unit price expressed in the smallest currency denomination. |
currencyrequired | string | ISO currency code for the unit amount. |
pricing_modelrequired | string | Monetization model applied to the entity. |
billing_interval | string | Billing cadence when pricing_model indicates recurring revenue. |
tax_behaviorrequired | string (exclusive, inclusive) | Defines whether taxes are included in the displayed price. |
cancel_at_period_end | boolean | Whether cancellation occurs at the natural period end instead of immediately. MoreWhen true the entity is in a REVERSIBLE pending-cancellation state: the schedule can be undone (set back to false) any time before period end, returning the entity to active. This is distinct from a terminal cancellation (a `terminated`/canceled subscription), which is irreversible and non-reactivatable. Mirrors Stripe's cancel_at_period_end flag (docs.stripe.com/billing/subscriptions/cancel). |
cancellation_reason | string | Free-form detail describing why cancellation occurred. |
cancellation_reason_code | string | Structured reason code chosen from the allowedReasons parameter. |
cancellation_requested_at | datetime | Timestamp capturing when the cancellation workflow was initiated. |
is_archivedrequired | boolean | Flag indicating whether the entity is currently archived (soft-deleted). |
archived_at | datetime? | Timestamp for when the entity entered the archived state. |
restored_at | datetime? | Timestamp for when the entity was most recently restored from an archived state. |
archive_reason | string | Human-readable narrative describing why the entity was archived. |
archived_by | string | User ID or system identifier of the actor who archived this entity. MoreSet to "system" for automated/policy-driven archival. Supports audit trail queries like "show all entities archived by user X" or "show all auto-archived entities". |
archive_metadata | object | Structured metadata about the archival action for compliance and audit purposes. MoreProperties: - method: "manual" | "automated" | "policy" — how the archive was triggered - compliance_tags: string[] — regulatory labels (e.g., ["GDPR", "SOX", "HIPAA"]) - retention_policy_id: string — reference to the retention policy that triggered archival - original_status: string — the Stateful status before archival - related_entity_count: number — count of related entities also archived (cascade) |
restoration_metadata | object | Metadata about the most recent restoration action. MoreProperties: - restored_by: string — user ID or "system" - restored_fields: string[] — when partial restore, which fields were restored - restoration_reason: string — why the entity was restored - restored_from_snapshot: boolean — whether restored from a point-in-time snapshot |
transaction_idrequired | uuid | Unique identifier for the transaction record. |
user_idrequired | uuid | Identifier of the user associated with the transaction. |
user_name | string | Display name of the user associated with the transaction. |
organization_id | uuid | Tenant organization responsible for the transaction. |
organization_name | string | Display name of the tenant organization responsible for the transaction. |
occurred_atrequired | datetime | Timestamp when the transaction occurred in the source system. |
payment_methodrequired | string (card, bank_transfer, digital_wallet, invoice) | Funding source used to complete the transaction. |
channelrequired | string (online, in_app, point_of_sale, partner) | Sales channel through which the transaction was initiated. |
payment_reference | string | Provider reference code linking to the payment processor. |
description | string | What the payment was for, as it appears on the customer's statement. |
risk_score | number | Fraud assessment score assigned during authorization. |
Traits
Each trait adds fields and behaviour. Every object with the trait gets the same.
Relationships
These arrows show declared relationships between object types. They don't join live records.
- User, many-to-one, via
user_id - Organization, many-to-one, via
organization_id
The object file
The Transaction object definition in YAML: objects/core/Transaction.object.yaml
object:
name: Transaction
version: 1.1.0
domain: core.commerce
description: Canonical transaction record tracking monetary movement, lifecycle, and audit metadata.
tags:
- universal
- transaction
- commerce
traits:
- name: lifecycle/Stateful
parameters:
states:
- pending
- authorized
- settled
- failed
- refunded
- cancelled
initialState: pending
- name: lifecycle/Timestampable
parameters:
recordedEvents:
- initiated
- authorized
- settled
- refunded
- failed
timezone: UTC
- name: financial/Priceable
parameters:
supportedCurrencies:
- USD
- EUR
- GBP
- JPY
- AUD
defaultCurrency: USD
pricingModels:
- one_time
- usage_based
billingIntervals:
- one_time
taxBehavior: exclusive
- name: lifecycle/Cancellable
parameters:
allowCancellationAfterStart: false
cancellationWindowHours: 24
requireReason: true
allowedReasons:
- customer_request
- suspected_fraud
- duplicate_charge
- payment_method_error
- name: lifecycle/Archivable
parameters:
gracePeriodDays: 365
retainHistory: true
restoreWindowDays: 30
schema:
transaction_id:
type: uuid
required: true
description: Unique identifier for the transaction record.
user_id:
type: uuid
required: true
description: Identifier of the user associated with the transaction.
user_name:
type: string
required: false
description: Display name of the user associated with the transaction.
organization_id:
type: uuid
required: false
description: Tenant organization responsible for the transaction.
organization_name:
type: string
required: false
description: Display name of the tenant organization responsible for the transaction.
occurred_at:
type: datetime
required: true
description: Timestamp when the transaction occurred in the source system.
payment_method:
type: string
required: true
description: Funding source used to complete the transaction.
validation:
enum:
- card
- bank_transfer
- digital_wallet
- invoice
channel:
type: string
required: true
default: online
description: Sales channel through which the transaction was initiated.
validation:
enum:
- online
- in_app
- point_of_sale
- partner
payment_reference:
type: string
required: false
description: Provider reference code linking to the payment processor.
description:
type: string
required: false
description: What the payment was for, as it appears on the customer's statement.
validation:
maxLength: 160
risk_score:
type: number
required: false
description: Fraud assessment score assigned during authorization.
validation:
minimum: 0
maximum: 100
semantics:
transaction_id:
semantic_type: commerce.transaction.id
token_mapping: tokenMap(commerce.transaction.id)
user_id:
semantic_type: identity.user.id
token_mapping: tokenMap(identity.id.primary)
ui_hints:
displayLabelField: user_name
user_name:
semantic_type: identity.user.name
token_mapping: tokenMap(identity.name.primary)
organization_id:
semantic_type: organization.id
token_mapping: tokenMap(organization.id.primary)
ui_hints:
displayLabelField: organization_name
organization_name:
semantic_type: organization.name
token_mapping: tokenMap(organization.name.primary)
# The one-line summary under the payment reference in lists: what the payment was for.
description:
semantic_type: text.summary
token_mapping: tokenMap(commerce.transaction.description)
occurred_at:
semantic_type: commerce.transaction.timestamp
token_mapping: tokenMap(commerce.transaction.timestamp)
payment_method:
semantic_type: commerce.payment.method
token_mapping: tokenMap(commerce.payment.method)
channel:
semantic_type: commerce.transaction.channel
token_mapping: tokenMap(commerce.transaction.channel)
payment_reference:
semantic_type: text.label
token_mapping: tokenMap(commerce.transaction.id)
ui_hints:
displayFallbackField: transaction_id
risk_score:
semantic_type: risk.transaction.score
token_mapping: tokenMap(risk.score.primary)
tokens:
commerce.transaction.id: "var(--text-strong)"
commerce.transaction.channel.partner: "var(--status-info)"
risk.score.primary: "var(--status-warning)"
metadata:
owners:
- finance@oods.systems
- risk@oods.systems
steward: platform@oods.systems
changelog:
- version: 1.1.0
date: "2026-09-20"
description: Name transactions by the optional payment reference, falling back to transaction_id for display only.
- version: 1.0.0
date: "2025-10-16"
description: Initial Universal Quintet baseline.
# Authored type associations; no record join or referential-integrity claim.
relationships:
- target: User
via: user_id
cardinality: many-to-one
label: User
- target: Organization
via: organization_id
cardinality: many-to-one
label: Tenant organization
# Eight authored sample transactions: the sample subscriptions' payments (one a bank transfer still in progress), a
# card-verification hold and a cancelled checkout, each by a sample organization's user. Amounts are stored at Priceable's factor of 100 per currency unit.
# Cancellation is not a recorded event, so the cancelled checkout's last event is its initiation.
samples:
- payment_reference: PAY-2026-0412
description: Business plan, Sep 2 to Oct 2
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d01
user_name: Dana Whitfield
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a01
organization_name: Northwind Traders
occurred_at: '2026-09-02T15:00:00Z'
unit_amount_cents: 14900
currency: USD
pricing_model: one_time
payment_method: card
channel: online
risk_score: 8
status: settled
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-09-02T15:00:00Z', reason: Business plan renewal charge }
- { title: Authorized, from: pending, to: authorized, at: '2026-09-02T15:01:00Z', reason: Approved by the card issuer }
- { title: Settled, from: authorized, to: settled, at: '2026-09-03T02:00:00Z', reason: Included in the nightly payout }
cancellation_reason: null
cancellation_reason_code: null
cancellation_requested_at: null
created_at: '2026-09-02T15:00:00Z'
updated_at: '2026-09-03T02:00:00Z'
last_event: settled
last_event_at: '2026-09-03T02:00:00Z'
- payment_reference: PAY-2026-0388
description: Upgrade to Business, prorated
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d01
user_name: Dana Whitfield
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a01
organization_name: Northwind Traders
occurred_at: '2026-06-16T15:00:00Z'
unit_amount_cents: 5333
currency: USD
pricing_model: one_time
payment_method: card
channel: online
risk_score: 6
status: settled
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-06-16T15:00:00Z', reason: Prorated charge for the upgrade to Business }
- { title: Authorized, from: pending, to: authorized, at: '2026-06-16T15:01:00Z', reason: Approved by the card issuer }
- { title: Settled, from: authorized, to: settled, at: '2026-06-17T02:00:00Z', reason: Included in the nightly payout }
cancellation_reason: null
cancellation_reason_code: null
cancellation_requested_at: null
created_at: '2026-06-16T15:00:00Z'
updated_at: '2026-06-17T02:00:00Z'
last_event: settled
last_event_at: '2026-06-17T02:00:00Z'
- payment_reference: PAY-2026-0417
description: Starter plan, Sep 15 to Oct 15
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d04
user_name: Tomas Lindqvist
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a03
organization_name: Lindqvist Bakery
occurred_at: '2026-09-15T08:00:00Z'
unit_amount_cents: 1900
currency: EUR
pricing_model: one_time
payment_method: card
channel: online
risk_score: 4
status: settled
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-09-15T08:00:00Z', reason: Starter plan renewal charge }
- { title: Authorized, from: pending, to: authorized, at: '2026-09-15T08:01:00Z', reason: Approved by the card issuer }
- { title: Settled, from: authorized, to: settled, at: '2026-09-16T02:00:00Z', reason: Included in the nightly payout }
cancellation_reason: null
cancellation_reason_code: null
cancellation_requested_at: null
created_at: '2026-09-15T08:00:00Z'
updated_at: '2026-09-16T02:00:00Z'
last_event: settled
last_event_at: '2026-09-16T02:00:00Z'
- payment_reference: PAY-2026-0395
description: Starter plan, charged twice in August
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d04
user_name: Tomas Lindqvist
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a03
organization_name: Lindqvist Bakery
occurred_at: '2026-08-16T08:00:00Z'
unit_amount_cents: 1900
currency: EUR
pricing_model: one_time
payment_method: card
channel: online
risk_score: 11
status: refunded
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-08-16T08:00:00Z', reason: August renewal charged a second time }
- { title: Authorized, from: pending, to: authorized, at: '2026-08-16T08:01:00Z', reason: Approved by the card issuer }
- { title: Settled, from: authorized, to: settled, at: '2026-08-17T02:00:00Z', reason: Included in the nightly payout }
- { title: Refunded, from: settled, to: refunded, at: '2026-08-19T11:30:00Z', reason: Duplicate charge refunded in full }
cancellation_reason: null
cancellation_reason_code: null
cancellation_requested_at: null
created_at: '2026-08-16T08:00:00Z'
updated_at: '2026-08-19T11:30:00Z'
last_event: refunded
last_event_at: '2026-08-19T11:30:00Z'
- payment_reference: PAY-2026-0409
description: Team plan, Sep 3 to Oct 3
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d05
user_name: Grace Okafor
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a04
organization_name: Kestrel Print Co.
occurred_at: '2026-09-03T10:00:00Z'
unit_amount_cents: 4900
currency: GBP
pricing_model: one_time
payment_method: card
channel: online
risk_score: 64
status: failed
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-09-03T10:00:00Z', reason: Team plan renewal charge }
- { title: Failed, from: pending, to: failed, at: '2026-09-03T10:01:00Z', reason: Card declined by the issuer }
cancellation_reason: null
cancellation_reason_code: null
cancellation_requested_at: null
created_at: '2026-09-03T10:00:00Z'
updated_at: '2026-09-03T10:01:00Z'
last_event: failed
last_event_at: '2026-09-03T10:01:00Z'
- payment_reference: PAY-2026-0425
description: Card check before the Team trial
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d03
user_name: Priya Raman
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a02
organization_name: Blue Harbor Studio
occurred_at: '2026-09-21T08:58:00Z'
unit_amount_cents: 100
currency: USD
pricing_model: one_time
payment_method: card
channel: in_app
risk_score: 9
status: authorized
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-09-21T08:58:00Z', reason: Card check before the Team trial }
- { title: Authorized, from: pending, to: authorized, at: '2026-09-21T08:58:30Z', reason: Hold approved; it is released without capture }
cancellation_reason: null
cancellation_reason_code: null
cancellation_requested_at: null
created_at: '2026-09-21T08:58:00Z'
updated_at: '2026-09-21T08:58:30Z'
last_event: authorized
last_event_at: '2026-09-21T08:58:30Z'
- payment_reference: PAY-2026-0429
description: Enterprise renewal, 2026 to 2027
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d02
user_name: Ruth Adeyemi
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a05
organization_name: Tidewater Co-op
occurred_at: '2026-09-24T21:00:00Z'
unit_amount_cents: 1200000
currency: USD
pricing_model: one_time
payment_method: bank_transfer
channel: online
risk_score: 3
status: pending
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-09-24T21:00:00Z', reason: Bank transfer sent for INV-2026-0155 }
- { title: Returned, from: pending, to: failed, at: '2026-09-25T02:00:00Z', reason: The reference had no invoice number }
- { title: Sent again, from: failed, to: pending, at: '2026-09-28T21:00:00Z', reason: Sent again with the invoice number }
cancellation_reason: null
cancellation_reason_code: null
cancellation_requested_at: null
created_at: '2026-09-24T21:00:00Z'
updated_at: '2026-09-28T21:00:00Z'
last_event: initiated
last_event_at: '2026-09-28T21:00:00Z'
- payment_reference: PAY-2026-0404
description: Team plan purchase at trial end
user_id: 8b2e4d6f-1a3c-4e5b-9d7f-2c4e6a8b0d09
user_name: Helen Rowe
organization_id: 3f1c2a4e-5b6d-4e7f-8a9b-0c1d2e3f4a08
organization_name: Gale & Rowe Legal
occurred_at: '2026-09-08T12:50:00Z'
unit_amount_cents: 4900
currency: USD
pricing_model: one_time
payment_method: card
channel: online
risk_score: 12
status: cancelled
state_history:
- { title: Initiated, from: null, to: pending, at: '2026-09-08T12:50:00Z', reason: Team plan checkout at the end of the trial }
- { title: Cancelled, from: pending, to: cancelled, at: '2026-09-08T12:58:00Z', reason: Customer cancelled before capture }
cancellation_reason: Customer cancelled the Team plan purchase before capture
cancellation_reason_code: customer_request
cancellation_requested_at: '2026-09-08T12:58:00Z'
created_at: '2026-09-08T12:50:00Z'
updated_at: '2026-09-08T12:58:00Z'
last_event: initiated
last_event_at: '2026-09-08T12:50:00Z'