Webhooks

FluenzR इवेंट पर रियल-टाइम अधिसूचनाएं प्राप्त करें।

Webhooks

Webhooks आपको FluenzR में इवेंट होने पर रियल-टाइम अधिसूचनाएं प्राप्त करने देते हैं।

जानकारी Webhooks केवल Pro प्लान पर उपलब्ध हैं।

यह कैसे काम करता है

  1. आप FluenzR में एक webhook URL कॉन्फ़िगर करते हैं
  2. जब कोई इवेंट होता है, FluenzR आपके URL पर एक HTTP POST अनुरोध भेजता है
  3. आपका सर्वर इवेंट को प्रोसेस करता है और 2xx कोड के साथ प्रतिक्रिया देता है

उपलब्ध इवेंट

संपर्क

इवेंटविवरण
contact.createdनया संपर्क बनाया गया
contact.updatedसंपर्क अपडेट किया गया
contact.deletedसंपर्क हटाया गया

अभियान

इवेंटविवरण
campaign.startedअभियान प्रारंभ हुआ
campaign.pausedअभियान रोका गया
campaign.completedअभियान पूर्ण हुआ

ईमेल

इवेंटविवरण
email.sentईमेल भेजा गया
email.deliveredईमेल डिलीवर हुआ
email.openedईमेल खोला गया
email.clickedलिंक क्लिक किया गया
email.repliedउत्तर प्राप्त हुआ
email.bouncedबाउंस पाया गया
email.unsubscribedअनसब्सक्राइब

Webhook बनाएं

इंटरफ़ेस के माध्यम से

  1. सेटिंग्स > Webhooks पर जाएं
  2. + नया webhook पर क्लिक करें
  3. URL और इवेंट कॉन्फ़िगर करें
  4. सहेजें

API के माध्यम से

POST /webhooks
{
  "url": "https://your-server.com/webhooks/fluenzr",
  "events": [
    "email.sent",
    "email.opened",
    "email.replied"
  ],
  "secret": "your_webhook_secret"
}

उदाहरण

curl -X POST "https://api.fluenzr.co/v1/webhooks" \
  -H "Authorization: Bearer flz_sk_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-server.com/webhooks/fluenzr",
    "events": ["email.opened", "email.replied"],
    "secret": "whsec_abc123"
  }'

प्रतिक्रिया

{
  "success": true,
  "data": {
    "id": "whk_abc123",
    "url": "https://your-server.com/webhooks/fluenzr",
    "events": ["email.opened", "email.replied"],
    "status": "active",
    "createdAt": "2025-01-15T10:30:00Z"
  }
}

Payload प्रारूप

सामान्य संरचना

{
  "id": "evt_abc123",
  "type": "email.opened",
  "timestamp": "2025-01-15T14:32:00Z",
  "data": {
    // इवेंट-विशिष्ट डेटा
  }
}

email.sent

{
  "id": "evt_abc123",
  "type": "email.sent",
  "timestamp": "2025-01-15T10:00:00Z",
  "data": {
    "campaignId": "cmp_xyz789",
    "campaignName": "Q1 प्रॉस्पेक्टिंग",
    "contactId": "con_def456",
    "contactEmail": "rahul@example.com",
    "emailNodeId": "node_2",
    "emailSubject": "राहुल, त्वरित प्रश्न"
  }
}

email.opened

{
  "id": "evt_abc124",
  "type": "email.opened",
  "timestamp": "2025-01-15T14:32:00Z",
  "data": {
    "campaignId": "cmp_xyz789",
    "contactId": "con_def456",
    "contactEmail": "rahul@example.com",
    "emailNodeId": "node_2",
    "openCount": 1,
    "firstOpen": true,
    "userAgent": "Mozilla/5.0...",
    "ip": "192.168.1.1"
  }
}

email.clicked

{
  "id": "evt_abc125",
  "type": "email.clicked",
  "timestamp": "2025-01-15T14:35:00Z",
  "data": {
    "campaignId": "cmp_xyz789",
    "contactId": "con_def456",
    "contactEmail": "rahul@example.com",
    "emailNodeId": "node_2",
    "linkUrl": "https://fluenzr.co/demo",
    "clickCount": 1
  }
}

email.replied

{
  "id": "evt_abc126",
  "type": "email.replied",
  "timestamp": "2025-01-15T15:10:00Z",
  "data": {
    "campaignId": "cmp_xyz789",
    "contactId": "con_def456",
    "contactEmail": "rahul@example.com",
    "emailNodeId": "node_2",
    "replySubject": "Re: राहुल, त्वरित प्रश्न",
    "replyPreview": "नमस्ते, मुझे इसमें रुचि होगी..."
  }
}

email.bounced

{
  "id": "evt_abc127",
  "type": "email.bounced",
  "timestamp": "2025-01-15T10:05:00Z",
  "data": {
    "campaignId": "cmp_xyz789",
    "contactId": "con_def456",
    "contactEmail": "rahul@example.com",
    "bounceType": "hard",
    "bounceReason": "User unknown"
  }
}

contact.created

{
  "id": "evt_abc128",
  "type": "contact.created",
  "timestamp": "2025-01-15T09:00:00Z",
  "data": {
    "contact": {
      "id": "con_def456",
      "email": "rahul@example.com",
      "firstName": "राहुल",
      "lastName": "शर्मा",
      "company": "Acme Corp"
    }
  }
}

सिग्नेचर सत्यापन

प्रत्येक webhook में इसकी प्रामाणिकता सत्यापित करने के लिए एक सिग्नेचर शामिल होता है।

हेडर

X-FluenzR-Signature: sha256=abc123...
X-FluenzR-Timestamp: 1640000000

सत्यापन (Node.js)

const crypto = require('crypto');

function verifyWebhookSignature(payload, signature, timestamp, secret) {
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(`${timestamp}.${payload}`)
    .digest('hex');

  return `sha256=${expectedSignature}` === signature;
}

// आपके एंडपॉइंट में
app.post('/webhooks/fluenzr', (req, res) => {
  const signature = req.headers['x-fluenzr-signature'];
  const timestamp = req.headers['x-fluenzr-timestamp'];
  const payload = JSON.stringify(req.body);

  if (!verifyWebhookSignature(payload, signature, timestamp, WEBHOOK_SECRET)) {
    return res.status(401).send('अमान्य सिग्नेचर');
  }

  // इवेंट प्रोसेस करें
  const event = req.body;
  console.log(`इवेंट प्राप्त: ${event.type}`);

  res.status(200).send('OK');
});

सत्यापन (Python)

import hmac
import hashlib

def verify_webhook_signature(payload, signature, timestamp, secret):
    expected = hmac.new(
        secret.encode(),
        f"{timestamp}.{payload}".encode(),
        hashlib.sha256
    ).hexdigest()

    return f"sha256={expected}" == signature

# आपके Flask एंडपॉइंट में
@app.route('/webhooks/fluenzr', methods=['POST'])
def handle_webhook():
    signature = request.headers.get('X-FluenzR-Signature')
    timestamp = request.headers.get('X-FluenzR-Timestamp')
    payload = request.get_data(as_text=True)

    if not verify_webhook_signature(payload, signature, timestamp, WEBHOOK_SECRET):
        return 'अमान्य सिग्नेचर', 401

    event = request.get_json()
    print(f"इवेंट प्राप्त: {event['type']}")

    return 'OK', 200

पुनः प्रयास हैंडलिंग

FluenzR विफल webhooks को स्वचालित रूप से पुनः प्रयास करता है:

प्रयासविलंब
1तुरंत
21 मिनट
35 मिनट
430 मिनट
52 घंटे

5 विफलताओं के बाद, webhook को "failed" के रूप में चिह्नित किया जाता है।

सफलता कोड

आपके सर्वर को 30 सेकंड के भीतर HTTP 2xx कोड के साथ प्रतिक्रिया देनी चाहिए।

कोडपरिणाम
200-299सफलता
3xxपुनः प्रयास
4xxस्थायी विफलता
5xxपुनः प्रयास
टाइमआउटपुनः प्रयास

Webhooks प्रबंधित करें

Webhooks सूचीबद्ध करें

GET /webhooks

Webhook अपडेट करें

PUT /webhooks/:id
{
  "events": ["email.opened", "email.replied", "email.clicked"]
}

Webhook हटाएं

DELETE /webhooks/:id

Webhook का परीक्षण करें

POST /webhooks/:id/test

आपके URL पर एक टेस्ट इवेंट भेजता है।

लॉग देखें

GET /webhooks/:id/logs

डिलीवरी प्रयास इतिहास प्राप्त करता है।

{
  "success": true,
  "data": [
    {
      "id": "log_abc123",
      "eventId": "evt_xyz789",
      "eventType": "email.opened",
      "status": "delivered",
      "statusCode": 200,
      "responseTime": 145,
      "timestamp": "2025-01-15T14:32:00Z"
    }
  ]
}

सर्वोत्तम अभ्यास

जल्दी प्रतिक्रिया दें

आपके एंडपॉइंट को 30 सेकंड से कम में प्रतिक्रिया देनी चाहिए। यदि आवश्यक हो तो बैकग्राउंड में प्रोसेस करें।

इडम्पोटेंस

आपके कोड को डुप्लिकेट इवेंट को संभालना चाहिए। डीडुप्लिकेट करने के लिए इवेंट ID का उपयोग करें।

मॉनिटरिंग

अपने webhooks की निगरानी करें:

  • सफलता दर
  • प्रतिक्रिया समय
  • बार-बार होने वाली त्रुटियां

सुरक्षा

  • हमेशा सिग्नेचर सत्यापित करें
  • केवल HTTPS का उपयोग करें
  • टाइमस्टैम्प को मान्य करें (>5 मिनट होने पर अस्वीकार करें)