# Jede bezahlte Bestellung genau einmal zählen

> MIRA FIVE in Node.js, Bun, Deno oder Cloudflare Workers einrichten: Events und bezahlte Bestellungen vom Server, jeder doppelte Webhook zählt einmal.

URL: https://mirafive.io/de/fuer/nodejs  
Updated: 2026-09-28

Ein Server-Client meldet Ihre Bestellungen aus jeder JavaScript-Laufzeit, ein Idempotenzschlüssel lässt einen doppelten Webhook einmal zählen.

Paket `@mirafive/sdk-server`

## In 5 Schritten eingerichtet

1. ### Paket installieren  
Es läuft auf Node.js 20 oder neuer, Bun, Deno und Cloudflare Workers, ist reines ESM und hat keine Laufzeit-Abhängigkeiten. In Deno: `deno add npm:@mirafive/sdk-server`.  
```  
npm install @mirafive/sdk-server  
```
2. ### Geheimen Schlüssel eintragen  
Nehmen Sie den geheimen Schlüssel einer Server-Quelle aus **Daten → Quellen**. Das Paket liest keine Umgebungsvariablen selbst, Sie übergeben den Schlüssel. Im Browser wirft `new Mira()` einen `TypeError`.  
```  
MIRAFIVE_SECRET_KEY=mf_…  
```
3. ### Einen Client pro Prozess anlegen  
`track()` puffert, ein Batch geht nach 1 Sekunde oder bei 100 Events raus. Endet der Prozess früher, ist der Puffer verloren. Ein Server fährt den Client daher bei `SIGTERM` herunter, ein Skript wartet auf `mira.flush()`.  
```  
import { Mira } from '@mirafive/sdk-server'  
export const mira = new Mira({  
  key: process.env.MIRAFIVE_SECRET_KEY,  
  host: process.env.MIRAFIVE_HOST,  
})  
process.on('SIGTERM', async () => {  
  await mira.shutdown()  
  process.exit(0)  
})  
```
4. ### Bestellung aus dem Webhook melden  
Zahlungs-Webhooks kommen manchmal doppelt. `send()` sendet sofort und liefert den Beleg des Servers; mit einem Idempotenzschlüssel wird eine Wiederholung einmal gespeichert und berechnet.  
```  
import { mira } from './mira'  
// Im Webhook, der die Zahlung bestätigt  
await mira.send(  
  [{ name: 'order_paid', userId: order.customerId, properties: { revenue: 328, currency: 'EUR' } }],  
  { idempotencyKey: `order-${order.id}` },  
)  
```
5. ### Schlüssel prüfen  
Das Test-Event zeigt, dass Schlüssel und Host funktionieren, und wird weder gespeichert noch berechnet. Der Beleg nennt den Grund `install_check`, ein falscher Schlüssel führt zu einem `MiraError`. Danach finden Sie ein echtes Event unter **Daten → Live**.  
```  
import { Mira } from '@mirafive/sdk-server'  
const mira = new Mira({ key: process.env.MIRAFIVE_SECRET_KEY })  
console.log(await mira.send([{ name: '$install_check' }]))  
```

MIRA FIVE ist Analyse rund um die Person. `@mirafive/sdk-server` ist die Server-Seite für Node.js, Bun, Deno, Cloudflare Workers und Vercel Functions: Es puffert Events, wiederholt fehlgeschlagene Zustellungen und wertet [Feature-Flags](https://mirafive.io/de/glossar/feature-flag) in Ihrem Prozess aus. Die Pakete für [Next.js](https://mirafive.io/de/fuer/nextjs), [TanStack Start](https://mirafive.io/de/fuer/tanstack-start), [Nuxt](https://mirafive.io/de/fuer/nuxt) und [Astro](https://mirafive.io/de/fuer/astro) bauen darauf auf.

## Wie kommt eine Bestellung zu ihrem Kanal?

Über die Person. Server-Events gehen standardmäßig im vollen Modus raus und tragen die IDs, die Sie übergeben; die Rechtsgrundlage dafür liegt bei Ihrer Website. Mit Einwilligung führt der Browser eine Kennung. Schicken Sie sie nach Registrierung oder Anmeldung an den Server, und `identify` verknüpft die früheren Events mit Ihrer Nutzer-ID:

```ts
mira.identify(user.id, { plan: user.plan }, { anonymousId })
```

Die Bestellung trägt dieselbe `userId`, Ihre eigene pseudonyme ID, nie eine E-Mail-Adresse. Mit einem Kaufziel auf `order_paid` zeigt Herkunft Käufer und Umsatz je Kanal und Kampagne.

## Wann `track`, wann `send`?

`track()` für alles, was eine Sekunde warten darf. Es puffert und wirft bei Netzproblemen nie:

```ts
mira.track('order_paid', {
  userId: order.customerId,
  properties: { revenue: 328, currency: 'EUR' },
})
```

`send()` für Webhooks und Jobs. Die Batch-ID leitet sich aus dem Idempotenzschlüssel ab, jedes MIRA-FIVE-SDK bildet denselben Schlüssel auf denselben Batch ab, und der Server merkt sich eine Batch-ID einen Tag lang. Zählen Sie ganz ohne IDs, setzen Sie `mode: 'consentless'`.

Im Tab **Einbauen** der Quelle steht **Von Ihrem Coding-Agent einbauen lassen**: ein Prompt für Claude Code, Cursor oder Codex mit allen Schritten und der Prüfung, nie mit dem geheimen Schlüssel. Jede Laufzeit beschreibt die [Dokumentation](https://docs.mirafive.io/sdks/node), die Aufgabenteilung die [Einrichtungsseite](https://mirafive.io/de/einrichtung).

## Andere Einrichtungen

Dieselben Zahlen, egal wie Ihre Website gebaut ist.

- [Next.js](https://mirafive.io/de/fuer/nextjs)
- [React](https://mirafive.io/de/fuer/react)
- [Astro](https://mirafive.io/de/fuer/astro)
- [Laravel](https://mirafive.io/de/fuer/laravel)
- [Nuxt](https://mirafive.io/de/fuer/nuxt)
- [Symfony](https://mirafive.io/de/fuer/symfony)
- [PHP](https://mirafive.io/de/fuer/php)
- [Vue](https://mirafive.io/de/fuer/vue)
- [TanStack Start](https://mirafive.io/de/fuer/tanstack-start)
- [Convex](https://mirafive.io/de/fuer/convex)
- [JavaScript](https://mirafive.io/de/fuer/javascript)
- [jede Website](https://mirafive.io/de/fuer/website)

[Zur Dokumentation](https://docs.mirafive.io)

## Fragen und Antworten

### Wie kommen Events aus Cloudflare Workers sicher raus?

Mit einem Client pro Isolate und `ctx.waitUntil(mira.flush())` in jeder Anfrage. Den Schlüssel legen Sie mit `npx wrangler secret put MIRAFIVE_SECRET_KEY` ab.

### Und in Vercel Functions?

Übergeben Sie `waitUntil` aus `@vercel/functions` an `new Mira()`. Jede Zustellung geht daran, die Funktion lebt also, bis der Batch gesendet ist.

### Werfen fehlgeschlagene Zustellungen Fehler?

Nein. `track()`, `identify()` und `flush()` melden Fehler an `onError`, standardmäßig `console.warn`. Nur `send()` wirft einen `MiraError`, der sagt, ob sich ein neuer Versuch lohnt.

## Sehen Sie, welcher Kanal Käufer bringt

Kostenlos bis 25.000 Events im Monat. Ohne Kreditkarte.

[Kostenlos starten](https://app.mirafive.io/register)[Zu den Preisen](https://mirafive.io/de/preise)
