Subscribe to every meaningful change in your Perfex CRM. Three processing modes, automatic retries, and a dead-letter queue — bundled with every PerfexAPI license from $49.
Polling a REST API every minute burns CPU on both ends and leaks the current state of your CRM to anyone watching the wire. Webhooks push a signed payload only when something actually changes — with latencies measured in milliseconds instead of minutes.
PerfexAPI ships 100+ webhook events across all 19 CRM resources. Every event carries the full resource payload, a unique delivery ID, a timestamp, and an HMAC-SHA256 signature so you never have to call back to verify authenticity.
Pick the delivery semantics that match your workload — no other Perfex CRM module offers this.
Fires on the request thread
Lowest latency. Best for low-volume installs or when the receiving endpoint responds in under 100ms.
Debounces rapid events
Collapses repeated events from the same resource within a 2-second window. Ideal for customer-edit flows where users save multiple times.
Background queue worker
Queues delivery to a worker process. Request thread returns immediately. Recommended for production and for downstream endpoints with variable response times.
The most common events are documented below. The module also ships internal events for advanced use cases — the full catalog totals 100+ hooks.
customer.createdA new customer is created
customer.updatedA customer is updated
customer.deletedA customer is deleted
customer.contact_addedA contact is added to a customer
customer.status_changedCustomer status changes
contact.createdA new contact is created
contact.updatedA contact is updated
contact.deletedA contact is deleted
lead.createdA lead is created
lead.updatedA lead is updated
lead.convertedA lead is converted to a customer
lead.status_changedLead status changes
lead.assignedA lead is assigned to staff
invoice.createdAn invoice is created
invoice.updatedAn invoice is updated
invoice.sentAn invoice is sent
invoice.paidAn invoice is paid
invoice.overdueAn invoice becomes overdue
invoice.cancelledAn invoice is cancelled
invoice.status_changedInvoice status changes
invoice.deletedAn invoice is deleted
payment.createdA new payment is recorded
payment.updatedA payment is updated
payment.deletedA payment is deleted
credit_note.createdA credit note is created
credit_note.updatedA credit note is updated
credit_note.deletedA credit note is deleted
credit_note.status_changedCredit note status changes
credit_note.sentA credit note is sent to the client
credit_note.refund_createdA refund is created for a credit note
credit_note.credits_appliedCredits are applied to an invoice
estimate.createdAn estimate is created
estimate.updatedAn estimate is updated
estimate.deletedAn estimate is deleted
estimate.sentAn estimate is sent to the client
estimate.acceptedAn estimate is accepted by the client
estimate.declinedAn estimate is declined by the client
estimate.convertedAn estimate is converted to an invoice
estimate.expiringAn estimate is about to expire
proposal.createdA proposal is created
proposal.updatedA proposal is updated
proposal.deletedA proposal is deleted
proposal.sentA proposal is sent to the client
proposal.acceptedA proposal is accepted
proposal.declinedA proposal is declined
proposal.convertedA proposal is converted to an invoice
proposal.comment_addedA comment is added to a proposal
item.createdA new item/product is created
item.updatedAn item/product is updated
item.deletedAn item/product is deleted
contract.createdA contract is created
contract.updatedA contract is updated
contract.deletedA contract is deleted
contract.signedA contract is signed
contract.expiringA contract is about to expire
contract.expiredA contract expires
contract.renewedA contract is renewed
contract.cancelledA contract is cancelled
project.createdA project is created
project.updatedA project is updated
project.completedA project is completed
project.status_changedProject status changes
task.createdA task is created
task.updatedA task is updated
task.deletedA task is deleted
task.assignedA task is assigned
task.completedA task is completed
task.overdueA task becomes overdue
task.comment_addedA comment is added to a task
task.priority_changedA task priority is changed
task.timesheet_addedA timesheet entry is added to a task
task.status_changedA task status changes
timesheet.createdA timesheet entry is created
timesheet.updatedA timesheet entry is updated
timesheet.deletedA timesheet entry is deleted
ticket.createdA ticket is created
ticket.updatedA ticket is updated
ticket.deletedA ticket is deleted
ticket.assignedA ticket is assigned to staff
ticket.status_changedTicket status changes
ticket.priority_changedTicket priority changes
ticket.reply_addedA reply is added to a ticket
ticket.attachment_addedAn attachment is added to a ticket
ticket.closedA ticket is closed
ticket.reopenedA ticket is reopened
expense.createdA new expense is created
expense.updatedAn expense is updated
expense.deletedAn expense is deleted
note.createdA note is created
note.updatedA note is updated
note.deletedA note is deleted
staff.createdA staff member is created
staff.updatedA staff member is updated
staff.deletedA staff member is deleted
staff.activatedA staff member is activated
staff.deactivatedA staff member is deactivated
staff.permissions_changedStaff permissions are changed
staff.password_changedA staff member password is changed
staff.loginA staff member logs in
subscription.createdA customer subscribes
Every webhook request is signed with your per-endpoint secret. Verify in constant time and reject requests that fail the check.
// Node.js — verify the X-Webhook-Signature header
import crypto from 'crypto';
function verifyWebhook(rawBody, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expected, 'hex'),
);
}
// In your Express handler
app.post('/perfex-webhook', (req, res) => {
const ok = verifyWebhook(
req.rawBody,
req.header('X-Webhook-Signature'),
process.env.PERFEX_WEBHOOK_SECRET,
);
if (!ok) return res.status(401).end();
// ... process req.body.event and req.body.data (payload also carries timestamp, webhook_id, metadata)
res.sendStatus(200);
});PHP and Python equivalents in the docs.
Up to 8 retries at 30s, 1m, 5m, 15m, 1h, 6h, 12h, 24h. Any 2xx response is treated as success; 4xx and 5xx trigger the next retry.
Payloads that exhaust their retries are moved to the DLQ and surfaced in the Webhooks admin page. Replay a single delivery or bulk-replay all failures in one click.
Themesic's separate Webhooks module ships ~35 events for an additional $59. PerfexAPI bundles everything in the $49 base license — and real-time webhooks beat 15-minute Zapier polling every day of the week.
Each webhook request includes an X-Webhook-Signature header with an HMAC-SHA256 of the raw body computed with your per-endpoint secret. Recompute on your side and use a constant-time compare. See the code snippet above.
Up to 8 retries with exponential backoff (30s, 1m, 5m, 15m, 1h, 6h, 12h, 24h). Exhausted payloads move to the dead-letter queue and can be replayed from the admin page.
Immediate fires on the request thread for lowest latency. Smart debounces repeated events within 2 seconds. Async queues delivery to a background worker — recommended for production.
Yes. The free n8n-nodes-perfexcrm community node exposes a PerfexCRM Trigger that listens for every supported event and verifies the HMAC signature automatically.
Bundled free with every PerfexAPI license starting at $49. Competitors sell API and Webhooks as separate $59 modules.
Yes. Each endpoint can hold a primary secret and a grace secret for up to 24 hours. New deliveries sign with the primary; your verifier can accept either during the window.
Install PerfexAPI, create an endpoint, pick a processing mode, and you are live.