{"id":7689,"date":"2026-03-04T23:56:51","date_gmt":"2026-03-04T23:56:51","guid":{"rendered":"https:\/\/sweepwidget.com\/docs\/webhooks"},"modified":"2026-03-05T00:39:10","modified_gmt":"2026-03-05T00:39:10","slug":"webhooks","status":"publish","type":"post","link":"https:\/\/sweepwidget.com\/docs\/webhooks","title":{"rendered":"Webhooks Integration Guide"},"content":{"rendered":"\n<div style=\"background:linear-gradient(135deg,#1a1a2e 0%,#2d1b69 100%);border-radius:12px;padding:40px;margin-bottom:32px\">\n<h1 style=\"font-size:36px;color:#ffffff;margin:0 0 12px 0;font-weight:800;letter-spacing:-0.5px\">Webhooks<\/h1>\n<p style=\"font-size:16px;color:#c4b5fd;margin:0 0 24px 0;line-height:1.6\">Receive real-time HTTP POST notifications when users enter your giveaway, complete tasks, or finish all entries. Available on Enterprise plans.<\/p>\n<div style=\"background:#0d0d1a;border-radius:8px;padding:14px 20px;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:14px;color:#a5b4fc;display:flex;align-items:center\"><span style=\"color:#6b7280;margin-right:12px;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:1px\">Plan<\/span><span style=\"color:#e0e7ff;font-weight:500\">Enterprise<\/span><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"overview\" style=\"font-size:24px;color:#1a1a2e;font-weight:700;margin-bottom:16px\">Overview<\/h2>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">SweepWidget provides two ways to receive real-time event data from your giveaways:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Server-side webhooks<\/strong> &#8211; HTTP POST requests sent from our server to yours. Work on both embedded widgets and hosted landing pages. Best for backend workflows like CRM syncing, email triggers, and database updates.<\/li><li><strong>Client-side JavaScript callbacks<\/strong> &#8211; Browser events fired on the page where the widget is loaded. Best for frontend actions like firing tracking pixels, showing custom UI, or triggering analytics events.<\/li><\/ul>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Both systems fire on the same three events and return the same data. You can use one or both depending on your needs.<\/p>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\"><strong>On this page:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"#setup\">Setup<\/a><\/li><li><a href=\"#events\">Events<\/a><\/li><li><a href=\"#payload-format\">Payload Format<\/a><\/li><li><a href=\"#request-headers\">Request Headers<\/a><\/li><li><a href=\"#signature-verification\">Signature Verification<\/a><\/li><li><a href=\"#javascript-callbacks\">JavaScript Callbacks<\/a><\/li><li><a href=\"#signing-secret\">Signing Secret<\/a><\/li><li><a href=\"#troubleshooting\">Troubleshooting<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"setup\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">Setup<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">Server-side webhooks<\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li>Go to <strong>Integrations<\/strong> in your dashboard and click the <strong>Webhooks<\/strong> card.<\/li><li>Enter your endpoint URL (must use HTTPS) and click <strong>Save<\/strong>.<\/li><li>Copy the <strong>Signing Secret<\/strong> to verify webhook signatures on your server.<\/li><\/ol>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Use the <strong>Send Test<\/strong> button to send a test payload and confirm your endpoint is receiving requests.<\/p>\n\n\n\n<div style=\"background:#eff6ff;border-radius:8px;padding:16px 20px;margin:16px 0 24px 0;border-left:4px solid #3b82f6\">\n<p style=\"font-size:14px;color:#1e40af;margin:0;line-height:1.6\"><strong>Note:<\/strong> Webhooks are configured at the account level. Once set up, they fire for all giveaways on your account.<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">JavaScript callbacks<\/h3>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">No dashboard configuration needed. Add an event listener to the page where your SweepWidget is embedded. See the <a href=\"#javascript-callbacks\">JavaScript Callbacks<\/a> section below for code examples.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"events\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">Events<\/h2>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">All three events fire automatically. There is no per-event toggle. Both webhooks and JS callbacks fire on the same events.<\/p>\n\n\n\n<table style=\"width:100%;border-collapse:collapse;font-size:14px;margin-bottom:24px\">\n<thead>\n<tr style=\"background:#f8fafc;border-bottom:2px solid #e2e8f0\">\n<th style=\"padding:12px 16px;text-align:left;font-weight:600;color:#1e293b\">Event<\/th>\n<th style=\"padding:12px 16px;text-align:left;font-weight:600;color:#1e293b\">Fires when<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px\"><code style=\"background:#eef2ff;color:#4338ca;padding:2px 8px;border-radius:4px;font-size:13px;font-weight:600\">entry_submitted<\/code><\/td>\n<td style=\"padding:12px 16px;color:#374151\">A user submits the initial entry form (email, name, etc.)<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px\"><code style=\"background:#eef2ff;color:#4338ca;padding:2px 8px;border-radius:4px;font-size:13px;font-weight:600\">task_completed<\/code><\/td>\n<td style=\"padding:12px 16px;color:#374151\">A user completes a bonus entry task (follow, visit, share, etc.)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px\"><code style=\"background:#eef2ff;color:#4338ca;padding:2px 8px;border-radius:4px;font-size:13px;font-weight:600\">all_entries_completed<\/code><\/td>\n<td style=\"padding:12px 16px;color:#374151\">A user has completed every available task in the giveaway<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"payload-format\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">Payload Format<\/h2>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Both webhooks and JS callbacks return the same data for each event. Webhooks wrap the data in an <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">event<\/code> + <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">data<\/code> + <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">timestamp<\/code> envelope. JS callbacks provide the data directly in <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">e.detail<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">entry_submitted<\/h3>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">{\n  \"event\": \"entry_submitted\",\n  \"data\": {\n    \"competition_id\": \"12345\",\n    \"competition_url\": \"my-giveaway\",\n    \"user\": {\n      \"email\": \"user@example.com\",\n      \"name\": \"Jane Smith\",\n      \"phone\": \"+1234567890\",\n      \"birthday\": \"1990-01-15\"\n    },\n    \"custom_fields\": [\n      {\n        \"entry_id\": \"101\",\n        \"field_type\": \"text_input\",\n        \"label\": \"Company Name\",\n        \"value\": \"Acme Corp\"\n      }\n    ],\n    \"entries\": 5,\n    \"referral_url\": \"https:\/\/sweepwidget.com\/c\/my-giveaway-abc123\",\n    \"timestamp\": \"2026-03-04T12:00:00+00:00\"\n  },\n  \"timestamp\": \"2026-03-04T12:00:00+00:00\"\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">task_completed<\/h3>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">{\n  \"event\": \"task_completed\",\n  \"data\": {\n    \"competition_id\": \"12345\",\n    \"competition_url\": \"my-giveaway\",\n    \"user\": {\n      \"email\": \"user@example.com\",\n      \"name\": \"Jane Smith\"\n    },\n    \"task\": {\n      \"entry_id\": \"67\",\n      \"entry_method\": \"Visit a page\",\n      \"entry_group_id\": \"3\"\n    },\n    \"entries\": 10,\n    \"remaining_tasks\": 2,\n    \"timestamp\": \"2026-03-04T12:01:00+00:00\"\n  },\n  \"timestamp\": \"2026-03-04T12:01:00+00:00\"\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">all_entries_completed<\/h3>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">{\n  \"event\": \"all_entries_completed\",\n  \"data\": {\n    \"competition_id\": \"12345\",\n    \"competition_url\": \"my-giveaway\",\n    \"user\": {\n      \"email\": \"user@example.com\",\n      \"name\": \"Jane Smith\"\n    },\n    \"entries\": 25,\n    \"timestamp\": \"2026-03-04T12:02:00+00:00\"\n  },\n  \"timestamp\": \"2026-03-04T12:02:00+00:00\"\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"request-headers\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">Request Headers<\/h2>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Each webhook HTTP request includes these headers:<\/p>\n\n\n\n<table style=\"width:100%;border-collapse:collapse;font-size:14px;margin-bottom:24px\">\n<thead>\n<tr style=\"background:#f8fafc;border-bottom:2px solid #e2e8f0\">\n<th style=\"padding:12px 16px;text-align:left;font-weight:600;color:#1e293b\">Header<\/th>\n<th style=\"padding:12px 16px;text-align:left;font-weight:600;color:#1e293b\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px\"><code style=\"background:#eef2ff;color:#4338ca;padding:2px 8px;border-radius:4px;font-size:13px;font-weight:600\">Content-Type<\/code><\/td>\n<td style=\"padding:12px 16px;color:#374151\">application\/json<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px\"><code style=\"background:#eef2ff;color:#4338ca;padding:2px 8px;border-radius:4px;font-size:13px;font-weight:600\">X-SweepWidget-Signature<\/code><\/td>\n<td style=\"padding:12px 16px;color:#374151\">HMAC-SHA256 signature of the payload body, prefixed with <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">sha256=<\/code><\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px\"><code style=\"background:#eef2ff;color:#4338ca;padding:2px 8px;border-radius:4px;font-size:13px;font-weight:600\">X-SweepWidget-Event<\/code><\/td>\n<td style=\"padding:12px 16px;color:#374151\">The event name (e.g. <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">entry_submitted<\/code>)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px\"><code style=\"background:#eef2ff;color:#4338ca;padding:2px 8px;border-radius:4px;font-size:13px;font-weight:600\">User-Agent<\/code><\/td>\n<td style=\"padding:12px 16px;color:#374151\">SweepWidget-Webhook\/1.0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"signature-verification\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">Signature Verification<\/h2>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Always verify the <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">X-SweepWidget-Signature<\/code> header to confirm the request came from SweepWidget. Compute an HMAC-SHA256 hash of the raw request body using your signing secret and compare it to the signature in the header.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">PHP<\/h3>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">$payload = file_get_contents('php:\/\/input');\n$signature = $_SERVER['HTTP_X_SWEEPWIDGET_SIGNATURE'] ?? '';\n$secret = 'whsec_your_signing_secret';\n\n$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);\n\nif (!hash_equals($expected, $signature)) {\n    http_response_code(401);\n    exit('Invalid signature');\n}\n\n$event = json_decode($payload, true);\n\/\/ Process the event...<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">Node.js<\/h3>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">const crypto = require('crypto');\n\napp.post('\/webhook', express.raw({ type: 'application\/json' }), (req, res) =&gt; {\n  const signature = req.headers['x-sweepwidget-signature'] || '';\n  const secret = 'whsec_your_signing_secret';\n\n  const expected = 'sha256=' + crypto\n    .createHmac('sha256', secret)\n    .update(req.body)\n    .digest('hex');\n\n  if (signature !== expected) {\n    return res.status(401).send('Invalid signature');\n  }\n\n  const event = JSON.parse(req.body);\n  \/\/ Process the event...\n  res.sendStatus(200);\n});<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"javascript-callbacks\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">JavaScript Callbacks<\/h2>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">SweepWidget fires client-side JavaScript events whenever a user enters your giveaway, completes a task, or finishes all entries. These events work on both embedded widgets (via postMessage relay from the iframe to the parent page) and hosted landing pages (via CustomEvent on the window).<\/p>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">No dashboard configuration is required. Just add a listener to the page where your widget is embedded. The event data is identical to the webhook payload data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">Method 1: Individual event listeners<\/h3>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Listen for specific events by name. The event data is available in <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">e.detail<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">window.addEventListener('sweepwidget.entry_submitted', function(e) {\n  console.log(e.detail.user.email);       \/\/ \"user@example.com\"\n  console.log(e.detail.user.name);        \/\/ \"Jane Smith\"\n  console.log(e.detail.entries);           \/\/ 5\n  console.log(e.detail.custom_fields);     \/\/ [{entry_id, field_type, label, value}]\n  console.log(e.detail.referral_url);      \/\/ \"https:\/\/sweepwidget.com\/c\/...\"\n});\n\nwindow.addEventListener('sweepwidget.task_completed', function(e) {\n  console.log(e.detail.task.entry_method); \/\/ \"Visit a page\"\n  console.log(e.detail.remaining_tasks);   \/\/ 2\n});\n\nwindow.addEventListener('sweepwidget.all_entries_completed', function(e) {\n  console.log(e.detail.entries);           \/\/ 25\n});<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">Method 2: Catch-all event listener<\/h3>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Listen for all SweepWidget events with a single listener. The event name and data are in <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">e.detail.event<\/code> and <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">e.detail.data<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">window.addEventListener('sweepwidget', function(e) {\n  console.log('Event:', e.detail.event);   \/\/ \"sweepwidget.entry_submitted\"\n  console.log('Data:', e.detail.data);     \/\/ {competition_id, user, entries, ...}\n});<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">Method 3: Global callback function<\/h3>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">Define a global function that will be called for every event. This works even if you add it before the SweepWidget script loads.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">window.SweepWidgetCallback = function(eventName, eventData) {\n  \/\/ eventName: \"sweepwidget.entry_submitted\"\n  \/\/ eventData: {competition_id, user, entries, custom_fields, ...}\n  console.log(eventName, eventData);\n};<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">Example: Fire a Meta\/Facebook pixel event on entry<\/h3>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">window.addEventListener('sweepwidget.entry_submitted', function(e) {\n  fbq('track', 'Lead', {\n    content_name: e.detail.competition_url,\n    value: e.detail.entries,\n    currency: 'USD'\n  });\n});<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;color:#1a1a2e;margin:32px 0 12px 0;font-weight:700\">Example: Google Analytics event on entry<\/h3>\n\n\n\n<pre class=\"wp-block-code\" style=\"background:#1e1e2e;border-radius:8px;padding:20px 24px;margin:16px 0;overflow-x:auto;border:none\"><code style=\"color:#cdd6f4;font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:13px;line-height:1.6\">window.addEventListener('sweepwidget.entry_submitted', function(e) {\n  gtag('event', 'giveaway_entry', {\n    competition_id: e.detail.competition_id,\n    email: e.detail.user.email\n  });\n});<\/code><\/pre>\n\n\n\n<div style=\"background:#eff6ff;border-radius:8px;padding:16px 20px;margin:16px 0 24px 0;border-left:4px solid #3b82f6\">\n<p style=\"font-size:14px;color:#1e40af;margin:0;line-height:1.6\"><strong>Embedded widgets:<\/strong> Events are sent from the iframe to the parent page via <code>postMessage<\/code>. The SweepWidget embed script automatically relays them as CustomEvents on the parent window, so your listeners work without any extra setup.<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"signing-secret\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">Signing Secret<\/h2>\n\n\n\n<p style=\"font-size:15px;color:#374151;line-height:1.7;margin-bottom:16px\">A signing secret is generated automatically when you first save a webhook URL. You can regenerate it at any time from the Webhooks settings page by clicking <strong>Regenerate Secret<\/strong>.<\/p>\n\n\n\n<div style=\"background:#fef2f2;border-radius:8px;padding:16px 20px;margin:16px 0 24px 0;border-left:4px solid #dc2626\">\n<p style=\"font-size:14px;color:#991b1b;margin:0;line-height:1.6\"><strong>Important:<\/strong> Regenerating your secret immediately invalidates the old one. Update your server with the new secret right away to avoid rejected webhooks.<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"troubleshooting\" style=\"font-size:24px;color:#1a1a2e;padding-top:40px;margin-top:40px;border-top:1px solid #e5e7eb;font-weight:700\">Troubleshooting<\/h2>\n\n\n\n<table style=\"width:100%;border-collapse:collapse;font-size:14px;margin-bottom:24px\">\n<thead>\n<tr style=\"background:#f8fafc;border-bottom:2px solid #e2e8f0\">\n<th style=\"padding:12px 16px;text-align:left;font-weight:600;color:#1e293b\">Issue<\/th>\n<th style=\"padding:12px 16px;text-align:left;font-weight:600;color:#1e293b\">Solution<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px;color:#374151\">Not receiving webhooks<\/td>\n<td style=\"padding:12px 16px;color:#374151\">Confirm your URL starts with <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">https:\/\/<\/code> and your endpoint returns a 2xx status code. Use the Test button to verify.<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px;color:#374151\">Signature mismatch<\/td>\n<td style=\"padding:12px 16px;color:#374151\">Make sure you are hashing the raw request body (not a parsed\/re-serialized version). Check that your secret matches the one shown in settings.<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px;color:#374151\">Timeouts<\/td>\n<td style=\"padding:12px 16px;color:#374151\">SweepWidget waits up to 5 seconds for a response. Return a 200 immediately and process the data asynchronously if your logic takes longer.<\/td>\n<\/tr>\n<tr style=\"border-bottom:1px solid #e2e8f0\">\n<td style=\"padding:12px 16px;color:#374151\">JS callbacks not firing (embedded)<\/td>\n<td style=\"padding:12px 16px;color:#374151\">Make sure you are using the SweepWidget <code style=\"background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;color:#7c3aed\">&lt;script&gt;<\/code> embed code, not a raw iframe. The embed script handles the postMessage relay. Add your event listeners before the embed script loads.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;color:#374151\">JS callbacks not firing (hosted)<\/td>\n<td style=\"padding:12px 16px;color:#374151\">On hosted landing pages, JS callbacks fire as CustomEvents on the window. You need to inject custom JavaScript on the page to listen for them. Verify your account is on an Enterprise plan.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Webhooks Receive real-time HTTP POST notifications when users enter your giveaway, complete tasks, or finish all entries. Available on Enterprise plans. PlanEnterprise Overview SweepWidget provides two ways to receive real-time event data from your giveaways: Server-side webhooks &#8211; HTTP POST requests sent from our server to yours. Work on both embedded widgets and hosted landing pages. Best for backend workflows like CRM syncing, email triggers, and database updates. Client-side JavaScript callbacks &#8211; Browser events fired on the page where the widget is loaded. Best for frontend actions like firing tracking pixels, showing custom UI, or triggering analytics events. Both systems fire on the same three events and return the same data. You can use one or both depending on your needs. On this page: Setup Events Payload Format Request Headers Signature Verification JavaScript Callbacks Signing Secret Troubleshooting Setup Server-side webhooks Go to Integrations in your dashboard and click the Webhooks card. Enter your endpoint URL (must use HTTPS) and click Save. Copy the Signing Secret to verify webhook signatures on your server. Use the Send Test button to send a test payload and confirm your endpoint is receiving requests. Note: Webhooks are configured at the account level. Once set up, they fire for all giveaways on your account. JavaScript callbacks No dashboard configuration needed. Add an event listener to the page where your SweepWidget is embedded. See the JavaScript Callbacks section below for code examples. Events All three events fire automatically. There is no per-event toggle. Both webhooks and JS callbacks fire on the same events. Event Fires when entry_submitted A user submits the initial entry form (email, name, etc.) task_completed A user completes a bonus entry task (follow, visit, share, etc.) all_entries_completed A user has completed every available task in the giveaway Payload Format Both webhooks and JS callbacks return the same data for each event. Webhooks wrap the data in an event + data + timestamp envelope. JS callbacks provide the data directly in e.detail. entry_submitted task_completed all_entries_completed Request Headers Each webhook HTTP request includes these headers: Header Description Content-Type application\/json X-SweepWidget-Signature HMAC-SHA256 signature of the payload body, prefixed with sha256= X-SweepWidget-Event The event name (e.g. entry_submitted) User-Agent SweepWidget-Webhook\/1.0 Signature Verification Always verify the X-SweepWidget-Signature header to confirm the request came from SweepWidget. Compute an HMAC-SHA256 hash of the raw request body using your signing secret and compare it to the signature in the header. PHP Node.js JavaScript Callbacks SweepWidget fires client-side JavaScript events whenever a user enters your giveaway, completes a task, or finishes all entries. These events work on both embedded widgets (via postMessage relay from the iframe to the parent page) and hosted landing pages (via CustomEvent on the window). No dashboard configuration is required. Just add a listener to the page where your widget is embedded. The event data is identical to the webhook payload data. Method 1: Individual event listeners Listen for specific events by name. The event data is available in e.detail. Method 2: Catch-all event listener Listen for all SweepWidget events with a single listener. The event name and data are in e.detail.event and e.detail.data. Method 3: Global callback function Define a global function that will be called for every event. This works even if you add it before the SweepWidget script loads. Example: Fire a Meta\/Facebook pixel event on entry Example: Google Analytics event on entry Embedded widgets: Events are sent from the iframe to the parent page via postMessage. The SweepWidget embed script automatically relays them as CustomEvents on the parent window, so your listeners work without any extra setup. Signing Secret A signing secret is generated automatically when you first save a webhook URL. You can regenerate it at any time from the Webhooks settings page by clicking Regenerate Secret. Important: Regenerating your secret immediately invalidates the old one. Update your server with the new secret right away to avoid rejected webhooks. Troubleshooting Issue Solution Not receiving webhooks Confirm your URL starts with https:\/\/ and your endpoint returns a 2xx status code. Use the Test button to verify. Signature mismatch Make sure you are hashing the raw request body (not a parsed\/re-serialized version). Check that your secret matches the one shown in settings. Timeouts SweepWidget waits up to 5 seconds for a response. Return a 200 immediately and process the data asynchronously if your logic takes longer. JS callbacks not firing (embedded) Make sure you are using the SweepWidget &lt;script&gt; embed code, not a raw iframe. The embed script handles the postMessage relay. Add your event listeners before the embed script loads. JS callbacks not firing (hosted) On hosted landing pages, JS callbacks fire as CustomEvents on the window. You need to inject custom JavaScript on the page to listen for them. Verify your account is on an Enterprise plan.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59],"tags":[],"class_list":["post-7689","post","type-post","status-publish","format-standard","hentry","category-integrations"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Webhooks Integration Guide - SweepWidget Help Docs<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sweepwidget.com\/docs\/webhooks\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Webhooks Integration Guide - SweepWidget Help Docs\" \/>\n<meta property=\"og:description\" content=\"Webhooks Receive real-time HTTP POST notifications when users enter your giveaway, complete tasks, or finish all entries. Available on Enterprise plans. PlanEnterprise Overview SweepWidget provides two ways to receive real-time event data from your giveaways: Server-side webhooks &#8211; HTTP POST requests sent from our server to yours. Work on both embedded widgets and hosted landing pages. Best for backend workflows like CRM syncing, email triggers, and database updates. Client-side JavaScript callbacks &#8211; Browser events fired on the page where the widget is loaded. Best for frontend actions like firing tracking pixels, showing custom UI, or triggering analytics events. Both systems fire on the same three events and return the same data. You can use one or both depending on your needs. On this page: Setup Events Payload Format Request Headers Signature Verification JavaScript Callbacks Signing Secret Troubleshooting Setup Server-side webhooks Go to Integrations in your dashboard and click the Webhooks card. Enter your endpoint URL (must use HTTPS) and click Save. Copy the Signing Secret to verify webhook signatures on your server. Use the Send Test button to send a test payload and confirm your endpoint is receiving requests. Note: Webhooks are configured at the account level. Once set up, they fire for all giveaways on your account. JavaScript callbacks No dashboard configuration needed. Add an event listener to the page where your SweepWidget is embedded. See the JavaScript Callbacks section below for code examples. Events All three events fire automatically. There is no per-event toggle. Both webhooks and JS callbacks fire on the same events. Event Fires when entry_submitted A user submits the initial entry form (email, name, etc.) task_completed A user completes a bonus entry task (follow, visit, share, etc.) all_entries_completed A user has completed every available task in the giveaway Payload Format Both webhooks and JS callbacks return the same data for each event. Webhooks wrap the data in an event + data + timestamp envelope. JS callbacks provide the data directly in e.detail. entry_submitted task_completed all_entries_completed Request Headers Each webhook HTTP request includes these headers: Header Description Content-Type application\/json X-SweepWidget-Signature HMAC-SHA256 signature of the payload body, prefixed with sha256= X-SweepWidget-Event The event name (e.g. entry_submitted) User-Agent SweepWidget-Webhook\/1.0 Signature Verification Always verify the X-SweepWidget-Signature header to confirm the request came from SweepWidget. Compute an HMAC-SHA256 hash of the raw request body using your signing secret and compare it to the signature in the header. PHP Node.js JavaScript Callbacks SweepWidget fires client-side JavaScript events whenever a user enters your giveaway, completes a task, or finishes all entries. These events work on both embedded widgets (via postMessage relay from the iframe to the parent page) and hosted landing pages (via CustomEvent on the window). No dashboard configuration is required. Just add a listener to the page where your widget is embedded. The event data is identical to the webhook payload data. Method 1: Individual event listeners Listen for specific events by name. The event data is available in e.detail. Method 2: Catch-all event listener Listen for all SweepWidget events with a single listener. The event name and data are in e.detail.event and e.detail.data. Method 3: Global callback function Define a global function that will be called for every event. This works even if you add it before the SweepWidget script loads. Example: Fire a Meta\/Facebook pixel event on entry Example: Google Analytics event on entry Embedded widgets: Events are sent from the iframe to the parent page via postMessage. The SweepWidget embed script automatically relays them as CustomEvents on the parent window, so your listeners work without any extra setup. Signing Secret A signing secret is generated automatically when you first save a webhook URL. You can regenerate it at any time from the Webhooks settings page by clicking Regenerate Secret. Important: Regenerating your secret immediately invalidates the old one. Update your server with the new secret right away to avoid rejected webhooks. Troubleshooting Issue Solution Not receiving webhooks Confirm your URL starts with https:\/\/ and your endpoint returns a 2xx status code. Use the Test button to verify. Signature mismatch Make sure you are hashing the raw request body (not a parsed\/re-serialized version). Check that your secret matches the one shown in settings. Timeouts SweepWidget waits up to 5 seconds for a response. Return a 200 immediately and process the data asynchronously if your logic takes longer. JS callbacks not firing (embedded) Make sure you are using the SweepWidget &lt;script&gt; embed code, not a raw iframe. The embed script handles the postMessage relay. Add your event listeners before the embed script loads. JS callbacks not firing (hosted) On hosted landing pages, JS callbacks fire as CustomEvents on the window. You need to inject custom JavaScript on the page to listen for them. Verify your account is on an Enterprise plan.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sweepwidget.com\/docs\/webhooks\" \/>\n<meta property=\"og:site_name\" content=\"SweepWidget Help Docs\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-04T23:56:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-05T00:39:10+00:00\" \/>\n<meta name=\"author\" content=\"SweepWidget\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"SweepWidget\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks\"},\"author\":{\"name\":\"SweepWidget\",\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/#\\\/schema\\\/person\\\/4cca2bc9c600116750eca1bfff6648e0\"},\"headline\":\"Webhooks Integration Guide\",\"datePublished\":\"2026-03-04T23:56:51+00:00\",\"dateModified\":\"2026-03-05T00:39:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks\"},\"wordCount\":778,\"articleSection\":[\"Integrations\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks\",\"url\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks\",\"name\":\"Webhooks Integration Guide - SweepWidget Help Docs\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/#website\"},\"datePublished\":\"2026-03-04T23:56:51+00:00\",\"dateModified\":\"2026-03-05T00:39:10+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/#\\\/schema\\\/person\\\/4cca2bc9c600116750eca1bfff6648e0\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/webhooks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webhooks Integration Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/#website\",\"url\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/\",\"name\":\"SweepWidget Help Docs\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/#\\\/schema\\\/person\\\/4cca2bc9c600116750eca1bfff6648e0\",\"name\":\"SweepWidget\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/08ae098bc2290a9a645af1c26ddd7704f98d09c88bf65a55b5c4bc1e585f31f4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/08ae098bc2290a9a645af1c26ddd7704f98d09c88bf65a55b5c4bc1e585f31f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/08ae098bc2290a9a645af1c26ddd7704f98d09c88bf65a55b5c4bc1e585f31f4?s=96&d=mm&r=g\",\"caption\":\"SweepWidget\"},\"sameAs\":[\"https:\\\/\\\/sweepwidget.com\\\/docs\"],\"url\":\"https:\\\/\\\/sweepwidget.com\\\/docs\\\/author\\\/sweepwidget\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Webhooks Integration Guide - SweepWidget Help Docs","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sweepwidget.com\/docs\/webhooks","og_locale":"en_US","og_type":"article","og_title":"Webhooks Integration Guide - SweepWidget Help Docs","og_description":"Webhooks Receive real-time HTTP POST notifications when users enter your giveaway, complete tasks, or finish all entries. Available on Enterprise plans. PlanEnterprise Overview SweepWidget provides two ways to receive real-time event data from your giveaways: Server-side webhooks &#8211; HTTP POST requests sent from our server to yours. Work on both embedded widgets and hosted landing pages. Best for backend workflows like CRM syncing, email triggers, and database updates. Client-side JavaScript callbacks &#8211; Browser events fired on the page where the widget is loaded. Best for frontend actions like firing tracking pixels, showing custom UI, or triggering analytics events. Both systems fire on the same three events and return the same data. You can use one or both depending on your needs. On this page: Setup Events Payload Format Request Headers Signature Verification JavaScript Callbacks Signing Secret Troubleshooting Setup Server-side webhooks Go to Integrations in your dashboard and click the Webhooks card. Enter your endpoint URL (must use HTTPS) and click Save. Copy the Signing Secret to verify webhook signatures on your server. Use the Send Test button to send a test payload and confirm your endpoint is receiving requests. Note: Webhooks are configured at the account level. Once set up, they fire for all giveaways on your account. JavaScript callbacks No dashboard configuration needed. Add an event listener to the page where your SweepWidget is embedded. See the JavaScript Callbacks section below for code examples. Events All three events fire automatically. There is no per-event toggle. Both webhooks and JS callbacks fire on the same events. Event Fires when entry_submitted A user submits the initial entry form (email, name, etc.) task_completed A user completes a bonus entry task (follow, visit, share, etc.) all_entries_completed A user has completed every available task in the giveaway Payload Format Both webhooks and JS callbacks return the same data for each event. Webhooks wrap the data in an event + data + timestamp envelope. JS callbacks provide the data directly in e.detail. entry_submitted task_completed all_entries_completed Request Headers Each webhook HTTP request includes these headers: Header Description Content-Type application\/json X-SweepWidget-Signature HMAC-SHA256 signature of the payload body, prefixed with sha256= X-SweepWidget-Event The event name (e.g. entry_submitted) User-Agent SweepWidget-Webhook\/1.0 Signature Verification Always verify the X-SweepWidget-Signature header to confirm the request came from SweepWidget. Compute an HMAC-SHA256 hash of the raw request body using your signing secret and compare it to the signature in the header. PHP Node.js JavaScript Callbacks SweepWidget fires client-side JavaScript events whenever a user enters your giveaway, completes a task, or finishes all entries. These events work on both embedded widgets (via postMessage relay from the iframe to the parent page) and hosted landing pages (via CustomEvent on the window). No dashboard configuration is required. Just add a listener to the page where your widget is embedded. The event data is identical to the webhook payload data. Method 1: Individual event listeners Listen for specific events by name. The event data is available in e.detail. Method 2: Catch-all event listener Listen for all SweepWidget events with a single listener. The event name and data are in e.detail.event and e.detail.data. Method 3: Global callback function Define a global function that will be called for every event. This works even if you add it before the SweepWidget script loads. Example: Fire a Meta\/Facebook pixel event on entry Example: Google Analytics event on entry Embedded widgets: Events are sent from the iframe to the parent page via postMessage. The SweepWidget embed script automatically relays them as CustomEvents on the parent window, so your listeners work without any extra setup. Signing Secret A signing secret is generated automatically when you first save a webhook URL. You can regenerate it at any time from the Webhooks settings page by clicking Regenerate Secret. Important: Regenerating your secret immediately invalidates the old one. Update your server with the new secret right away to avoid rejected webhooks. Troubleshooting Issue Solution Not receiving webhooks Confirm your URL starts with https:\/\/ and your endpoint returns a 2xx status code. Use the Test button to verify. Signature mismatch Make sure you are hashing the raw request body (not a parsed\/re-serialized version). Check that your secret matches the one shown in settings. Timeouts SweepWidget waits up to 5 seconds for a response. Return a 200 immediately and process the data asynchronously if your logic takes longer. JS callbacks not firing (embedded) Make sure you are using the SweepWidget &lt;script&gt; embed code, not a raw iframe. The embed script handles the postMessage relay. Add your event listeners before the embed script loads. JS callbacks not firing (hosted) On hosted landing pages, JS callbacks fire as CustomEvents on the window. You need to inject custom JavaScript on the page to listen for them. Verify your account is on an Enterprise plan.","og_url":"https:\/\/sweepwidget.com\/docs\/webhooks","og_site_name":"SweepWidget Help Docs","article_published_time":"2026-03-04T23:56:51+00:00","article_modified_time":"2026-03-05T00:39:10+00:00","author":"SweepWidget","twitter_card":"summary_large_image","twitter_misc":{"Written by":"SweepWidget","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sweepwidget.com\/docs\/webhooks#article","isPartOf":{"@id":"https:\/\/sweepwidget.com\/docs\/webhooks"},"author":{"name":"SweepWidget","@id":"https:\/\/sweepwidget.com\/docs\/#\/schema\/person\/4cca2bc9c600116750eca1bfff6648e0"},"headline":"Webhooks Integration Guide","datePublished":"2026-03-04T23:56:51+00:00","dateModified":"2026-03-05T00:39:10+00:00","mainEntityOfPage":{"@id":"https:\/\/sweepwidget.com\/docs\/webhooks"},"wordCount":778,"articleSection":["Integrations"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/sweepwidget.com\/docs\/webhooks","url":"https:\/\/sweepwidget.com\/docs\/webhooks","name":"Webhooks Integration Guide - SweepWidget Help Docs","isPartOf":{"@id":"https:\/\/sweepwidget.com\/docs\/#website"},"datePublished":"2026-03-04T23:56:51+00:00","dateModified":"2026-03-05T00:39:10+00:00","author":{"@id":"https:\/\/sweepwidget.com\/docs\/#\/schema\/person\/4cca2bc9c600116750eca1bfff6648e0"},"breadcrumb":{"@id":"https:\/\/sweepwidget.com\/docs\/webhooks#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sweepwidget.com\/docs\/webhooks"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/sweepwidget.com\/docs\/webhooks#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sweepwidget.com\/docs\/"},{"@type":"ListItem","position":2,"name":"Webhooks Integration Guide"}]},{"@type":"WebSite","@id":"https:\/\/sweepwidget.com\/docs\/#website","url":"https:\/\/sweepwidget.com\/docs\/","name":"SweepWidget Help Docs","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sweepwidget.com\/docs\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/sweepwidget.com\/docs\/#\/schema\/person\/4cca2bc9c600116750eca1bfff6648e0","name":"SweepWidget","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/08ae098bc2290a9a645af1c26ddd7704f98d09c88bf65a55b5c4bc1e585f31f4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/08ae098bc2290a9a645af1c26ddd7704f98d09c88bf65a55b5c4bc1e585f31f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/08ae098bc2290a9a645af1c26ddd7704f98d09c88bf65a55b5c4bc1e585f31f4?s=96&d=mm&r=g","caption":"SweepWidget"},"sameAs":["https:\/\/sweepwidget.com\/docs"],"url":"https:\/\/sweepwidget.com\/docs\/author\/sweepwidget"}]}},"_links":{"self":[{"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/posts\/7689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/comments?post=7689"}],"version-history":[{"count":4,"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/posts\/7689\/revisions"}],"predecessor-version":[{"id":7693,"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/posts\/7689\/revisions\/7693"}],"wp:attachment":[{"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/media?parent=7689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/categories?post=7689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sweepwidget.com\/docs\/wp-json\/wp\/v2\/tags?post=7689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}