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 Name | Type | Parameters | Purpose |
|---|---|---|---|
signifyd_order_approved | Action | $order_id | Order approved by Signifyd |
signifyd_order_rejected | Action | $order_id | Order rejected as fraud |
signifyd_order_held | Action | $order_id | Order held for review |
signifyd_before_fulfillment | Action | $data, $order_id | Before fulfillment sent |
signifyd_fulfillment_sent | Action | $response, $order_id | Fulfillment submitted |
signifyd_webhook_received | Action | $data, $valid | Webhook received |
signifyd_before_submit | Action | $payload, $order | Before order submitted |
signifyd_after_submit | Action | $response, $order_id | After order submitted |
signifyd_submission_error | Action | $error, $order_id | Submission failed |
signifyd_payload | Filter | $payload, $order | Modify full payload |
signifyd_purchase_data | Filter | $purchase, $order | Modify purchase section |
signifyd_recipient_data | Filter | $recipient, $order | Modify recipient section |
signifyd_card_data | Filter | $card, $order | Modify card data |
signifyd_line_items | Filter | $items, $order | Modify line items |
signifyd_should_submit_order | Filter | $bool, $order | Control submission |
signifyd_excluded_payment_methods | Filter | $methods | Exclude payment types |
signifyd_fulfillment_data | Filter | $data, $order | Modify fulfillment payload |
signifyd_api_key | Filter | $key, $env | Override API key |
signifyd_api_url | Filter | $url | Override API URL |
signifyd_decision_status_map | Filter | $map | Custom status mapping |
Next Steps
- Technical Architecture — Understanding the codebase
- Configuration — Settings reference
- Installation — Setup guide