An audit log records reads, not only writes

For anything with personal or financial data, who looked at it is a question that gets asked, and a write-only audit log cannot answer it.

// on the read path, for sensitive resources only
AuditLog::record([
    'action'       => 'customer.viewed',
    'subject_id'   => $customer->id,
    'actor_id'     => $actor->id,
    'context'      => ['reason' => $request->input('reason')],
]);

// the volume problem is real: a list endpoint viewing 50
// customers is 50 records, or 1 record with 50 ids.

Recording a list view as one record with the ids is the compromise that keeps the volume manageable, and it loses the ability to say which one was actually read. Scoping this to genuinely sensitive resources rather than everything is what makes it affordable, and deciding which those are is a conversation rather than a technical judgement.