Fondo Webhooks & Events
Overview
Fondo itself does not send webhooks. Instead, build event-driven workflows using webhooks from the same providers Fondo connects to: Stripe (revenue), Gusto (payroll), Plaid (bank transactions), and Mercury (banking).
Provider Webhooks
| Provider | Key Events | Use Case |
|----------|-----------|----------|
| Stripe | charge.succeeded, invoice.paid | Revenue tracking, MRR alerts |
| Gusto | payroll.processed, employee.created | Payroll cost alerts, headcount |
| Plaid | transactions.sync, item.error | Expense monitoring |
| Mercury | transaction.created | Real-time spend tracking |
Instructions
Stripe Revenue Webhook
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_API_KEY!);
app.post('/webhooks/stripe', express.raw({ type: '*/*' }), (req, res) => {
const sig = req.headers['stripe-signature'] as string;
const event = stripe.webhooks.constructEvent(
req.body, sig, process.env.STRIPE_WEBHOOK_SECRET!
);
switch (event.type) {
case 'charge.succeeded':
const amount = (event.data.object as Stripe.Charge).amount / 100;
console.log(`Revenue: $${amount}`);
// Update internal dashboard
break;
case 'invoice.paid':
// MRR tracking
break;
}
res.sendStatus(200);
});
Gusto Payroll Webhook
// Gusto sends webhooks when payroll is processed
app.post('/webhooks/gusto', express.json(), async (req, res) => {
const { event_type, data } = req.body;
if (event_type === 'payroll.processed') {
const totalPayroll = data.totals.gross_pay;
console.log(`Payroll processed: $${totalPayroll}`);
// Alert if significantly different from budget
if (totalPayroll > monthlyPayrollBudget * 1.1) {
await sendAlert(`Payroll exceeded budget by ${((totalPayroll / monthlyPayrollBudget - 1) * 100).toFixed(0)}%`);
}
}
res.sendStatus(200);
});
Resources
Next Steps
For performance optimization, see fondo-performance-tuning.