Skip to main content

Webhook Payload Reference

This document provides complete documentation for all webhook payload fields and configurations.

Payload Structure

{
"event": "string",
"timestamp": "ISO 8601 string",
"site_url": "string",
"user": { ... },
"woocommerce": { ... },
"context": { ... },
"device": { ... }
}

Core Fields (Always Included)

Event Metadata

FieldTypeDescriptionExample
eventstringEvent type"user_registered"
timestampstringISO 8601 UTC timestamp"2024-01-15T10:30:00Z"
site_urlstringWordPress site URL"https://yoursite.com"

User Object

Always included in every webhook:

{
"user": {
"id": 123,
"email": "john.smith@gmail.com",
"first_name": "John",
"last_name": "Smith",
"display_name": "John Smith",
"username": "johnsmith",
"role": "customer",
"locale": "en_US",
"google_id": "123456789012345678901",
"avatar_url": "https://lh3.googleusercontent.com/a/...",
"registered_at": "2024-01-15T10:30:00Z",
"login_count": 1,
"ip_address": "192.168.1.1"
}
}

User Fields

FieldTypeDescription
idintegerWordPress user ID
emailstringUser's email address
first_namestringFirst name from Google
last_namestringLast name from Google
display_namestringFull display name
usernamestringWordPress username
rolestringWordPress role (customer, subscriber, etc.)
localestringUser's locale setting
google_idstringGoogle account identifier
avatar_urlstringGoogle profile picture URL
registered_atstringAccount creation timestamp
login_countintegerTotal Google logins
ip_addressstringUser's IP (can be anonymized)

Optional Sections

Enable these in webhook settings for additional data.

WooCommerce Data

Enable: Check "Include WooCommerce data"

Availability: Only when WooCommerce is active and user has orders.

{
"woocommerce": {
"is_customer": true,
"order_count": 5,
"total_spent": "249.95",
"currency": "USD",
"last_order_date": "2024-01-10T15:45:00Z",
"last_order_id": 456,
"average_order_value": "49.99"
}
}

WooCommerce Fields

FieldTypeDescription
is_customerbooleanHas the Customer role
order_countintegerTotal completed orders
total_spentstringLifetime spend (decimal string)
currencystringStore currency code
last_order_datestringMost recent order timestamp
last_order_idintegerMost recent order ID
average_order_valuestringAverage order amount

Context Data

Enable: Check "Include context data"

{
"context": {
"login_method": "one_tap",
"page_url": "https://yoursite.com/checkout/",
"page_type": "checkout",
"referrer": "https://google.com/",
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "summer_sale"
}
}

Context Fields

FieldTypeDescription
login_methodstring"one_tap" or "button"
page_urlstringURL where login occurred
page_typestringPage type (checkout, cart, my_account, etc.)
referrerstringHTTP referrer
utm_sourcestringUTM source parameter
utm_mediumstringUTM medium parameter
utm_campaignstringUTM campaign parameter
utm_termstringUTM term parameter
utm_contentstringUTM content parameter

Device Data

Enable: Check "Include device data"

{
"device": {
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...",
"is_mobile": false,
"platform": "macOS",
"browser": "Chrome",
"browser_version": "120.0.0"
}
}

Device Fields

FieldTypeDescription
user_agentstringFull user agent string
is_mobilebooleanMobile device detection
platformstringOperating system
browserstringBrowser name
browser_versionstringBrowser version

Event-Specific Examples

user_registered Event

Full payload for new user registration:

{
"event": "user_registered",
"timestamp": "2024-01-15T10:30:00Z",
"site_url": "https://yourstore.com",
"user": {
"id": 789,
"email": "newuser@gmail.com",
"first_name": "Jane",
"last_name": "Doe",
"display_name": "Jane Doe",
"username": "janedoe",
"role": "customer",
"locale": "en_US",
"google_id": "987654321098765432109",
"avatar_url": "https://lh3.googleusercontent.com/a/...",
"registered_at": "2024-01-15T10:30:00Z",
"login_count": 1,
"ip_address": "203.0.113.42"
},
"woocommerce": {
"is_customer": true,
"order_count": 0,
"total_spent": "0.00",
"currency": "USD",
"last_order_date": null,
"last_order_id": null,
"average_order_value": "0.00"
},
"context": {
"login_method": "one_tap",
"page_url": "https://yourstore.com/checkout/",
"page_type": "checkout",
"referrer": "https://google.com/search?q=...",
"utm_source": "google",
"utm_medium": "organic",
"utm_campaign": null
},
"device": {
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0)...",
"is_mobile": true,
"platform": "iOS",
"browser": "Safari",
"browser_version": "17.0"
}
}

user_logged_in Event

Full payload for returning user:

{
"event": "user_logged_in",
"timestamp": "2024-01-20T14:15:00Z",
"site_url": "https://yourstore.com",
"user": {
"id": 789,
"email": "returning@gmail.com",
"first_name": "John",
"last_name": "Smith",
"display_name": "John Smith",
"username": "johnsmith",
"role": "customer",
"locale": "en_US",
"google_id": "123456789012345678901",
"avatar_url": "https://lh3.googleusercontent.com/a/...",
"registered_at": "2024-01-01T09:00:00Z",
"login_count": 15,
"ip_address": "198.51.100.23"
},
"woocommerce": {
"is_customer": true,
"order_count": 8,
"total_spent": "542.80",
"currency": "USD",
"last_order_date": "2024-01-18T11:30:00Z",
"last_order_id": 1234,
"average_order_value": "67.85"
},
"context": {
"login_method": "button",
"page_url": "https://yourstore.com/my-account/",
"page_type": "my_account",
"referrer": "https://yourstore.com/",
"utm_source": null,
"utm_medium": null,
"utm_campaign": null
},
"device": {
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
"is_mobile": false,
"platform": "Windows",
"browser": "Firefox",
"browser_version": "121.0"
}
}

HTTP Headers

Headers sent with every webhook:

HeaderDescriptionExample
Content-TypePayload formatapplication/json
X-OneTap-EventEvent typeuser_registered
X-OneTap-SignatureHMAC signaturesha256=abc123...
X-OneTap-DeliveryUnique delivery ID550e8400-e29b-...
X-OneTap-TimestampUnix timestamp1705315800
User-AgentClient identifierOneTap-Webhook/1.0

Signature Verification

Generate Expected Signature

$payload = file_get_contents('php://input');
$secret = 'your_webhook_secret';
$signature = 'sha256=' . hash_hmac('sha256', $payload, $secret);

Verify Incoming Signature

$received = $_SERVER['HTTP_X_ONETAP_SIGNATURE'];
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $received)) {
http_response_code(401);
die('Invalid signature');
}

Node.js Example

const crypto = require('crypto');

function verifySignature(payload, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');

return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}

Data Types

TypeFormatExample
stringUTF-8"John Smith"
integerNumber123
booleantrue/falsetrue
timestampISO 8601 UTC"2024-01-15T10:30:00Z"
decimalString"99.95"
nullnullnull

Privacy Considerations

IP Anonymization

If GDPR settings enabled, IP may be anonymized:

"ip_address": "203.0.113.0"  // Last octet zeroed

Sensitive Data

  • Email is always included (necessary for identification)
  • Google ID is pseudonymous (doesn't reveal identity alone)
  • User agent may contain device details

GDPR Compliance

When processing webhook data:

  • Store only necessary fields
  • Implement data retention policies
  • Honor deletion requests
  • Document processing purposes

Next Steps