A log line saying that an order was updated answers none of the questions asked during a dispute.
AuditLog::record([
'subject_type' => Order::class,
'subject_id' => $order->id,
'action' => 'order.total_adjusted',
'actor_type' => 'user', // or 'system', 'api_client'
'actor_id' => $actor?->id,
'before' => ['total_cents' => 4900],
'after' => ['total_cents' => 4400],
'reason' => $request->input('reason'),
'ip' => $request->ip(),
'request_id' => $request->header('X-Request-Id'),
]);
Recording only the changed fields rather than the whole model keeps the table proportional to the changes rather than to the data, which matters on a wide table. The reason field is the one that turns an audit log into something a person can read, and requiring it for manual adjustments is a product decision rather than a technical one.