By default, a single failed job inside
Bus::batch() marks the entire batch as cancelled and skips the then() callback. Chaining ->allowFailures() when dispatching bulk webhook or email batches lets healthy jobs keep processing while you inspect the failed rows inside finally().commit 2f9c8f2