---
title: "What does the RevenueDot webhook event PRICE_INCREASE_CONSENT_APPROVED mean?"
description: "PRICE_INCREASE_CONSENT_APPROVED is sent when a customer accepted a subscription price increase. Record the new price. Access and renewal continue."
url: https://revenuedot.app/docs/webhooks/webhook-price-increase-consent-approved
---

# 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.

## Related

- [What does the RevenueDot webhook event PRICE_INCREASE_CONSENT_REQUIRED mean?](https://revenuedot.app/docs/webhooks/webhook-price-increase-consent-required.md)
- [What does the RevenueDot webhook event RENEWAL mean?](https://revenuedot.app/docs/webhooks/webhook-renewal.md)
- [What does the RevenueDot webhook event EXPIRATION mean?](https://revenuedot.app/docs/webhooks/webhook-expiration.md)
- [PRICE_INCREASE_CONSENT_APPROVED fields and a recorded example payload](https://revenuedot.app/docs/api/webhook-events.md#price_increase_consent_approved)
- [Webhooks guide: set up, verify and test](https://revenuedot.app/docs/guides/webhooks.md)

## Source

- [RevenueDot docs: which webhook events RevenueDot sends](https://revenuedot.app/docs/api/webhook-events)
- [RevenueCat: webhook event types and fields (the format RevenueDot follows)](https://www.revenuecat.com/docs/integrations/webhooks/event-types-and-fields)
- [RevenueDot core: events.ts (the event types and the rules that derive them)](https://github.com/revenuedot/revenuedot/blob/main/packages/core/src/events.ts)
- [RevenueDot server: services/events.ts (how an event is recorded and delivered)](https://github.com/revenuedot/revenuedot/blob/main/apps/server/src/services/events.ts)
- [RevenueDot server: services/purchases.ts (where store changes become events)](https://github.com/revenuedot/revenuedot/blob/main/apps/server/src/services/purchases.ts)

Checked: 2026-10-03
