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

The Stripe integration posts directly to your ledger from the first sync, so the accounts and bank connections it posts to need to exist first. 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 know which DualEntry company (legal entity) the Stripe account belongs to. The connection is tied to that one company and cannot be reassigned to another company after you connect.
You also need to know which GL accounts to use for Stripe income, fees, and deferred revenue, all of which you map during setup. If you bill subscriptions in Stripe and want DualEntry to recognize that revenue over time, confirm the Advanced Revenue Recognition module is enabled before the first sync. That module turns Stripe subscriptions into DualEntry contracts.

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. In the Complete Stripe Setup dialog, select the DualEntry Company this Stripe account belongs to, then choose Connect.
  5. DualEntry returns to the Integrations page and confirms the connection. The Stripe tile shows the company you chose.
Each Stripe connection belongs to exactly one DualEntry company. A company supports one active Stripe connection, and the same Stripe account cannot be connected to two companies in one organization. If your organization has several legal entities that each take payments in Stripe, connect each entity’s own Stripe account to its company. The company cannot be changed after you connect: reconnecting keeps the connection on its current company, so to move it, disconnect and connect again on the other company.

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. Products you add in Stripe after setup sync as new items on the next run. Check Items after you launch a new Stripe product and set its accounts before its first invoices close.

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. Choose the sync start date carefully. DualEntry ignores Stripe activity dated before it, so invoices and payouts from earlier periods never reach the ledger through the sync. A payment that arrives after the start date for an invoice dated before it raises an Invoice not mapped sync error. A common choice is the first day of the first period you have not closed in your previous system. Opening balances then come from your migration, and everything after comes from Stripe. After the initial sync, DualEntry syncs new activity automatically, once a day by default. To sync more or less often, open the integration’s Settings and change Sync frequency, which ranges from Every 30 minutes to Weekly. The setting applies to every Stripe integration in your organization, not only the one you are editing. You can also trigger a manual sync from the Integrations page at any time.

What syncs

Each Stripe object the integration syncs becomes a specific DualEntry record type, and every synced record keeps its Stripe ID, so you can trace a ledger entry back to Stripe (see Find a synced record’s Stripe ID). The integration creates these DualEntry records from Stripe activity automatically: Every transaction record the sync creates (invoices, contracts, customer payments, payouts, fees, refunds, and credits) posts to the DualEntry company the Stripe connection belongs to. Customers are the exception: they are shared across the organization, so a Stripe customer can be invoiced from any company. After the initial setup, the integration keeps records current. Customers and products update 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.

Find a synced record’s Stripe ID

The External ID column on four Money In lists shows the Stripe ID of each synced record, so you can look up the matching object in Stripe. It’s available on the Invoices, Customer Payments, Customer Credits, and Customer Refunds lists, and it’s hidden by default.
  1. Go to Money In and open Invoices, Customer Payments, Customer Credits, or Customer Refunds.
  2. Choose Column order and turn on External ID.
Each synced record now shows its Stripe ID, such as in_1QxY… for an invoice. Records created in DualEntry rather than synced from Stripe show a dash. Select an ID to copy it. The column doesn’t link to Stripe. DualEntry remembers the column setting in your browser. When you choose Export on one of these lists, the export includes an external_id column whether or not External ID is visible in the list. The column isn’t specific to Stripe: a record synced from another integration shows that integration’s ID. To find a record by its Stripe ID without scanning a list, ask Accounting Intelligence; see Stripe integration compared with the Stripe MCP connector.

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. Use it for invoices you raise in DualEntry rather than in Stripe, when you want the customer to pay by card or another Stripe payment method instead of a bank transfer. This works on any connected Stripe account and needs no extra setup beyond the integration itself. The invoice has to belong to the same DualEntry company as the Stripe connection.
  1. Open the invoice under Money In → Invoices.
  2. Set the invoice’s company to the company your Stripe connection belongs to.
  3. In the Payment Information section, set the payment type to Integration. The other options, None and Company Payments, do not create a Stripe link.
  4. Choose your Stripe integration. If the company has only one Stripe connection, DualEntry selects it for you.
  5. Generate the invoice PDF. DualEntry creates a Stripe Checkout Session for the invoice and embeds its URL in the PDF.
In DualEntry, a Stripe payment link can only be added to an invoice whose company matches the company of the Stripe connection. DualEntry filters the Integration options by the invoice’s company, so a Stripe connection on a different company never appears in the list:
  • No company selected yet: DualEntry shows the Stripe options but disables them, with the message Select a company first to choose a Stripe account..
  • No Stripe connection on the invoice’s company: the section shows No Stripe integrations and offers to add one, even if another company in your organization has Stripe connected.
  • Company changed after choosing Stripe: DualEntry clears the Stripe selection if the connection does not belong to the new company.
To collect through Stripe on invoices from a company that has no connection, connect that company’s Stripe account in Configuration → Company → Integrations → Stripe. One Stripe account cannot serve two companies, so each entity that takes card payments needs its own. A Stripe payment link on a DualEntry invoice is a Stripe Checkout Session tied to that invoice, and it changes as the invoice changes. If the invoice uses a custom template, the link appears wherever the template places the Pay online field. If DualEntry can’t create the Checkout Session, you can still download the PDF without the link, but DualEntry blocks sending the invoice until the link works. 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.
  • Payment links are per company. A Stripe payment link only works on invoices from the DualEntry company the Stripe connection belongs to. See Payment links only work for the connected company.
  • 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.
  • DualEntry recognizes revenue 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. Two settings have to be in place before the first subscription invoice syncs:
  • Deferred Revenue Account on the Stripe integration, set in Step 2.
  • Deferral Account on each subscription product’s item, set in Step 3.
The sync creates contracts under the same DualEntry company as the Stripe connection, like every other record the sync creates. If you sell subscriptions from more than one legal entity, each entity needs its own Stripe connection so its contracts and deferred revenue land on its own books. For how DualEntry treats upgrades, downgrades, and cancellations once a contract exists, see Change orders, terminations, and renewals.

Stripe integration compared with the Stripe MCP connector

DualEntry connects to Stripe in two separate ways, and connecting one does not connect the other. The Stripe integration on this page syncs Stripe activity into your ledger. The Stripe MCP connector lets Accounting Intelligence (DualEntry’s AI assistant) read live data from Stripe during a conversation, without creating any records. The following table compares the two: You do not need the MCP connector for Accounting Intelligence to answer questions about Stripe activity that has already synced. Those records are in your ledger, so Accounting Intelligence finds them the same way it finds any invoice or payment, including by Stripe ID. Add the connector when you need what the ledger does not hold, such as Stripe-side detail on a dispute or a payout, or activity from before your sync start date. Because nothing links the two, the MCP connector can be authorized against a different Stripe account than the one the integration syncs. Accounting Intelligence might be allowed to use the connector’s write tools. If so, anything it creates in Stripe reaches DualEntry only through the integration’s normal sync, and only when it happens in the connected Stripe account after your sync start date. Write tools stay off until someone with the integrations permission allows them. See How to Connect an MCP Connector.

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. Before relying on the sync for close, confirm the first run worked:
  • Records: customers, invoices, and payments from after your sync start date appear in DualEntry under the company you connected.
  • Errors: the Integration Errors log on the Stripe integration is empty, or every entry is one you expect from Current limitations.
  • Clearing account: the Stripe Clearing Account balance matches the funds Stripe is holding, after payouts have synced as bank transfers.
  • Fees: Stripe processing fees post to the expense account you mapped, not to income.
If the clearing account does not tie out, check for refunds, disputes, and credit notes that the sync skips or logs for review instead of posting. To retry or resync individual records, see Managing syncs. To connect additional systems, return to Integrations.
Last modified on October 9, 2026