Skip to main content

Hooks & Filters

Available WordPress hooks for customizing Signifyd for WooCommerce behavior.

Action Hooks

Order Decision Hooks

These hooks fire when Signifyd makes decisions about orders:

signifyd_order_approved

Fires when Signifyd approves an order.

Parameters:

  • $order_id (int) — WooCommerce order ID

Example:

add_action('signifyd_order_approved', function($order_id) {
$order = wc_get_order($order_id);
$order->add_order_note('Signifyd approved this order for fulfillment.');

// Send notification to fulfillment team
wp_mail('[email protected]', 'Order Approved', "Order #{$order_id} cleared by Signifyd");
}, 10, 1);

signifyd_order_rejected

Fires when Signifyd rejects an order as fraudulent.

Parameters:

  • $order_id (int) — WooCommerce order ID

Example:

add_action('signifyd_order_rejected', function($order_id) {
$order = wc_get_order($order_id);
$order->update_status('failed', 'Rejected by Signifyd fraud detection');

// Log to external system
do_action('log_fraud_event', [
'order_id' => $order_id,
'reason' => 'signifyd_rejection'
]);
}, 10, 1);

signifyd_order_held

Fires when Signifyd places an order on hold for manual review.

Parameters:

  • $order_id (int) — WooCommerce order ID

Example:

add_action('signifyd_order_held', function($order_id) {
$order = wc_get_order($order_id);
$order->add_order_note('Signifyd flagged for manual review');

// Notify fraud team
wp_mail('[email protected]', 'Order Requires Review', "Order #{$order_id}");
}, 10, 1);

Fulfillment Hooks

signifyd_before_fulfillment

Fires before fulfillment data is sent to Signifyd.

Parameters:

  • $fulfillment_data (array) — Fulfillment payload
  • $order_id (int) — WooCommerce order ID

Example:

add_action('signifyd_before_fulfillment', function($fulfillment_data, $order_id) {
error_log("Sending fulfillment for order {$order_id}");
}, 10, 2);

signifyd_fulfillment_sent

Fires after fulfillment data is successfully submitted.

Parameters:

  • $response (array) — Signifyd API response
  • $order_id (int) — WooCommerce order ID

Example:

add_action('signifyd_fulfillment_sent', function($response, $order_id) {
update_post_meta($order_id, 'signifyd_fulfillment_sent', current_time('mysql'));
}, 10, 2);

Webhook Hooks

signifyd_webhook_received

Fires when any webhook is received from Signifyd.

Parameters:

  • $webhook_data (array) — Raw webhook payload
  • $signature_valid (bool) — Whether HMAC signature validated

Example:

add_action('signifyd_webhook_received', function($webhook_data, $signature_valid) {
if (!$signature_valid) {
error_log('Invalid Signifyd webhook signature detected');
// Alert security team
}
}, 10, 2);

Order Submission Hooks

signifyd_before_submit

Fires before order data is sent to Signifyd API.

Parameters:

  • $payload (array) — Order payload being sent
  • $order (WC_Order) — WooCommerce order object

Example:

add_action('signifyd_before_submit', function($payload, $order) {
// Add custom data to payload
error_log('Submitting order ' . $order->get_id() . ' to Signifyd');
}, 10, 2);

signifyd_after_submit

Fires after order is submitted to Signifyd (regardless of success/failure).

Parameters:

  • $response (array) — Signifyd API response
  • $order_id (int) — WooCommerce order ID

Example:

add_action('signifyd_after_submit', function($response, $order_id) {
if (isset($response['investigationId'])) {
error_log("Order {$order_id} submitted. Case ID: {$response['investigationId']}");
}
}, 10, 2);

signifyd_submission_error

Fires when order submission to Signifyd fails.

Parameters:

  • $error (WP_Error) — Error object
  • $order_id (int) — WooCommerce order ID

Example:

add_action('signifyd_submission_error', function($error, $order_id) {
$message = $error->get_error_message();
error_log("Signifyd submission failed for order {$order_id}: {$message}");

// Retry logic
wp_schedule_single_event(time() + 300, 'retry_signifyd_submission', [$order_id]);
}, 10, 2);

Filter Hooks

Payload Modification Filters

signifyd_payload

Filters the complete payload before sending to Signifyd API.

Parameters:

  • $payload (array) — Complete payload array
  • $order (WC_Order) — WooCommerce order object

Return: Modified payload array

Example:

add_filter('signifyd_payload', function($payload, $order) {
// Add custom field
$payload['custom_data'] = [
'loyalty_tier' => get_user_meta($order->get_customer_id(), 'loyalty_tier', true),
'referral_source' => $order->get_meta('referral_source')
];

return $payload;
}, 10, 2);

signifyd_purchase_data

Filters purchase section of payload.

Parameters:

  • $purchase (array) — Purchase data array
  • $order (WC_Order) — WooCommerce order object

Return: Modified purchase array

Example:

add_filter('signifyd_purchase_data', function($purchase, $order) {
// Add custom session ID
$purchase['orderSessionId'] = $order->get_meta('custom_session_id');

return $purchase;
}, 10, 2);

signifyd_recipient_data

Filters recipient/shipping section of payload.

Parameters:

  • $recipient (array) — Recipient data array
  • $order (WC_Order) — WooCommerce order object

Return: Modified recipient array

Example:

add_filter('signifyd_recipient_data', function($recipient, $order) {
// Override confirmation email
$recipient['confirmationEmail'] = $order->get_billing_email();
$recipient['confirmationPhone'] = $order->get_billing_phone();

return $recipient;
}, 10, 2);

signifyd_card_data

Filters payment card data section.

Parameters:

  • $card_data (array) — Card data array
  • $order (WC_Order) — WooCommerce order object

Return: Modified card data array

Example:

add_filter('signifyd_card_data', function($card_data, $order) {
$payment_method = $order->get_payment_method();

// Only send card data for credit card payments
if ($payment_method !== 'nmi' && $payment_method !== 'ebizcharge') {
return []; // Empty array for non-card payments
}

return $card_data;
}, 10, 2);

signifyd_line_items

Filters product line items in payload.

Parameters:

  • $items (array) — Array of line item arrays
  • $order (WC_Order) — WooCommerce order object

Return: Modified items array

Example:

add_filter('signifyd_line_items', function($items, $order) {
foreach ($items as &$item) {
// Add custom product category
$product = wc_get_product($item['productId']);
if ($product) {
$terms = wp_get_post_terms($product->get_id(), 'product_cat');
$item['category'] = !empty($terms) ? $terms[0]->name : '';
}
}

return $items;
}, 10, 2);

Submission Control Filters

signifyd_should_submit_order

Filters whether an order should be submitted to Signifyd.

Parameters:

  • $should_submit (bool) — Whether to submit (default: true)
  • $order (WC_Order) — WooCommerce order object

Return: Boolean (true to submit, false to skip)

Example:

add_filter('signifyd_should_submit_order', function($should_submit, $order) {
// Don't submit orders under $50
if ($order->get_total() < 50) {
return false;
}

// Don't submit orders from employees
$customer_email = $order->get_billing_email();
if (strpos($customer_email, '@company.com') !== false) {
return false;
}

return $should_submit;
}, 10, 2);

signifyd_excluded_payment_methods

Filters list of payment methods to exclude from Signifyd submission.

Parameters:

  • $excluded_methods (array) — Array of payment method IDs

Return: Array of payment method IDs to exclude

Default: ['klarna']

Example:

add_filter('signifyd_excluded_payment_methods', function($excluded_methods) {
// Also exclude PayPal and Apple Pay
$excluded_methods[] = 'paypal';
$excluded_methods[] = 'applepay';

return $excluded_methods;
});

Fulfillment Filters

signifyd_fulfillment_data

Filters fulfillment payload before submission.

Parameters:

  • $fulfillment (array) — Fulfillment data array
  • $order (WC_Order) — WooCommerce order object

Return: Modified fulfillment array

Example:

add_filter('signifyd_fulfillment_data', function($fulfillment, $order) {
// Add tracking information
$fulfillment['shipmentId'] = $order->get_meta('tracking_number');
$fulfillment['carrier'] = $order->get_meta('shipping_carrier');

return $fulfillment;
}, 10, 2);

API Configuration Filters

signifyd_api_key

Filters the API key used for requests.

Parameters:

  • $api_key (string) — Current API key
  • $environment (string) — 'prod' or 'dev'

Return: API key string

Example:

add_filter('signifyd_api_key', function($api_key, $environment) {
// Use environment-specific constants
if ($environment === 'prod') {
return defined('SIGNIFYD_PROD_KEY') ? SIGNIFYD_PROD_KEY : $api_key;
}
return defined('SIGNIFYD_DEV_KEY') ? SIGNIFYD_DEV_KEY : $api_key;
}, 10, 2);

signifyd_api_url

Filters the Signifyd API base URL.

Parameters:

  • $url (string) — API base URL

Return: Modified URL string

Default: https://api.signifyd.com/v2

Example:

add_filter('signifyd_api_url', function($url) {
// Use custom proxy
return 'https://proxy.example.com/signifyd-api';
});

Decision Action Filters

signifyd_decision_status_map

Filters the mapping of Signifyd decisions to WooCommerce order statuses.

Parameters:

  • $status_map (array) — Associative array of decision => status

Return: Modified status map

Default:

[
'APPROVED' => 'processing',
'REJECTED' => 'failed',
'HOLD' => 'on-hold'
]

Example:

add_filter('signifyd_decision_status_map', function($status_map) {
// Use custom statuses
$status_map['APPROVED'] = 'wc-approved-fraud';
$status_map['REJECTED'] = 'wc-fraud-detected';
$status_map['HOLD'] = 'wc-fraud-review';

return $status_map;
});

Custom Action Implementation Examples

Send Slack Notification on Fraud Detection

add_action('signifyd_order_rejected', function($order_id) {
$order = wc_get_order($order_id);

$message = sprintf(
'Fraudulent order detected! Order #%d ($%.2f) from %s',
$order_id,
$order->get_total(),
$order->get_billing_email()
);

wp_remote_post('https://hooks.slack.com/services/YOUR/WEBHOOK/URL', [
'body' => json_encode(['text' => $message])
]);
});

Auto-Refund Rejected Orders

add_action('signifyd_order_rejected', function($order_id) {
$order = wc_get_order($order_id);

if ($order->get_status() === 'processing' || $order->get_status() === 'completed') {
// Automatically refund
wc_create_refund([
'order_id' => $order_id,
'amount' => $order->get_total(),
'reason' => 'Fraud detected by Signifyd'
]);
}
});

Integration with Custom CRM

add_action('signifyd_after_submit', function($response, $order_id) {
$order = wc_get_order($order_id);

// Send to CRM
wp_remote_post('https://crm.example.com/api/orders', [
'body' => json_encode([
'order_id' => $order_id,
'customer_email' => $order->get_billing_email(),
'signifyd_case_id' => $response['investigationId'] ?? null,
'fraud_score' => $response['score'] ?? null
])
]);
}, 10, 2);

Complete Hook Reference

Hook NameTypeParametersPurpose
signifyd_order_approvedAction$order_idOrder approved by Signifyd
signifyd_order_rejectedAction$order_idOrder rejected as fraud
signifyd_order_heldAction$order_idOrder held for review
signifyd_before_fulfillmentAction$data, $order_idBefore fulfillment sent
signifyd_fulfillment_sentAction$response, $order_idFulfillment submitted
signifyd_webhook_receivedAction$data, $validWebhook received
signifyd_before_submitAction$payload, $orderBefore order submitted
signifyd_after_submitAction$response, $order_idAfter order submitted
signifyd_submission_errorAction$error, $order_idSubmission failed
signifyd_payloadFilter$payload, $orderModify full payload
signifyd_purchase_dataFilter$purchase, $orderModify purchase section
signifyd_recipient_dataFilter$recipient, $orderModify recipient section
signifyd_card_dataFilter$card, $orderModify card data
signifyd_line_itemsFilter$items, $orderModify line items
signifyd_should_submit_orderFilter$bool, $orderControl submission
signifyd_excluded_payment_methodsFilter$methodsExclude payment types
signifyd_fulfillment_dataFilter$data, $orderModify fulfillment payload
signifyd_api_keyFilter$key, $envOverride API key
signifyd_api_urlFilter$urlOverride API URL
signifyd_decision_status_mapFilter$mapCustom status mapping

Next Steps