Skip to main content
Connect Stripe to DualEntry so customers, invoices, payments, payouts, and fees flow into your ledger on an ongoing basis. Record sync runs in one direction: Stripe activity creates and updates DualEntry records, and DualEntry never changes the status of a Stripe invoice or subscription. Separately from the sync, DualEntry can initiate a payment in Stripe when you collect against an invoice. See What DualEntry sends to Stripe.

Prerequisites

Confirm the following in DualEntry before connecting:
  • Your organization and legal entity are configured.
  • Your chart of accounts is set up, including income, expense, and deferred revenue accounts.
  • Your bank connections include the destination account Stripe pays out to.
  • Your Stripe account is disconnected from any prior accounting system.
You also need to know which GL accounts to use for Stripe income, fees, and deferred revenue, all of which you map during setup.

Step 1: Connect your Stripe account

Authorize DualEntry to read your Stripe data via OAuth.
  1. Navigate to Configuration → Company → Integrations → Stripe.
  2. Choose Connect with Stripe.
  3. Authorize the connection in the Stripe consent screen and approve access.
  4. DualEntry returns to the Integrations page and confirms the connection.
Each organization supports one active Stripe connection. To switch accounts, disconnect the existing integration first.

Step 2: Configure account mappings

Map your Stripe activity to the DualEntry GL accounts that should receive each transaction type. During pre-setup, DualEntry creates a default set of accounts to support the sync:
  • Stripe Clearing Account - holds funds received from customers before they are paid out to your bank.
  • Income Account - where Stripe revenue is recorded.
  • Expense/Fee Account - where Stripe processing fees are recorded.
  • Deferred Revenue Account - used for subscription-based revenue recognition.
  • Financing Account - used if you use Stripe Capital.
  • Stripe Vendor - the vendor record used for fee entries.
Once those accounts exist, review and confirm the following mappings under Configuration → Company → Integrations → Stripe → Settings:
  • Income Account - where invoice revenue posts.
  • Expense Account - where Stripe fees post.
  • Deferred Revenue Account - required if you use Stripe subscriptions with revenue recognition.
  • Bank Account mapping - map your Stripe payout destination to the correct DualEntry bank account.
If your payout destination account is not mapped, bank transfers fail to sync. Make sure your external bank account is linked before running your first full sync.

Step 3: Map your products

Stripe products sync to item records in DualEntry. The integration’s Products mapping tab shows which DualEntry item each Stripe product created, but the accounting for each product is configured on the item itself, not on that tab. Open Configuration → Accounting Setup → Items, find the item the Stripe product created, and set its accounts:
  • Income Account - the GL account revenue from this product posts to.
  • Deferral Account - required for subscription products using revenue recognition.
Because the accounts live on the item, they apply wherever that item is used, not only to Stripe-originated revenue. An item created by the Stripe sync and then used on a manual invoice posts to the same accounts, which is usually what you want and worth knowing when you change one.

Step 4: Run your first sync

Once your accounts and products are mapped, kick off the initial backfill.
  1. Navigate to Configuration → Company → Integrations → Stripe.
  2. Set your sync start date, the cutoff date from which DualEntry pulls Stripe data.
  3. Choose Sync Now.
DualEntry pulls all Stripe activity from your start date forward and creates the corresponding records. Depending on your transaction volume, this can take several minutes. After the initial sync, DualEntry continues to sync new activity automatically; you can also trigger a manual sync from the Integrations page at any time.

What syncs

The integration creates these DualEntry records from Stripe activity automatically: After the initial setup, the integration keeps records current. Customers and products are kept up to date as they change in Stripe. Invoices and payments sync as they are created and paid. Payouts sync when Stripe sends funds to your bank, and fees sync as Stripe charges them.

What DualEntry sends to Stripe

Record sync only moves data from Stripe into DualEntry, but collecting a payment is the one place where DualEntry writes to Stripe. Every write below is an action you trigger deliberately, and none of them change an existing Stripe invoice, subscription, or payout.

Actions that create records in Stripe

The following table lists every action that creates a record in your Stripe account: A payment that DualEntry initiates is a standalone Stripe payment tagged with the DualEntry invoice ID. It is not applied to a Stripe invoice. If the DualEntry invoice originally came from Stripe, that Stripe invoice stays open in Stripe even after the payment settles, so close it in Stripe yourself.

Marking an invoice as paid in DualEntry

Marking an invoice as paid in DualEntry does not mark it as paid in Stripe. Recording a customer payment, applying a credit, or writing off a balance in DualEntry is a ledger action only. To settle the invoice in Stripe, collect or record the payment in Stripe, and the resulting payment syncs into DualEntry as a customer payment applied to that invoice. You can put a Stripe-hosted payment link on a DualEntry invoice PDF so the customer pays the invoice directly. This works on any connected Stripe account and needs no extra setup beyond the integration itself.
  1. Open the invoice under Money In → Invoices.
  2. In the Payment Information section, set the payment type to Integration.
  3. Choose your Stripe integration.
  4. Generate the invoice PDF. DualEntry creates a Stripe Checkout Session for the invoice and embeds its URL in the PDF.
DualEntry reuses the same Checkout Session while it stays open in Stripe, and refreshes its line items if you edit the invoice before the customer pays. If the session has expired, generating the PDF again creates a replacement session. If the customer has already paid through the session, generating the PDF again embeds that same completed session URL. The completed URL no longer accepts a payment, so only regenerate the PDF while the invoice is unpaid. When the customer pays, Stripe notifies DualEntry, and DualEntry creates a customer payment against the invoice that posts to your Stripe clearing account. If the customer pays more than the invoice balance, DualEntry applies the invoice balance to the invoice and records the excess as an unassigned amount on that same customer payment. An unassigned amount is cash received that is not yet applied to any invoice. DualEntry does not create a separate customer prepayment, so reclassify the excess yourself if you need it tracked as a prepayment liability.

Current limitations

Some Stripe activity is not supported by the sync, and some is recorded for review rather than posted to the ledger:
  • Partial refunds. A refund posts to the ledger only when the Stripe charge is refunded in full and the original payment covers a single invoice. Enter anything else manually in DualEntry. How you find out about a non-qualifying refund depends on where it came from. A refund that the sync discovers in Stripe raises a sync error you can see on the integration. A refund you initiate from DualEntry goes through in Stripe and DualEntry records it as a refund record. If it does not qualify, DualEntry skips it without a sync error, so check partial and multi-invoice refunds yourself.
  • Post-payment and mixed credit notes. Only pre-payment credit notes sync. Other credit note types are skipped silently rather than raising a sync error, so check Stripe for credit notes that never appeared in DualEntry.
  • Disputes. A new dispute is logged against the integration for review. DualEntry does not post the disputed amount or the dispute fee, so reconcile both manually.
  • Customer prepayments. A Stripe payment has to belong to a Stripe invoice that DualEntry has already mapped. Payments against an unmapped invoice, a skipped invoice, or an invoice dated before your sync start date raise a sync error instead of becoming a customer prepayment. Money a customer sends before any invoice exists needs a customer prepayment entered in DualEntry.
  • Subscription revenue recognition requires the Advanced Revenue Recognition module to be enabled on your account.

Use Stripe with subscriptions and revenue recognition

If your business uses Stripe subscriptions and the Advanced Revenue Recognition module is enabled, DualEntry automates the revenue recognition workflow.
  • When a Stripe subscription is created, DualEntry creates a contract with the subscription terms and start/end dates.
  • Each time a subscription invoice is generated in Stripe, DualEntry creates a contract_invoice linked to that contract.
  • When the invoice is paid in Stripe, DualEntry creates a customer_payment applied to the contract invoice.
  • Revenue is recognized according to the straight-line schedule defined on the contract.
Stripe continues managing billing and payments while DualEntry handles all revenue recognition and reporting. See Revenue Recognition for the full workflow.

Troubleshoot sync errors

When a record fails to sync, it appears in the Integration Errors log under Configuration → Company → Integrations → Stripe. The most common causes:

Result

After completing these steps, your Stripe activity flows into DualEntry automatically and your ledger stays in sync without manual entry. Remember that record sync is inbound only: settling an invoice in DualEntry never settles it in Stripe. To connect additional systems, return to Integrations. To model subscription revenue end-to-end, see Revenue Recognition.
Last modified on August 27, 2026