Payment didn't sync
- 1. Refresh the invoice
- 2. Check the audit log
- 3. Manual reconciliation
- 4. Webhook configuration issue (rare)
- While you're waiting
- Preventing this in the future
Stripe processed the card but the invoice still shows unpaid in Construction Scope. The money is in your Stripe balance, you just don't see it reflected on our side. Usually a webhook timing issue that fixes itself in seconds. Here's the deeper checklist for when it doesn't.
First, confirm the money actually moved: check your Stripe Dashboard (dashboard.stripe.com → Payments) for a successful charge matching the date and customer. If it's there, the payment is real — the rest is just getting Construction Scope to see it.
1. Refresh the invoice
Webhooks (the messages Stripe sends to tell us about a payment) can arrive a few seconds after the customer is redirected from the checkout. Reload the invoice page after waiting 10-20 seconds. If the status flipped to Paid, you're done — the webhook just arrived late.
2. Check the audit log
Settings → Audit log → filter to Payment. You're looking for a payment_intent.succeeded entry for this customer at the right amount. If you see it, the webhook fired and we got it; the payment record should exist (see step 3). If you don't see it, the webhook never arrived — see step 4.
3. Manual reconciliation
If Stripe shows the charge but Construction Scope doesn't have a Payment record, you can create one manually. Open the invoice, click Record payment, enter:
- Amount: the paid amount from Stripe.
- Date: the date the customer paid in Stripe.
- Reference: the Stripe charge ID (pi_xxx or ch_xxx) from the Stripe Dashboard. This lets us reconcile if the webhook arrives later.
- Method: Stripe card (or ACH if that's what they used).
Save. The invoice flips to Paid. Webhook idempotency on our side means the auto-record won't double-count this payment if Stripe's webhook eventually arrives — we deduplicate by the Stripe charge ID.
4. Webhook configuration issue (rare)
If this happens on every payment (not just one), there's likely a webhook endpoint problem on the platform side. The signs:
- Multiple invoices showing unpaid despite Stripe showing the charges as successful.
- Audit log has no payment_intent entries at all.
- Customer Portal upgrades / cancellations also failing to sync.
If you see this pattern, email support@constructionscope.net with your workspace name and one or two Stripe charge IDs as examples. We check the webhook delivery dashboard on Stripe's side and usually identify the issue within an hour. Common causes: an expired webhook signing secret, a temporary outage on our API, or a Stripe-side rate-limit you've hit on a high-volume day.
While you're waiting
If a customer is asking "did you get my payment?" while you're working through this, your safest answer is: "Stripe confirmed receipt — I'm reconciling it on my end now, you'll see a receipt shortly." The money IS yours (it's in your Stripe balance). The invoice status on our side is a reconciliation detail, not a money question.
Preventing this in the future
There's nothing you need to configure to prevent webhook timing issues — they happen rarely and self-resolve. The one thing worth doing: bookmark your Stripe Dashboard as your source of truth for "did the money actually arrive." Construction Scope reflects Stripe, but Stripe is the ledger of record for all payment activity.
Email hello@constructionscope.net with your workspace name and a one-line description of what you're trying to do. Most replies under 2 business hours, Mon–Fri 6am–6pm Pacific.
For urgent payment issues, put PAYMENT URGENT in the subject — we prioritize
those over everything else.