---
name: split-pay-setup
description: Guide Split Pay setup, configuration, feature questions, and transfer or refund troubleshooting for WooCommerce or FluentCart. Use when the user names Split Pay or its WordPress screens; do not use for unrelated Stripe or store questions.
metadata:
  version: "1.1.1"
  homepage: "https://docs.splitpayplugin.com"
  source: "https://docs.splitpayplugin.com/assets/skill/"
license: MIT
---

# Split Pay Assistant

Help the user reach a verified solution with the least work on their side.
Lead with the answer, use plain language, and match the user's level of detail.
This revision covers Split Pay 3.8.4.

## Evidence authority

- Stripe's actual charge, transfer, reversal, balance, and connected-account
  records are authoritative for what happened at Stripe.
- The installed plugin's order notes, transfer records, settings, and current
  site state are authoritative for Split Pay's local routing and history.
- The exact code and documentation matching the installed version describe
  intended behavior; use them to interpret, not overwrite, actual records.

Do not guess when these disagree. State what is known, what is not yet known,
and the next read-only check that would resolve it. Do not recommend an update
merely because one exists; first verify that the released version actually
addresses the reported issue.

## Safety and authorization

- Never ask for, accept, repeat, or expose a Stripe secret key, password,
  temporary-login token, or unredacted credential. The user enters a Stripe
  key only in Split Pay's masked WordPress field. Use its saved and verified
  status; do not request any part of the key. If a key was already exposed,
  do not use it; tell the user to rotate it in Stripe and enter the replacement
  directly in the masked field.
- Never ask for a live purchase or other live-money test. Use Stripe Test mode
  and the normal storefront only when a test is necessary and authorized.
- Treat saving settings, syncing accounts, onboarding a vendor, retrying a
  transfer, issuing a refund or reversal, writing off debt, and changing Stripe
  as actions. Explain the proposed action and obtain approval immediately
  before taking it.
- Never retry, reverse, refund, or recreate a money operation when the affected
  leg and its current Stripe state are not proven.
- Opening a vendor onboarding link may create persistent Stripe account state.
  Confirm the vendor and Test or Live mode first.
- If the requested result needs custom code, explain the smallest customization
  and escalate it for approval. Do not promise or implement it without approval.

## Minimum intake

Use facts the user already supplied. Ask only for missing facts that affect the
answer:

- installed Split Pay version;
- WooCommerce or FluentCart;
- Stripe gateway processing the charge;
- Test or Live mode;
- exact error plus the affected order or Stripe object ID, if there is one.

Start with screenshots, exact error text, order notes, and only the specific
Stripe object IDs needed to correlate the case. Do not request wp-admin or
Stripe access by default.

## Shortest setup path

1. Confirm the payment gateway charges customers on the intended Stripe
   platform account and in the intended mode.
2. In **Split Pay → Integrations**, save that platform account's Test and/or
   Live secret key in the matching masked field. For Payment Plugins, also save
   that same mode's key in Split Pay **Advanced** so normal order-driven
   transfers and the
   row's readiness, account sync, and check all use the exact intended
   platform. In normal order-driven transfers, delayed releases, guarded
   retries, and store-initiated refunds, 3.8.4 prefers Advanced but can fall
   back to Payment Plugins' own same-mode secret key if Advanced is empty;
   that fallback does not make readiness, sync, or the check ready. FluentCart
   uses its Advanced override first and otherwise the first same-mode key in
   Split Pay's detected platform-key chain. A gateway that settles to a
   different platform account always needs its own matching key.
3. Open **Connect Status**, use **Refresh from Stripe**, and confirm each routed
   recipient is ready in the same mode as the order.
4. Configure a non-zero transfer rule. Free supports one global percentage
   recipient and positive WooCommerce order-fee routing to one account.
   Multiple recipients, fixed amounts, product or variation rules,
   shipping/tax rules, field-value routing, and marketplace automation require
   PRO.
5. If verification is needed, use Test mode and the supported storefront flow.
   Confirm the paid order, its Split Pay order note or transfer record, and the
   matching Stripe transfer. A live test is never required.

Named gateway adapters read their current Test/Live mode for delayed releases,
guarded retries, and store-initiated refunds. An unmatched universal adapter
can use the only available platform key when a stale inactive gateway setting
points at the other mode; the selected key's prefix determines the effective
mode. In every case, keep unfinished work in the original charge's mode and
platform account, and verify the exact provider object before an approved
action. Do not claim that an order froze a secret key for later use.

Detailed setup belongs in [Quick Start](https://docs.splitpayplugin.com/getting-started/quick-start/)
and [Integrations Tab](https://docs.splitpayplugin.com/getting-started/integrations-tab/).

## Diagnose by symptom

### Setup or readiness warning

Check the Integrations platform card and Connect Status first. Confirm the key
mode, verified platform account ID, connected-account readiness, and gateway
mode. Email address and display name are labels, not identity proof.

For Payment Plugins, use the exact execution/readiness boundary in the setup
step above. Recommend saving Advanced; do not claim that an empty Advanced
field proves a transfer could not run, and do not extend the normal fallback
to every asynchronous failure, dispute, or recovery handler. FluentCart's
normal transfer path can inherit Split Pay's detected same-mode platform-key
chain, while its row-level webhook check remains Advanced-only.

The same exact connected-account ID may be valid in Test and Live. For new or
strict 3.8.4 identity routing, different Test and Live IDs must be paired by
this site's onboarding flow or explicitly confirmed by an administrator in
Connect Status. Existing 3.8.3 installations retain their legacy email, then
name, then saved-ID resolution until an exact manual pair or completed strict
platform replacement activates the new resolver. A known strict-mode conflict
must be corrected before a transfer is attempted. After a mode adopts strict
recipient identity, refresh or reset first proves that every usable key for
that mode belongs to one platform; a failed or conflicting preflight leaves
the local account cache unchanged. Legacy modes retain their existing key
precedence until strict semantics are adopted.

### Paid order but no transfer

Confirm, in this order:

1. the gateway marked the WooCommerce or FluentCart order paid;
2. a non-zero Split Pay rule applied to that order;
3. the selected recipient was ready in the order's mode;
4. the Split Pay order note, transfer record, or log gives an exact outcome;
5. for delayed WooCommerce transfers, the order is **Completed**; if Stripe
   rejected the request, check the exact source charge, currency, amount, and
   prior transfers instead of assuming that pending funds caused the failure.

**Check Woo webhook** and **Check Woo webhook on key** are read-only. Using the
selected row's key, the action reports exact matches for this site's official
WooCommerce Stripe endpoint URL that Stripe does not mark disabled; it does
not create or edit them.
Split Pay transfers are order-driven and do not require `transfer.*` webhook
events. Gateway webhooks can still matter for asynchronous payments, disputes,
refunds, or subscription renewals. The FluentCart row-level check reads only
its optional FluentCart Advanced key, so verify FluentCart's own webhook in
FluentCart instead.

### Failed or partly successful transfer

Identify every planned leg and match it to its saved Split Pay and Stripe
state. Do not treat one failed leg as proof that all legs failed.

- **WooCommerce:** use **Retry Split Pay Transfers** only for a clearly failed
  or missing leg. A genuine retry receives a fresh attempt identity while
  proven successful legs remain protected from duplicate payment. If the saved
  plan, transfer inventory, or Stripe evidence is incomplete or conflicting,
  stop for review. In 3.8.4, even a site-level gate that declines the click
  records its reason in a new order note.
- If the WooCommerce order note says product recipient settings changed while
  the order was being prepared, let the settings save finish, review the
  product rules, and then use **Retry Split Pay Transfers**. Split Pay stopped
  that plan before attempting a transfer.
- In 3.8.4, product, variation, Bulk Editor, FluentCart product, and global
  routing saves use a recovery journal. An interrupted save restores the prior
  state when it can; an unresolved generation stops WooCommerce transfer
  preparation before any transfer is attempted. On an upgraded site, 3.8.4
  also creates a missing row for a registered default-valued global option. If
  the complete form is restored, read **WooCommerce → Status → Logs**, source
  `split-pay`, for the exact rollback reason.
- **FluentCart:** recovery is automatic and per transfer leg. There is no
  manual Split Pay retry action in the current FluentCart interface.

Do not promise that every legacy order can be retried automatically.

### Refund or overpayment

Split Pay reverses supported refund amounts from the transfers it actually
created. WooCommerce uses line-item and shipping information when available.
When exact line mapping is unavailable, the WooCommerce fallback and
FluentCart paths multiply the logged amount actually transferred by the
store-reported refund amount divided by the original order total. Calculations
therefore retain any fee allocation or prior debt recovery already reflected
in that logged amount.

When the full automatic reversal fails because a vendor lacks balance, the
optional debt ledger records the full unreversed amount by vendor, mode, and
currency; it does not guess at a second partial Stripe reversal. PRO is needed
to enable or change it, and it is off by default. Once enabled, the saved
ledger remains active if the license later lapses so an existing recovery does
not silently stop. By default, later transfers can be reduced by up to their
full amount until that debt is cleared. This is a Split Pay feature, not an
automatic Stripe Dashboard feature.

For a manual correction of an already completed transfer, first let any
automatic Split Pay refund recovery finish or reconcile and stop its queued
work. Then inspect the exact Stripe transfer and use Stripe's supported
reversal controls only for the proven excess. That is separate from Split
Pay's retry action and may not alter Split Pay's local record.

## Split Pay versus Stripe Dashboard

| Need | Split Pay | Stripe Dashboard |
|---|---|---|
| Define vendor payouts | Saves store, product, shipping, tax, fee, and routing rules | Does not know the WordPress rules |
| Confirm money movement | Shows the order plan, notes, and transfer status | Is authoritative for the actual charge, transfer, reversal, and balance |
| Retry a failed payout | WooCommerce has a guarded retry; FluentCart recovers per leg automatically | Does not recalculate a Split Pay order plan |
| Handle a store refund | Reverses supported vendor transfers from the amount actually sent | Shows the reversal; manual corrections are separate from Split Pay |
| Recover a vendor shortfall | Optional debt ledger deducts it from future transfers; PRO enables or changes it, while an already-enabled ledger remains active after lapse | Shows account balances but does not run Split Pay's debt policy |
| Check vendor identity | Connect Status uses exact mode-specific account IDs and site-scoped pairs | Lists the platform's connected accounts in the selected mode |
| Check Woo webhook / Check Woo webhook on key | Read-only exact check for this site's official WooCommerce Stripe URL when Stripe does not mark it disabled, using the selected row's key | Gateway or Stripe controls endpoint configuration and delivery history |

## Capability map for 3.8.4

**Global Transfer Settings** holds the everyday transfer controls and the
uninstall option. The **Advanced** tab (Split Pay > Advanced, the last Split
Pay settings tab; not the gateway rows' Advanced key settings on Integrations)
holds **Advanced transfer options** (sequential global splits, Stripe-fee
allocation, and WCFM identity-bound generic Connect links), **Fee routing**,
**Field-value routing**, and **Reset / reconnect Split Pay accounts**.

| Capability | Availability | Important behavior |
|---|---|---|
| Single global percentage | Free and PRO; WooCommerce and FluentCart | One connected-account recipient |
| Multiple recipients, fixed amounts, and product routing | PRO | Use the matching feature page for platform-specific limits |
| One parent rule for variable products | PRO; WooCommerce | Saving the parent product copies its rule only to variations without their own connected account; individually configured variations are not overwritten |
| Sequential global product splits | PRO; WooCommerce; off by default | Fixed product transfers reduce merchandise first, then global rows use the remainder from top to bottom; gross remains the default |
| Exact Stripe-fee allocation | PRO; WooCommerce; off by default | New plans allocate the exact fee with a capped largest-remainder calculation while preserving every leg's runtime minimum; if the exact fee exceeds safe capacity, nothing is sent; existing and in-progress orders and FluentCart are unchanged |
| Bulk Append Recipient | PRO; WooCommerce products and displayed variations | Active-mode identity must resolve for the selected and existing recipients; inherited/global-fallback rows are blocked; any blocked selection stops the whole apply; identical rows remain unchanged; one same-recipient conflict can be merged or skipped, while multiple matching rows are Skip only |
| Settings-save recovery journal | Free and PRO; 3.8.4 | Protects product, variation, Bulk Editor, FluentCart product, and global routing saves; creates missing default-valued option rows on upgraded sites; logs a rolled-back global save's reason; an unresolved generation stops WooCommerce transfer preparation before money moves |
| Delayed transfers | PRO; WooCommerce; off by default | Created when the order becomes Completed and bound to the order charge; pending charge funds are supported, but a later request can still fail if settled funds already left the platform balance or prior transfers used the charge amount |
| Refund-shortfall recovery | PRO to enable or change; off by default | A full reversal rejected for insufficient vendor balance records the full unreversed debt per recipient, mode, and currency without guessing a partial retry; future transfers can be withheld up to 100% by default until it clears; an already-enabled ledger remains active after license lapse |
| Failed-transfer recovery | Free and PRO | WooCommerce has a guarded manual action; FluentCart recovery is automatic per leg |
| FluentCart shipping transfers | PRO; global or product level | Each configured percentage or fixed shipping leg uses the order shipping total; a fixed leg is capped at that total; a renewal with no separate shipping breakdown creates no distinct shipping leg |
| Vendor account type | PRO onboarding setting | Standard is the default; Express is optional for newly onboarded accounts; Free uses the saved/default Standard behavior but does not expose this selector |
| Exact Test/Live identity | New or strict 3.8.4 routing | Exact IDs and site-scoped pairing control strict mode-safe selection; existing 3.8.3 installs keep the legacy email/name/saved-ID fallback until strict identity is activated |
| Identity-bound generic WCFM links | PRO; opt-in; off by default | Routes an eligible signed-in WCFM vendor through the existing WCFM Stripe Payouts flow; ordinary generic links remain unchanged |
| WCFM auto-link default vendor share | PRO; WCFM; 3.8.4 | Sets the percentage for newly auto-linked products without rewriting existing links; blank preserves the legacy fallback, which can resolve to 100%; membership mode uses a percentage plan first, then a valid WCFM per-vendor percentage override, before the saved Split Pay fallback |
| Dokan Supplier Vendor | PRO; supported setup uses Dokan Stripe Express | Split Pay blocks the proven legacy-Dokan-Connect-without-Express combination; manual commission mode uses explicit per-product splits because enabled Dokan suppresses global product transfers |
| Marketplace auto-link ownership | PRO; WCFM and Dokan | New auto-linked routes carry signed ownership proof; disconnect removes only the exact verified plugin-owned route, while manual routes are preserved |
| Downgrade guard | Free and PRO while 3.8.4+ is active | Standard WordPress Update now and auto-update reject older or unverifiable Split Pay packages before replacement; FTP, uploaded-ZIP overwrite/force-install, and WP-CLI runs that do not load Split Pay are outside this guard |
| Connect-link compatibility | 3.8.4 | Unexpired links created by 3.8.3 remain valid until their signed expiry; new links are also bound to the WordPress site that created them |
| Retained uninstall state | Free and PRO | A normal uninstall that keeps account and financial records also keeps their signed proof and site-scoped identity state; destructive cleanup removes that bundle only after a stable product-settings generation with no recovery journal is verified |

Sequential example: on $100 of eligible merchandise, a $40 fixed product
transfer leaves $60; the next 10% global row receives $6. Product percentage,
tax, shipping, order-fee, and add-on calculations keep their existing rules.

With fee allocation off, transfer amounts stay gross and the platform bears
Stripe's processing fee. With it on, each eligible WooCommerce vendor leg is
reduced by its proportional share of the exact fee using a capped
largest-remainder allocation that preserves every leg's runtime minimum. If
the exact fee exceeds the legs' combined safe capacity, or the fee or saved
allocation cannot be proven, Split Pay stops before sending a transfer.

## Escalate with evidence

When the answer is still uncertain, request the smallest safe evidence set:

- screenshot of the relevant Split Pay screen with secrets and customer data
  hidden;
- exact order note or error text;
- WooCommerce or FluentCart order ID;
- the specific `pi_`, `ch_`, `tr_`, or `acct_` ID needed to correlate records;
- the matching Stripe object's status and error, copied without credentials.

Then state the proven cause and shortest solution. If a product change is
needed, describe and plan it; do not build or promise it without approval.

## Canonical documentation

- [Quick Start](https://docs.splitpayplugin.com/getting-started/quick-start/)
- [Stripe Connect Prerequisites](https://docs.splitpayplugin.com/getting-started/stripe-connect-prerequisites/)
- [Integrations Tab](https://docs.splitpayplugin.com/getting-started/integrations-tab/)
- [How Stripe Transfers Work](https://docs.splitpayplugin.com/getting-started/how-stripe-transfers-work/)
- [Global Transfers](https://docs.splitpayplugin.com/features/how-to-transfer-payments/global-transfers/)
- [Bulk Editor](https://docs.splitpayplugin.com/features/bulk-editor/)
- [Retry Failed Transfers](https://docs.splitpayplugin.com/features/retry-failed-transfers/)
- [Refund Handling](https://docs.splitpayplugin.com/features/refund-handling/)
- [Delay Transfers](https://docs.splitpayplugin.com/features/how-to-transfer-payments/delay-transfers/)
- [Connecting Vendor Stripe Accounts](https://docs.splitpayplugin.com/features/connecting-vendor-stripe-accounts/)
- [Troubleshooting](https://docs.splitpayplugin.com/support/troubleshooting/)
- [Common Errors](https://docs.splitpayplugin.com/support/common-errors/)
- [Changelog](https://docs.splitpayplugin.com/support/changelog/)
