← Files Upstash RedisARCHIVED FILE

skills/upstash-qstash-js/advanced/deduplication.md

2.2 KB · Oct 4, 2026 · 12:20 UTC

↓ Download file

# Message Deduplication

Prevent duplicate message delivery within a 90-day window using deduplication IDs.

## Why Deduplication?

Duplicate messages can occur when:

- User retries a failed request
- Network issues cause message resubmission
- Application logic triggers multiple publishes for the same event

Deduplication ensures QStash accepts but doesn't enqueue duplicate messages.

## Deduplication Methods

### deduplicationId

Provide a custom identifier to detect duplicates:

```typescript
import { Client } from "@upstash/qstash";

const client = new Client({ token: process.env.QSTASH_TOKEN! });

await client.publishJSON({
  url: "https://api.example.com/webhook",
  deduplicationId: `order-${orderId}-payment`,
  body: { orderId, status: "paid" },
});
```

If a message with the same `deduplicationId` was published in the last 90 days, the new message is accepted but not enqueued.

**Use cases:**

- Order processing: `order-${orderId}`
- User events: `user-${userId}-signup`
- Payment transactions: `payment-${transactionId}`

### contentBasedDeduplication

Automatically generate a deduplication ID from message content:

```typescript
await client.publishJSON({
  url: "https://api.example.com/webhook",
  contentBasedDeduplication: true,
  body: { userId: "123", event: "signup" },
});
```

The hash includes:

- All headers (except authorization)
- Request body
- Destination URL

## Deduplication Window

Deduplication IDs are stored for **90 days**. After this period, a message with the same ID can be delivered again.

## Response Handling

When a duplicate is detected, the response includes the original message ID:

```typescript
const result = await client.publishJSON({
  url: "https://api.example.com/webhook",
  deduplicationId: "order-123",
  body: { order: "data" },
});

if (result.deduplicated) {
  console.log("Duplicate detected");
  console.log("Original message ID:", result.messageId);
}
```

## Best Practices

- Use descriptive, deterministic deduplication IDs
- Include relevant context in custom IDs: `${entity}-${id}-${action}`
- Don't rely on deduplication for critical data consistency
- Monitor deduplicated messages in logs to detect issues
- Document your deduplication strategy for team reference

SHA-256: ab8aad34f0cb34e6e50ba8c08c5af264355172c801ecef99b570f463e6c590ef