Skip to main content
VaultDevLabs
Synthetic lab fixture · no client data

WooCommerce + Stripe payment-state reconciliation lab

Reproduce one controlled mismatch: Stripe succeeds, the webhook path is acknowledged, and the expected WooCommerce order transition does not complete. Inspect three linked immutable inputs and verify the deterministic reconciliation result derived from them.

This is not a client case study or claimed production incident. Every ID, timestamp and state is synthetic.

Synthetic only

No client, customer or production-store data.

No credentials

The page does not accept keys, secrets or uploads.

No automatic fix

The expected result is evidence for manual review.

01 · Event clock

Timestamped synthetic timeline

The fixture uses one fixed UTC sequence so the reconciliation result can be reproduced without interpreting changing live data.

  1. WooCommerce order created

    Synthetic order WC-LAB-1042 enters pending payment with a £129.00 GBP total.

  2. Stripe PaymentIntent created

    pi_lab_7f3a_redacted carries metadata linking it to WooCommerce order 1042.

  3. Stripe payment succeeds

    The synthetic event payment_intent.succeeded is created in test mode.

  4. Webhook delivery returns HTTP 200

    The lab models an acknowledged event whose expected WooCommerce transition still does not complete.

  5. Reconciliation check detects drift

    Stripe remains succeeded while WooCommerce remains pending after the five-minute fixture window.

02 · State contract

Expected versus observed

Controls must agree before the state mismatch is meaningful. The lab deliberately preserves identity and amount controls while the order transition fails.

Evidence fieldExpectedObservedResult
Stripe payment statesucceededsucceededcontrol
WooCommerce order stateprocessingpendingmismatch
Order needs processingtruetruecontrol
Order transaction IDpi_lab_7f3a_redactedabsentmismatch
Payment-complete order notepresentabsentmismatch
Amount and currency12900 / GBP12900 / GBPcontrol

03 · Evidence map

Sources to inspect on a real store

The lab provides separate Stripe-event, webhook-attempt and Woo-order inputs. A real review must preserve and compare the same surrounding store-side evidence.

Stripe PaymentIntent

Status, amount, currency, customer reference and WooCommerce order metadata.

Stripe event envelope

Event ID, type, creation time, mode, request reference and object snapshot.

WooCommerce order

Order status, total, currency, transaction ID, gateway fields and customer-safe reference.

Order notes and gateway logs

Payment-complete notes, validation errors, handler messages and status transitions.

04 · Reconciliation protocol

Seven deterministic steps

Run the checks in order. The protocol stops at classification and never treats a mismatch as permission to edit the order.

  1. 01

    Confirm fixture boundaries

    Require synthetic=true, immutable=true and not_for_replay=true on every input. Reject credentials, signatures and real customer data.

  2. 02

    Normalize the time window

    Read all timestamps in UTC and use the fixed 09:41:22–09:46:38 lab window.

  3. 03

    Match the records

    Join the event, webhook attempt and order snapshot through event ID, PaymentIntent ID and WooCommerce order ID.

  4. 04

    Check identity controls

    Compare amount_minor=12900 and currency=GBP before interpreting payment state.

  5. 05

    Compare the state transition

    Derive processing as the expected WooCommerce state because needs_processing=true, then record the observed pending state.

  6. 06

    Inspect processing evidence

    Check event delivery, the transaction ID, order notes, gateway logs and queued actions. Do not treat HTTP 200 as proof of completion.

  7. 07

    Classify without mutation

    Derive the CSV row from the three immutable inputs, then write payment_state_mismatch and manual_confirmation_before_order_edit. Do not change the order.

05 · Static artifacts

Three immutable inputs. One derived output.

Every input and the resulting CSV are shown here and available as static downloads. No form, login or credential submission is required.

Synthetic Stripe event

Immutable event and PaymentIntent input with redacted IDs and a not-for-replay boundary.

Download
payment-intent-succeeded.fixture.json
{
  "fixture_version": "1.1",
  "fixture_id": "woo-stripe-lab-001",
  "fixture_type": "synthetic_stripe_event",
  "synthetic": true,
  "immutable": true,
  "not_for_replay": true,
  "event": {
    "id": "evt_lab_a91c_redacted",
    "object": "event",
    "api_version": "2024-06-20",
    "created": 1783849297,
    "livemode": false,
    "type": "payment_intent.succeeded",
    "pending_webhooks": 1,
    "request": {
      "id": "req_lab_42df_redacted",
      "idempotency_key": "lab-order-1042-attempt-1"
    },
    "data": {
      "object": {
        "id": "pi_lab_7f3a_redacted",
        "object": "payment_intent",
        "amount": 12900,
        "created": 1783849294,
        "currency": "gbp",
        "status": "succeeded",
        "customer": "cus_lab_31bd_redacted",
        "metadata": {
          "woocommerce_order_id": "1042",
          "fixture": "synthetic"
        }
      }
    }
  }
}

Synthetic webhook attempt

Immutable delivery input linked to the event, PaymentIntent and order, with HTTP acknowledgement only.

Download
webhook-attempt.fixture.json
{
  "fixture_version": "1.1",
  "fixture_id": "woo-stripe-lab-001",
  "fixture_type": "synthetic_webhook_attempt",
  "synthetic": true,
  "immutable": true,
  "not_for_replay": true,
  "attempt": {
    "id": "wha_lab_6c8e_redacted",
    "event_id": "evt_lab_a91c_redacted",
    "payment_intent_id": "pi_lab_7f3a_redacted",
    "woocommerce_order_id": "1042",
    "attempted_at": "2026-07-12T09:41:38.000Z",
    "endpoint": "https://example.invalid/wc-api/wc_stripe",
    "response_status": 200,
    "acknowledged": true
  }
}

Synthetic Woo order snapshot

Immutable order-side input with pending state, missing mutation evidence and needs_processing=true.

Download
woocommerce-order-snapshot.fixture.json
{
  "fixture_version": "1.1",
  "fixture_id": "woo-stripe-lab-001",
  "fixture_type": "synthetic_woocommerce_order_snapshot",
  "synthetic": true,
  "immutable": true,
  "not_for_replay": true,
  "order": {
    "snapshot_id": "woo_snapshot_lab_f214_redacted",
    "id": "1042",
    "created_at": "2026-07-12T09:41:22.000Z",
    "snapshot_at": "2026-07-12T09:46:38.000Z",
    "status": "pending",
    "needs_processing": true,
    "amount_minor": 12900,
    "currency": "GBP",
    "payment_method": "stripe",
    "transaction_id": null,
    "payment_complete_note": null,
    "linked_event_id": "evt_lab_a91c_redacted",
    "linked_payment_intent_id": "pi_lab_7f3a_redacted"
  }
}

Derived reconciliation output

One deterministic CSV row derived from the three linked inputs without changing either system.

Download
reconciliation-output.csv
fixture_id,fixture_version,reconciled_at,stripe_event_id,stripe_payment_intent,stripe_state,webhook_attempt_id,delivery_http_status,order_snapshot_id,woocommerce_order,observed_woocommerce_state,expected_woocommerce_state,needs_processing,amount_minor,currency,webhook_event,order_note_found,transaction_id_found,classification,recommended_action
woo-stripe-lab-001,1.1,2026-07-12T09:46:38.000Z,evt_lab_a91c_redacted,pi_lab_7f3a_redacted,succeeded,wha_lab_6c8e_redacted,200,woo_snapshot_lab_f214_redacted,1042,pending,processing,true,12900,GBP,payment_intent.succeeded,false,false,payment_state_mismatch,manual_confirmation_before_order_edit

06 · Positive controls

What still agrees

A useful mismatch report distinguishes aligned identity evidence from the one transition that failed.

  • All three input fixtures are explicitly synthetic, immutable and marked not for replay.
  • The event, webhook attempt and order snapshot link through the same event, PaymentIntent and WooCommerce order IDs.
  • Amount and currency agree across the modeled Stripe and WooCommerce records.
  • The Stripe state and event type agree: succeeded and payment_intent.succeeded.
  • The order snapshot explicitly records needs_processing=true, so the expected WooCommerce state is processing.
  • The reconciliation time is later than the event and webhook attempt timestamps.
  • No duplicate Stripe event or second WooCommerce order is introduced into the fixture.

07 · Boundaries

What this lab cannot prove

The fixture demonstrates a reconciliation method. It does not diagnose a reader's store or establish a production root cause.

  • This is a synthetic lab fixture, not a client case study, production incident or claim of a successful repair.
  • The page does not accept credentials, API keys, webhook secrets, order exports or customer information.
  • The fixture does not automatically diagnose a live store or prove why a real order remained pending.
  • A real WooCommerce/Stripe setup may use different statuses, plugins, metadata, event types or asynchronous jobs.
  • HTTP 200 records delivery acknowledgement only; it does not prove that downstream state mutation completed.
  • The expected output is a mismatch classification and manual review boundary, not an automated order edit.

Expected lab outcome

One mismatch row. No automatic order edit.

The deterministic output should classify payment_state_mismatch and recommend manual_confirmation_before_order_edit. That is the end of the lab. It does not claim a repair was performed.

fixture_id=woo-stripe-lab-001

stripe_state=succeeded

woo_state=pending

needs_processing=true

result=payment_state_mismatch

Use the evidence

Move from the fixture to the right next step

Use the guide for manual checks, the free scanner for read-only comparison, or Payment Rescue when a real customer/order decision is blocked.