name: frappe-webhook-manager description: Create webhook handlers for Frappe integrations. Use when implementing webhooks, event-driven integrations, or external system notifications.
Frappe Webhook Manager
Generate secure webhook receivers and senders for Frappe integrations with external systems.
When to Use This Skill
Claude should invoke this skill when:
- User wants to receive webhooks from external services
- User needs to send webhooks to external systems
- User mentions webhook, event-driven integration, or external notifications
- User wants to integrate payment gateways, APIs, or third-party services
- User needs to handle real-time events from external systems
Capabilities
1. Webhook Receiver
Secure Webhook Endpoint:
import frappe
import hmac
import hashlib
@frappe.whitelist(allow_guest=True)
def webhook_receiver():
"""Receive webhook from external service"""
# Get signature
signature = frappe.get_request_header('X-Webhook-Signature')
# Verify signature
secret = frappe.conf.get('webhook_secret')
expected = hmac.new(
secret.encode(),
frappe.request.data,
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
frappe.throw(_('Invalid signature'), frappe.AuthenticationError)
# Parse payload
payload = frappe.parse_json(frappe.request.data)
# Process webhook
event = payload.get('event')
if event == 'payment.success':
handle_payment_success(payload)
elif event == 'customer.updated':
handle_customer_update(payload)
return {'status': 'success'}
2. Outgoing Webhook
Send Webhook on Document Event:
class SalesInvoice(Document):
def on_submit(self):
# Send webhook on submission
send_webhook('invoice.submitted', self.as_dict())
def send_webhook(event, data):
"""Send webhook to external system"""
webhook_url = frappe.conf.get('external_webhook_url')
payload = {
'event': event,
'data': data,
'timestamp': frappe.utils.now()
}
# Enqueue for async processing
frappe.enqueue(
'_send_webhook',
webhook_url=webhook_url,
payload=payload,
queue='short'
)
def _send_webhook(webhook_url, payload):
"""Send webhook with retry logic"""
import requests
for attempt in range(3):
try:
response = requests.post(
webhook_url,
json=payload,
headers={'Content-Type': 'application/json'},
timeout=10
)
if response.status_code == 200:
return True
except Exception as e:
if attempt == 2:
frappe.log_error(frappe.get_traceback(),
f"Webhook Failed: {webhook_url}")
return False
References
Frappe Webhook Implementation: