IFTTT / Zapier
Connect tip events to IFTTT, Zapier, or any webhook-based service.
IFTTT / Zapier Integration
Connect Tizemint tip events to IFTTT, Zapier, Make (Integromat), or any other webhook-based automation platform.
IFTTT, Zapier, and Make do not natively support Server-Sent Events (SSE). They expect either polling REST endpoints or incoming webhooks — not persistent streaming connections. The solution is a small bridge script that subscribes to the Tizemint stream and forwards each event as a regular HTTP POST to your platform's webhook URL.
How It Works
Tizemint SSE Stream → Bridge Script → IFTTT / Zapier Webhook URL
The bridge runs on any machine (your PC, a VPS, a Raspberry Pi) and keeps the SSE connection alive. Each time an event arrives, it fires a POST request to your IFTTT or Zapier webhook URL. From there, your automation platform handles the rest.
The Webhook Relay Bridge
Step 1: Install Dependencies
npm init -y
npm install eventsourceStep 2: Create the Bridge Script
// tizemint-webhook-relay.js
import EventSource from "eventsource";
const TIZEMINT_TOKEN = process.env.TIZEMINT_TOKEN; // tzmnt_...
const WEBHOOK_URL = process.env.WEBHOOK_URL; // IFTTT or Zapier webhook URL
// Optional: only forward specific event types (comma-separated), e.g. "tip:received,tip:goal-completed"
// Leave unset to forward all events.
const EVENT_FILTER = process.env.EVENT_FILTER
? new Set(process.env.EVENT_FILTER.split(","))
: null;
if (!TIZEMINT_TOKEN || !WEBHOOK_URL) {
console.error("Missing required env vars: TIZEMINT_TOKEN, WEBHOOK_URL");
process.exit(1);
}
async function forwardEvent(data) {
if (EVENT_FILTER && !EVENT_FILTER.has(data.type)) {
return; // Skip filtered event types
}
console.log(`[relay] Forwarding event: ${data.type}`);
try {
const res = await fetch(WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
});
if (res.ok) {
console.log(`[relay] Forwarded successfully (${res.status})`);
} else {
const body = await res.text();
console.error(`[relay] Webhook returned ${res.status}: ${body}`);
}
} catch (err) {
console.error("[relay] Failed to forward event:", err.message);
}
}
function connect() {
const url = `https://tizemint.com/api/tip-events/stream?token=${TIZEMINT_TOKEN}`;
const es = new EventSource(url);
es.onopen = () => {
console.log("[relay] Connected to Tizemint event stream");
};
es.onmessage = async (event) => {
let data;
try {
data = JSON.parse(event.data);
} catch {
return; // Ignore keep-alive pings
}
await forwardEvent(data);
};
es.onerror = () => {
console.log("[relay] Connection lost, reconnecting in 5s...");
es.close();
setTimeout(connect, 5000);
};
}
connect();Step 3: Run the Bridge
TIZEMINT_TOKEN=tzmnt_your_token \
WEBHOOK_URL=https://maker.ifttt.com/trigger/tip_received/with/key/YOUR_KEY \
node tizemint-webhook-relay.jsTo only forward tip events (not queue updates):
TIZEMINT_TOKEN=tzmnt_your_token \
WEBHOOK_URL=https://hooks.zapier.com/hooks/catch/... \
EVENT_FILTER=tip:received,tip:goal-completed \
node tizemint-webhook-relay.jsSetting Up IFTTT
Step 1: Create an IFTTT Applet with Webhooks Trigger
- Go to ifttt.com and click Create.
- Click If This → search for Webhooks → select Receive a web request.
- Enter an event name, e.g.,
tizemint_tip. - Click Create Trigger.
Step 2: Get Your IFTTT Webhook Key
- Go to ifttt.com/maker_webhooks and click Documentation.
- Copy your unique key.
- Your webhook URL will be:
https://maker.ifttt.com/trigger/tizemint_tip/with/key/YOUR_KEY_HERE
Step 3: Configure the Action
Click Then That and choose any action — for example:
- Send a notification to your phone
- Add row to Google Sheets to log every tip
- Send an email via Gmail
IFTTT Webhooks pass the POST body as value1, value2, value3 fields. Since we're sending JSON, the full event payload will be in value1 as a raw string. To extract specific fields, use IFTTT's ingredient syntax if your action supports it, or switch to Zapier for more control.
IFTTT's free tier limits applets and may introduce a delay of up to a few minutes. For real-time stream alerts, consider Zapier or running your own logic in the bridge script.
Step 4: Point the Bridge at IFTTT
TIZEMINT_TOKEN=tzmnt_your_token \
WEBHOOK_URL="https://maker.ifttt.com/trigger/tizemint_tip/with/key/YOUR_KEY" \
node tizemint-webhook-relay.jsSetting Up Zapier
Zapier handles structured JSON much better than IFTTT, making it easier to use individual fields from the tip event.
Step 1: Create a New Zap
- Go to zapier.com and click Create Zap.
- For the trigger, search for Webhooks by Zapier → select Catch Hook.
- Click Continue and copy the webhook URL provided (looks like
https://hooks.zapier.com/hooks/catch/...).
Step 2: Send a Test Event
Start the bridge pointing at your Zapier webhook URL:
TIZEMINT_TOKEN=tzmnt_your_token \
WEBHOOK_URL=https://hooks.zapier.com/hooks/catch/YOUR_HOOK_PATH \
node tizemint-webhook-relay.jsIn Zapier, click Test Trigger. Zapier will wait for an incoming POST. Trigger a test tip from your Tizemint dashboard. Zapier will capture the payload and show you all available fields:
type: tip:received
amount: 500
displayName: CoolViewer42
message: Great stream!
goalId: goal_abc123
timestamp: 2026-04-07T14:23:00Z
Step 3: Configure Your Action
With the fields parsed, you can use them naturally in your Zapier action. For example:
- Google Sheets: Map
displayName,amount,message,timestampto spreadsheet columns. - Slack: Post a message:
"New tip from {{displayName}}: ${{amount / 100}}" - Airtable: Log tips to a base.
- SMS via Twilio: Text yourself for large tips.
Zapier does not do math in field mappings. To convert cents to dollars, use a Formatter by Zapier step with the Numbers → Divide transform: divide amount by 100.
Step 4: Activate the Zap
Turn the Zap on. The bridge will forward all incoming tip events to Zapier as long as it's running.
Running the Bridge as a Background Service
npm install -g pm2
pm2 start tizemint-webhook-relay.js \
--name tizemint-relay \
--env TIZEMINT_TOKEN=tzmnt_... \
--env WEBHOOK_URL=https://hooks.zapier.com/hooks/catch/... \
--env EVENT_FILTER=tip:received,tip:goal-completed
pm2 save
pm2 startupEvent Payload Reference
All events share a common shape. Fields vary slightly by type:
{
"type": "tip:received",
"amount": 500,
"displayName": "CoolViewer42",
"message": "Keep it up!",
"goalId": "goal_abc123",
"timestamp": "2026-04-07T14:23:00Z"
}| Field | Type | Notes |
|---|---|---|
type | string | One of the 4 event types |
amount | number | In cents — divide by 100 for dollars |
displayName | string | Tipper's display name |
message | string | Optional tip message |
goalId | string | ID of the active goal |
timestamp | string | ISO 8601 UTC timestamp |
Troubleshooting
Zapier never receives the test event
Make sure the bridge is running and the WEBHOOK_URL matches exactly what Zapier shows (no trailing slash differences). Check the bridge console for Forwarding event logs.
IFTTT trigger fires but the data looks garbled
IFTTT Webhooks only support value1/value2/value3 as top-level fields. The full JSON arrives as a string in value1. If you need individual fields, switch to Zapier or add formatting logic to the bridge before forwarding.
Bridge script exits after a few minutes The Tizemint stream has a 5-minute keep-alive timeout. The reconnect handler reconnects automatically — if the process exits entirely, check for uncaught exceptions in the relay script. Running under PM2 (or tmux/systemd) will auto-restart the process if it crashes.
Zapier says "No data found" on test The test window is short. Start the bridge, then quickly click "Test Trigger" in Zapier, then send a test tip from the Tizemint dashboard within about 30 seconds.