What does the RevenueDot webhook event PRICE_INCREASE_CONSENT_APPROVED mean?

The RevenueDot webhook event PRICE_INCREASE_CONSENT_APPROVED means a customer accepted a higher subscription price.

Quick facts#

Event PRICE_INCREASE_CONSENT_APPROVED
Where RevenueDot webhook (event.type), RevenueCat's webhook format
Sent to Every enabled webhook whose filters match
Fields that are specific to it identity, product_id, transaction_id, original_transaction_id, store, environment, currency, country_code
What it means The customer accepted the price increase.

When it is sent#

  • The customer consented to the increase in the store's sheet.
  • On the App Store it can also mean an increase that needed no consent was notified.
  • The subscription renews at the new price.

What your server should do#

  1. Record the new price for revenue reports and stop the reminder.
  2. Do not change access.
  3. Compare accepted and expired customers to learn the effect of the increase.
  4. Deduplicate on event.id: deliveries can repeat, because anything but HTTP 200 is retried after 5, 10, 20, 40 and 80 minutes.

Example#

JavaScript
import { createHmac, timingSafeEqual } from "node:crypto";

// X-RevenueCat-Webhook-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">
function verify(rawBody, header, secret, toleranceSeconds = 300) {
  const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header ?? "");
  if (!m || Math.abs(Date.now() / 1000 - Number(m[1])) > toleranceSeconds) return false;
  const expected = createHmac("sha256", secret).update(`${m[1]}.${rawBody}`).digest();
  return timingSafeEqual(expected, Buffer.from(m[2], "hex"));
}

// Sign a sample delivery the way RevenueDot does, then handle it.
const secret = "whsec_test_secret";
const rawBody = JSON.stringify({ api_version: "1.0", event: {"id":"66339910-3BFF-49F4-B873-D1283D673DE2","type":"PRICE_INCREASE_CONSENT_APPROVED","app_user_id":"user_1","product_id":"pro_monthly","currency":"USD","country_code":"US"} });
const t = Math.floor(Date.now() / 1000);
const header = `t=${t},v1=${createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex")}`;

const seen = new Set(); // use a database table in production

function handle(rawBody, header) {
  if (!verify(rawBody, header, secret)) return "401 bad signature";
  const { event } = JSON.parse(rawBody);
  if (seen.has(event.id)) return "200 duplicate";
  seen.add(event.id);
  if (event.type !== "PRICE_INCREASE_CONSENT_APPROVED") return "200 ignored";
  return "stop the reminder for " + event.app_user_id + ", record the new price";
}

console.log(handle(rawBody, header));

Run-checked: npm run check:snippets runs this snippet with Node and compares its output with stop the reminder (checked 2026-10-03).

How RevenueDot produces it#

priceIncreaseEvents returns it when the stored consent state changes to accepted. Apple's PRICE_INCREASE with subtype ACCEPTED and Google's confirmed state set it.

Source#

Checked: 2026-10-03

Edit this page on GitHub ↗ View as Markdown Last updated