Siren

ConversionsAwarded

Fires after BuildConversions has created conversion records for a specific program. The branching point for obligation creation.

Last updated: April 8, 2026

ConversionsAwarded

After the BuildConversions listener finishes creating conversion records for a program, it fires ConversionsAwarded. This event marks the transition from “conversions exist” to “the system can act on them.” It carries everything downstream listeners need to create obligations, update engagement states, and calculate rewards.

The event is identified as conversions_awarded and lives in the Siren\Conversions\Core\Events namespace.

What does this event carry?

The payload is rich by design. It includes the array of Conversion models that were created, the Transaction (if any), the Incentive type and IncentiveResolver that were used to calculate rewards, the Program that matched, the opportunityId, and the conversionType. This breadth of context means listeners never need to re-query for information that was already resolved during the build phase.

use Siren\Conversions\Core\Events\ConversionsAwarded;

public function handle(Event $event): void
{
    $conversions = $event->getConversions();
    $program = $event->getProgram();
    $transaction = $event->getTransaction();
    $incentive = $event->getIncentiveType();
    $resolver = $event->getIncentiveResolver();
    $opportunityId = $event->getOpportunityId();
    $conversionType = $event->getConversionType();
}

Why is this a branching point?

Several listeners respond to this event, each handling a different concern. CreateObligationForConversion uses the incentive context to create obligation records that describe what the collaborator is owed. MarkEngagementsComplete transitions the opportunity’s engagements from active to complete, signaling that the attribution cycle for those engagements has concluded.

Because the event carries the full incentive context, any custom listener that needs to know how rewards were calculated can inspect the Incentive and IncentiveResolver directly from the event rather than re-running the incentive evaluation logic.

See the Conversion Events overview for how this event fits into the full conversion pipeline.