Integrations

Stripe

Reconcile Stripe charges, subscriptions, and refunds into Zivvy /v1/payment-entries.

The snag

Finance teams manually match Stripe payouts against sales invoices, and refunds go unrecorded until month-end.

How Zivvy helps

Forward the charge.succeeded, charge.refunded, and payout.paid Stripe webhooks into /v1/payment-entries; Zivvy auto-links to the referenced /v1/sales-invoices.

What you get

  • Auto-create /v1/payment-entries from charge.succeeded
  • Match Stripe fee + net payout to your bank account ledger
  • Refund events reverse the payment entry with full audit trail

Workflow stream

Stripe charge.succeeded → /v1/payment-entries against a Sales Invoice

Common uses

  1. 01

    Stripe charge.succeeded → /v1/payment-entries against a Sales Invoice

  2. 02

    Stripe payout.paid → bank reconciliation line in Zivvy

  3. 03

    Stripe charge.refunded → reverse the payment entry automatically

Integration code

Open API reference

Record Stripe charge

curl -X POST https://integrate.zivvy.xyz/v1/payment-entries \
  -H "Authorization: Bearer $ZIVVY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payment_type": "Receive",
    "party_type": "Customer",
    "party": "Acme Corp",
    "paid_amount": 1200.00,
    "reference_no": "ch_3PabcDeXYZ",
    "reference_date": "2026-07-25",
    "references": [
      { "reference_doctype": "Sales Invoice",
        "reference_name": "SAL-INV-2026-0042",
        "allocated_amount": 1200.00 }
    ]
  }'

Stripe webhook handler

import Stripe from "stripe";
import { zivvy } from "./zivvy-client";

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

export async function POST(req) {
  const raw = await req.text();
  const event = stripe.webhooks.constructEvent(
    raw,
    req.headers.get("stripe-signature"),
    process.env.STRIPE_WEBHOOK_SECRET
  );
  if (event.type === "charge.succeeded") {
    const c = event.data.object;
    await zivvy.paymentEntries.create({
      payment_type: "Receive",
      party_type: "Customer",
      party: c.metadata.zivvy_customer,
      paid_amount: c.amount / 100,
      reference_no: c.id,
      references: [{
        reference_doctype: "Sales Invoice",
        reference_name: c.metadata.zivvy_invoice,
        allocated_amount: c.amount / 100
      }]
    });
  }
  return new Response("ok");
}

API endpoints

POST /v1/payment-entriesGET /v1/payment-entriesPOST /v1/webhook-subscriptions

Events emitted

HMAC-SHA256 signed webhooks, retried for 24 hours.

  • payment-entries.created
  • payment-entries.paid
  • payment-entries.reversed

0

free seats forever

0

card required to start

1

workspace for the workflow

Questions

Ready to try it?

Free plan. Two seats. No card.