Skip to content

Payments

FoxCLM supports two payment paths: online payment via Stripe, and manual recording for cash, bank transfer, and check.

Online payments (Stripe)

Supported methods

MethodCurrencies
AlipayAUD, CAD, EUR, GBP, HKD, JPY, MYR, NZD, SGD, USD
WeChat PayCNY only (requires Stripe enabled for CNY)

Direct card payment is not currently enabled; Alipay and WeChat Pay cover the primary use cases.

Setup

  1. Go to Settings -> Integrations -> Stripe.
  2. Enter your Stripe publishable key and secret key (from your Stripe dashboard).
  3. Configure the webhook endpoint URL in your Stripe dashboard: https://your-instance.com/api/v1/stripe/webhook
  4. Copy the signing secret from Stripe and paste it into FoxCLM.

Test the integration by switching to test keys and running a test payment.

Enabling payment on an invoice

Each invoice has a Show Payment Link toggle. When on, the public share view displays a "Pay Now" button.

Client experience

  1. Client opens the public invoice link.
  2. Clicks Pay Now.
  3. Picks a method (Alipay or WeChat Pay, based on currency).
  4. Redirected to Stripe for authentication.
  5. Returns to the invoice page; FoxCLM polls until the Stripe webhook confirms payment.
  6. Invoice auto-advances to Paid and a payment_records entry is created.

Payment records

Each payment attempt is logged:

  • Stripe Payment Intent ID
  • Amount and currency
  • Method (Alipay / WeChat Pay / manual)
  • Status (pending / succeeded / failed)
  • Timestamp

View a client's payment history by opening the invoice and scrolling to the Payments section.

Manual payments

For cash, bank transfer, check, or any out-of-band payment:

  1. Open the invoice.
  2. Click Record Payment.
  3. Enter:
    • Amount
    • Date
    • Method (Cash / Bank Transfer / Check / Other)
    • Notes (reference number, check number, etc.)
  4. Save.

The payment is recorded. If the amount covers the full invoice total, the invoice is marked Paid and any send_paid_confirmation action fires.

Partial payments

FoxCLM currently records partial payments but does not automatically track remaining balance or keep the invoice in a Partially Paid status. If you accept partial payments:

  1. Record the partial amount via Record Payment.
  2. Leave the invoice in Sent status manually.
  3. Record the next payment when it arrives.
  4. Mark Paid manually (or set up a custom workflow condition based on the sum of payments).

Refunds

Refunds are not automated. To refund a payment:

  1. Issue the refund through your Stripe dashboard (for online payments) or manually (for cash).
  2. In FoxCLM, change the invoice status to Cancelled or Refunded (if you've configured that status).
  3. Add a note in the invoice explaining the refund.

Reconciliation

The Invoices page shows each invoice's status at a glance. To reconcile:

  • Filter by status Paid to see everything collected
  • Filter by status Overdue to see what's outstanding
  • Export the list for accounting

Troubleshooting

Webhook not firing: check your Stripe dashboard for webhook delivery logs. If requests are failing, verify the endpoint URL and signing secret in FoxCLM match.

Invoice stuck in "Pending Payment": the client may have abandoned checkout. After a few minutes, Stripe marks the Payment Intent as expired. You can manually revert the invoice to Sent.

Wrong currency shown: currency is set on the invoice header and cannot be changed after line items exist. Clone the invoice with the correct currency and void the old one.

Next steps

FoxCLM Documentation