bluebarry.
ReviewsPricingResources
Sign inBook demoBook a 15 min demo
Help Center/Developer platform/Webhook payload reference

Webhook payload reference

Martijn Douma
Martijn Douma · Co-founder bluebarry
Updated October 2, 2026

Webhooks send quiz activity to your own endpoint the moment it happens. This reference lists the topics, the fields in each payload and how delivery works. To create a webhook, go to Integrations → Developer area → Webhooks and see setting up webhooks.

Topics

Webhook topics
TopicSent whenNarrow it to
question.answeredA shopper answers a quiz question. One call per selected answer.A quiz, a question or one answer
result.viewedA shopper sees their quiz results.A quiz
profile.updatedA profile is created or updated by quiz activity.A quiz
email.submittedA shopper fills in an email question.A quiz
phone.submittedA shopper fills in a phone number question.A quiz

When you pick a quiz, question or answer while creating the webhook, it only fires for that. The topic field in the payload carries the full topic, for example question.answered.<quizId>.<questionId>.<answerId>.

Payload fields

All payloads are JSON with camelCase field names. Every payload has topic, advisorId (the quiz), sessionId and userId (the visitor), except profile.updated, which has profileId instead of advisorId.

Fields per topic
TopicOther fields
question.answeredquestionId, questionName, selectedAnswerId, selectedAnswerLabel, selectedAnswerValue, selectedAnswerTextValue, selectedAnswerFormattedValue, isEmail, isPhone, consentAccepted
result.viewedemail and phoneNumber when known; questions[] with each question's answers (the same answer fields as above plus selectedAnswerTopic); results[] with productId, productName, productUrl, productImageUrl and every product property
profile.updatedemail, phoneNumber, firstName, lastName, consentAccepted, consentDate, properties[] (name and value), recommendations[] (position, title, url, imageUrl, quizName and the product's properties), createdDate, updatedDate, triggerEvent
email.submittedquestionId, questionName, email, selectedAnswerId, selectedAnswerLabel, consentAccepted
phone.submittedquestionId, questionName, phoneNumber, selectedAnswerId, selectedAnswerLabel, consentAccepted

Product properties use your property names with a lowercase first letter, such as brand or skinType. Phone numbers are in international format, for example +31612345678.

Example: question.answered
{
  "topic": "question.answered.3f2c….9a1e….c07b…",
  "advisorId": "3f2c…",
  "sessionId": "d41a…",
  "userId": "7b90…",
  "questionId": "9a1e…",
  "questionName": "skin_type",
  "selectedAnswerId": "c07b…",
  "selectedAnswerLabel": "dry",
  "selectedAnswerValue": null,
  "selectedAnswerTextValue": null,
  "selectedAnswerFormattedValue": "dry",
  "isEmail": false,
  "isPhone": false,
  "consentAccepted": null
}

In Studio, the example payload for each topic is one click away in the Webhooks section.

The Example payload dialog for the phone.submitted topic.

Delivery

  • bluebarry sends a POST with Content-Type: application/json and any custom headers you added to the webhook.
  • Each event has an Idempotency-Key header. A retried delivery reuses the same key, so store it and skip keys you have already processed.
  • Every request carries a bluebarry-signature header, so you can check that it comes from bluebarry. See Verify signatures below.
  • Any 2xx response counts as delivered. Each attempt is listed under Delivery Attempts, where you can view the payload and retry it.
  • Answer 410 Gone to switch a webhook off. A webhook that keeps failing for more than two days is switched off automatically.

Verify signatures

Every webhook has its own signing secret, starting with whsec_. Studio shows it once, right after you create the webhook. If you lose it, open the webhook's edit dialog and click Rotate secret to get a new one. The old secret stops working right away, so update your endpoint straight after.

The bluebarry-signature header looks like t=1700000000,v1=5257a869…. t is the time of sending in Unix seconds. v1 is an HMAC-SHA256 of the timestamp, a period and the raw request body, keyed with your signing secret and written in lowercase hex. To check a request:

  1. Read the raw request body before you parse it. Parsing the JSON and writing it out again changes the bytes, and the signature no longer matches.
  2. Split the header on commas and take the t and v1 values.
  3. Compute HMAC-SHA256 of {t}.{raw body}, using the full signing secret, including whsec_, as the key.
  4. Compare the result with v1 using a constant-time comparison.
  5. Reject the request when t is more than five minutes away from your server's clock. This stops someone from replaying an old request.

A retried delivery is signed again with a new timestamp, and keeps its Idempotency-Key.

Example: verify a request in Node.js with Express
import crypto from "node:crypto";
import express from "express";

const app = express();
const secret = process.env.BLUEBARRY_WEBHOOK_SECRET; // whsec_…

app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
  const header = req.get("bluebarry-signature") ?? "";
  const { t, v1 } = Object.fromEntries(header.split(",").map((part) => part.split("=")));
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${t}.${req.body}`)
    .digest("hex");
  const valid =
    typeof v1 === "string" &&
    v1.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
  if (!valid || !fresh) return res.sendStatus(401);

  const event = JSON.parse(req.body);
  // Handle the event here.
  res.sendStatus(200);
});

Related articles

Set up webhooks

Send quiz answers, results, profile updates and submitted emails or phone numbers to any URL, with signed requests, custom headers, delivery logs and retries.

Read article →

Get quiz events from the API

Which quiz events bluebarry records, how to read them from the Data API with an API key, and other ways to receive them such as webhooks and GA4.

Read article →

API authentication overview

Choose between an API key, an OAuth token and your Tenant ID for the bluebarry Data API, see how to send each, and keep your credentials safe.

Read article →

Can’t figure it out? We probably can.

Every article here was written by the people who built the product. If one of them still leaves you stuck, tell us and we’ll fix it.

Contact usJoin Discord, free forever
bluebarry.

Helping beauty, health and outdoor brands reach their dream AOV

[email protected]+31 6 57 16 10 87De Ried 10, 9285KK Buitenpost (The Netherlands)
Martijn DoumaStan van RooyAnco PostmaJelmer Reitsma

The guys that are increasing your AOV.

Platform
Quiz funnelsLanding pagesProduct QuizRecommendationsSearchIntegrationsPricing
Resources
CasesHelp centerFAQCompare
Company
Contact usPartners & affiliateReviewsRequest demo
Book a 15 min demo
© 2026 bluebarry. All rights reserved.
Privacy PolicyCookie PolicyTerms & Conditions
English/Nederlands/Deutsch
bluebarry