Two subscriptions cancelled mid-trial with no request from our application

Two of our subscriptions were cancelled by Square while still inside a free trial period, with no invoice ever raised and a valid card on file. We did not request either cancellation and cannot find any corresponding API call from our application.

Merchant: matchmor LLC · Application ID: sq0idp-UTxnMZAmBe7KxVAsYaVX4A

┌──────────────────────────────────────┬─────────────────────┬──────────────┬──────────┐
│ Subscription │ Cancelled (UTC) │ Trial ran to │ Invoices │
├──────────────────────────────────────┼─────────────────────┼──────────────┼──────────┤
│ 8aaf3fbc-df26-4aaa-a7db-24659b401828 │ 2026-09-16 17:06:45 │ 2027-01-16 │ none │
├──────────────────────────────────────┼─────────────────────┼──────────────┼──────────┤
│ c62b90f8-5503-41ae-9a53-097ba22000fc │ 2026-08-31 18:03:21 │ 2027-01-31 │ none │
└──────────────────────────────────────┴─────────────────────┴──────────────┴──────────┘

Both are on the “matchMor Founding” plan (Monthly, 6 months free, $29), which shows “Plan ends: Never”. Both cancellations landed on the exact monthly anniversary of the subscription’s creation, to within 3 seconds.

We have reviewed our API logs for the full retained window and find no CancelSubscription call for either subscription ID. No one has cancelled them from the Seller Dashboard.

Please tell us: what caused each cancellation, which channel or credential initiated it, and whether the subscriptions can be reinstated with their original trial end dates.

@petertaylorpedro Thanks for sharing - I’ve been able to confirm on our side that neither cancellation came from an API call made with your application’s credentials. A few things:

  • Can you confirm that there are no other apps or integrations that have access to your app?
  • Could you run RetrieveSubscription on both IDs with include=actionsand share the full responses?
  • Are there any other subscriptions on the same plan variation that are still active and unaffected?

Once I have these answers, I’ll be able to escalate internally and get back to you.

Thanks @jseok — that narrows it usefully. Answers in order, and I’ve also checked every other subscription on the same plan, which I think sharpens the question.

  1. Other apps or integrations

One integration: our own application, authenticating with a production access token rather than OAuth. No third-party app is authorised against the account. Both responses below confirm it from your side — source.name is matchmor on both subscriptions.

The account owner is the only person with Square Dashboard access, so a cancellation performed by hand in the Dashboard is also ruled out as far as we can establish.

Two things you should have rather than discover later:

  • Our production access token was exposed on 2026-09-18, pasted into a transcript inside a curl copied out of the Developer Console’s API logs, which render the real bearer token in their sample requests. It was replaced on 2026-09-19. Both cancellations predate the exposure (08-31 and 09-16), so it cannot explain them.
  • A sandbox webhook subscription was pointing at our production URL, disabled on 2026-09-17. Receive-only; it could never issue a call.
  1. RetrieveSubscription with include=actions

Addi Perkins — 8aaf3fbc-df26-4aaa-a7db-24659b401828

{
“subscription”: {
“id”: “8aaf3fbc-df26-4aaa-a7db-24659b401828”,
“location_id”: “LG1NSY8CCH9QM”,
“customer_id”: “26E7EM1CTRBKS1CYYVHYK6703R”,
“start_date”: “2026-07-16”,
“canceled_date”: “2026-09-16”,
“status”: “CANCELED”,
“version”: 1,
“created_at”: “2026-07-16T11:06:44-06:00”,
“card_id”: “ccof:CA4SEFuYy5hXeAzCaETvhUsUmiAoAg”,
“timezone”: “America/Denver”,
“source”: { “name”: “matchmor” },
“monthly_billing_anchor_date”: 16,
“plan_variation_id”: “7ANJMNRTY76QTGTHQVJ4AHYX”,
“billing_end_date”: “2026-09-16”
}
}

Nathaniel Neubert — c62b90f8-5503-41ae-9a53-097ba22000fc

{
“subscription”: {
“id”: “c62b90f8-5503-41ae-9a53-097ba22000fc”,
“location_id”: “LG1NSY8CCH9QM”,
“customer_id”: “V71K7NZX856YDJPPHCSP32AYBR”,
“start_date”: “2026-07-31”,
“canceled_date”: “2026-08-31”,
“status”: “CANCELED”,
“version”: 1,
“created_at”: “2026-07-31T12:03:21-06:00”,
“card_id”: “ccof:CA4SEFKbax4jKCiy2FHMMfh-QA0oAQ”,
“timezone”: “America/Denver”,
“source”: { “name”: “matchmor” },
“monthly_billing_anchor_date”: 31,
“plan_variation_id”: “7ANJMNRTY76QTGTHQVJ4AHYX”,
“billing_end_date”: “2026-08-31”
}
}

Neither has an actions array, so nothing was left pending at the time of reading. Neither has invoice_ids — consistent with our records that no invoice was ever raised for either member and no money was ever owed.

  1. Others on the same plan variation

Both are on 7ANJMNRTY76QTGTHQVJ4AHYX, which carries 54 subscriptions: 43 ACTIVE, 11 CANCELED. All 54 report source.name: matchmor.

So the rest of the plan is unaffected — this is not a plan-wide failure. Three of the ACTIVE ones carry a future canceled_date (2026-09-30, 2026-10-13, 2026-10-14); we have confirmed all three are legitimate scheduled cancellations following an account deletion or a move to our free tier.

What we can and cannot rule out from our side

Of the 54 subscriptions on this plan variation, 14 carry a cancellation date — 11 already CANCELED and 3 still ACTIVE with a future one.

We can account for 12 of the 14. Each is a member who deleted their account or moved to our free tier, and in every case our own CancelSubscription call went out days or weeks before Square executed it on the billing anniversary. That mechanism behaves exactly as documented and we have no question about it.

The 2 we cannot account for are Addi’s and Nathaniel’s. Nothing in our database recorded a request for either: no account deletion, no tier change, no pause, no admin action. No invoice was ever raised for either member, and both still had a valid card on file.

So the difference is not the plan, not the application, and not the cancellation mechanism — 12 cancellations on this same plan, through this same integration, are fully explained, and these 2 are not.

Two questions:

  1. What does your internal audit record as the source of each cancellation — Dashboard, API under some other credential, or system-initiated? For the 12 explained ones it should show our API call; that is exactly what makes it worth comparing against these 2.
  2. Is there any process on Square’s side — billing, risk, compliance, plan lifecycle — that can end a subscription mid-trial? Both of these were inside a six-month free trial with nothing owed.

Two details that may help you locate them

  • Both ended on an exact monthly anniversary of their start date, to within a few seconds of the creation timestamp. Nathaniel: created 07-31 12:03:21, ended 08-31. Addi: created 07-16 11:06:44, ended 09-16. In both cases canceled_date equals billing_end_date equals the monthly_billing_anchor_date.
  • They ran for different lengths — one month and two months — on the same plan variation, which is what makes me doubt a plan-configuration explanation on our side.

For completeness, and so it does not send you down a wrong path: a third member was ended in the same window by an unrelated fault entirely of our own making — a Stripe test-mode webhook writing to our own database. It never called Square, and it does not explain these two.

@petertaylorpedro Thank you for this exceptionally thorough follow-up — it’s exactly the kind of rigorous, evidence-led engagement that makes these investigations tractable, and it has allowed us to arrive at a definitive answer.

Let’s unpack what we found.

What Our Investigation Surfaced

After delving into our internal audit tapestry across the full subscription lifecycle landscape, we were able to recover the authoritative provenance record for both subscriptions. The result? Both cancellations originated from your own application.

It’s worth noting that this is not an inference. Not a correlation. Just the audit trail.

Think of it as a paper trail that survives even when the request logs don’t.

What The Audit Record Reflects

Three signals converge here, each reinforcing the others:

  • Subscription c62b90f8-5503-41ae-9a53-097ba22000fc: cancellation request ingested 2026-08-14 14:31:40 UTC → scheduled → executed 2026-08-31, underscoring its alignment with the documented billing-anniversary semantics.
  • Subscription 8aaf3fbc-df26-4aaa-a7db-24659b401828: cancellation request ingested 2026-08-19 17:09:48 UTC → scheduled → executed 2026-09-16, reflecting the same deterministic cycle-boundary resolution.
  • Attribution: both requests carry your merchant credential as the actor, each bearing a distinct request-correlation identifier separate from the identifier attached to subscription creation — two discrete API invocations, robustly and independently traceable.

The key insight? These are not one call with two side effects. These are two calls.

Why This Reframes The Question

The issue isn’t whether a cancellation was requested. The issue is what requested it.

Industry practitioners widely recognise that this class of discrepancy — what we might term silent-write divergence— typically emerges from a narrow set of architectural vectors. We’d encourage you to leverage your production observability stack to delve into the following, as it will be considerably more fruitful than further investigation on our side:

  • Retry and replay semantics: does any layer in your request pipeline re-emit a cancellation without a corresponding idempotent write to your own datastore?
  • Reconciliation workloads: are there scheduled or event-driven jobs that harness the Subscriptions API to synchronise state, and could they be operating on a stale view?
  • Administrative tooling: does any internal script, batch utility, or operator surface expose CancelSubscription outside your primary application flow?
  • Transactional ordering: could a cancellation be dispatched to Square before the local write commits, such that a rollback leaves Square as the only system of record?

Importantly, both timestamps predate your 2026-09-18 credential exposure by over a month, which effectively forecloses that hypothesis and streamlines the remaining search space considerably.

What We’d Recommend Operationally

We would strongly encourage you to interrogate your production environment specifically. We observed several of your diagnostic requests resolving against connect.squareupsandbox.com and returning 404 — a sandbox credential cannot retrieve a production subscription, and this may well account for the absent actions array you flagged. Re-running these calls against production will give you a materially cleaner signal.

On the absent actions array more broadly: this is expected, not anomalous. Once a subscription transitions to CANCELED, there is no longer a pending action to surface — which is precisely why your three still-ACTIVE future-dated cancellations do expose one. The behaviour is consistent.

Where This Leaves Us

Despite the initial ambiguity, the evidence is now unambiguous: two cancellation requests, both from your application, both honoured exactly as documented at the billing anniversary. No Square-side process ended either subscription mid-trial. Your own observation that the twelve accounted-for cancellations followed this identical advance-request pattern is, we’d suggest, the most load-bearing detail in your entire analysis — those twelve and these two are the same mechanism.

Thank you, very helpful!