Developer Hooks and Extension Points
Use WooCommerce Loyalty actions and filters to integrate points, levels, order skips, expiration logic, and the Loyalty bubble.
Applies to 1.2.2+
Stable
Verified July 29, 2026
WooCommerce Loyalty exposes actions and filters for common extension points. Use these hooks in a small custom plugin or child-theme code only when the behavior cannot be configured from settings.
Points Event Actions
| Hook | Arguments | When it runs |
|---|---|---|
yowcl_loyalty_points_reward | $user_id, $points, $new_points, $order_id | After reward points are added. |
woocommerce_loyalty_points_reward | $user_id, $points, $new_points, $order_id | Compatibility alias for reward events. |
yowcl_loyalty_points_deduct | $user_id, $points, $new_points, $order_id | After points are deducted. |
woocommerce_loyalty_points_deduct | $user_id, $points, $new_points, $order_id | Compatibility alias for deduct events. |
yowcl_loyalty_level_update | $user_id, $updated_level, $new_earning_points | After the customer loyalty role changes. |
woocommerce_loyalty_level_update | $user_id, $updated_level, $new_earning_points | Compatibility alias for level update events. |
Order And Expiration Filters
| Hook | Use |
|---|---|
yowcl_skip_points_for_order | Skip reward logic for selected orders, integrations, or custom sources. |
yowcl_points_expiration_order_statuses | Customize which order statuses count as purchases for inactivity expiration checks. |
yol_points_expiration_allowed_units | Customize allowed relative date units for expiration settings. |
yowcl_level_discount_fee_label | Customize the cart fee label used for loyalty level discounts. |
yowcl_level_discount_fee_taxable | Control whether the loyalty level discount fee is taxable. |
yowcl_level_discount_fee_tax_class | Set the tax class for the loyalty level discount fee. |
Batch And Bubble Hooks
| Hook | Use |
|---|---|
yowcl_points_expiration_processed | React after a points expiration log entry is processed. |
yowcl_points_zero_all_user_processed | React after a fixed-date zero-all job processes a user. |
yowcl_points_zero_all_completed | React after a zero-all batch completes. |
yowcl_level_reset_user_processed | React after a level reset processes a user. |
yowcl_level_reset_completed | React after a level reset completes. |
yowcl_loyalty_info_bubble_enabled | Control whether the Loyalty bubble renders. |
yowcl_loyalty_info_bubble_sections | Adjust the sections shown in the Loyalty bubble. |
Example: Skip Points For Manual Orders
add_filter( 'yowcl_skip_points_for_order', function ( $skip, $order, $old_status, $new_status ) {
if ( $order && 'manual' === $order->get_created_via() ) {
return true;
}
return $skip;
}, 10, 4 );
Implementation Notes
- Register custom code in a small plugin so it is not lost during theme changes.
- Use the YoOhw-prefixed hook names first; compatibility aliases are available for selected events.
- Do not directly edit user point meta unless you also understand points logs and cache invalidation.
- Test hooks with guest orders, registered customers, refunds, and repeated status changes.
Continue from WooCommerce Loyalty Points & Rewards documentation to the complete product workflow.
Evaluate product scope on the money page, use the pillar Guide for decisions and trade-offs, and return here for exact configuration.
Did this guide answer your question?
Still stuck?
Open a support request and include this article title, your plugin version, and what you already tried.
Open Support