Automatic Stripe → GL posting (charges, refunds, payouts)
Once an org is connected through Stripe Connect (Settings → Integrations → Stripe), every Stripe event on the connected account auto-posts a corresponding journal entry to the GL. No manual data entry. The two-stage clearing model mirrors Stripe's own ledger so reconciliation is mechanical.
Three event types post automatically:
charge.succeeded — a card payment landed
DR 1050 Stripe Clearing (net: gross − Stripe fee)
DR 6250 Payment Processing Fees (Stripe's fee)
CR <revenueCode> (gross sale)
Default revenueCode = 4900 Other Revenue. Override per-charge with charge.metadata.glRevenueCode = '4100' (or whichever income account fits).
charge.refunded — money returned to the customer
DR <revenueCode> (gross refund)
CR 1050 Stripe Clearing (net returned)
CR 6250 Payment Processing Fees (fee returned, if Stripe refunded its share)
payout.paid — Stripe sweeps the clearing account to your bank
DR 1010 Checking
CR 1050 Stripe Clearing (payout amount)
How the clearing account works:
1050 Stripe Clearing carries the net balance Stripe is currently holding for you. Charges debit it (Stripe owes you), payouts credit it (Stripe paid you). When you sit down to reconcile, the 1050 balance should match Stripe's "Available balance" for that period — to the cent.
Two new GL accounts are auto-created for orgs that already have a chart of accounts seeded:
• 1050 Stripe Clearing — current asset
• 6250 Payment Processing Fees — operating expense
Idempotency:
Every JE looks up sourceType + the Stripe object id (charge.id, payout.id) before posting. The same webhook delivered twice produces one JE, not two.
Module-managed payments are auto-skipped:
Charges originating from Restaurant orders, Lodging reservations, Event tickets, Ticket Resale, Dues autopay, Film Festival passes, and similar workflows already write their own JEs at the source. The Stripe webhook automatically skips these via charge.metadata.skipStripeGlPosting === '1' (stamped at session creation) and via charge.invoice (subscription-driven invoice flows).
What you need to do once:
In the Stripe Dashboard → Webhooks → your Turtini endpoint, make sure these three event types are checked:
• charge.succeeded
• charge.refunded
• payout.paid
(They're checked automatically when the webhook is created via Settings → Integrations → Stripe → Connect — but if your endpoint pre-dates this feature, tick them manually.)
Verifying it's working:
After Stripe processes a payment, the JE appears in Accounting → Journal Entries within seconds. Filter by sourceType='stripe_charge' or sourceType='stripe_payout' to see only auto-posted rows.
Failure mode:
If a webhook arrives for a charge whose metadata can't resolve to an org (rare — happens on direct-charges that bypass Connect), the handler logs a warning and skips. Manually post a JE in that case.