Cancel account subscription (all stores)

Overview

Cancel every active store plan under the given account and notify an admin via a brandPlanCancelled billing webhook. All matching StorePlans (status active/expired) are set to close with plan_end, cancel_subscription_at, and the reason stamped.

Prerequisites

  • A bearer token in the Authorization header.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

POST /api/v1/plans/cancel-account-subscription

Authentication

  • Requires a bearer token in the Authorization: Bearer <bearer-token> header.

  • Both (Partner or Account), within the account's own tree. Sits in the authenticated group under the plans prefix, with no extra route-level guard.

  • Two-layer scoping applies. Layer 1 requires company_id to be an existing bundle_id=3 (account) Company passing an ownership check. Layer 2 additionally requires the auth user's company_id to equal the account id or the account's parent company id — else 403 (Permission denied).

  • So an Account user cancels their own account; the parent Partner can cancel a child account.

  • 404 if the account has no locations (Location not found.) or no payable active plans (No active plan found.).

Request body

FieldTypeRequiredNotes
company_idintegerYesAccount ID; existing bundle_id=3 Company in the caller's hierarchy.
cancelling_reasonstringYesOne of: Price too high, Response quality not good enough, Another solution in place, Prefer to respond myself, Do not get enough reviews to justify it, Responses are not important to our business, Other.
cancelling_reason_otherstringNonullable, max 255.

Rate limit

  • No rate limit.

Request body

{
  "company_id": 12,
  "cancelling_reason": "Price too high",
  "cancelling_reason_other": "Switching to a competitor"
}

Response

200 Success · 200

{
  "data": { "message": "Subscription cancelled successfully." }
}

403 Permission denied · 403

{
  "message": "Forbidden",
  "status": "error",
  "errors": "Permission denied"
}

404 Location not found · 404

{
  "message": "Not Found",
  "status": "error",
  "errors": "Location not found."
}

Errors

StatusMeaning
401The bearer token is missing, expired or invalid
403Permission denied
404Location not found
422The request failed validation — the response names the fields
500Unexpected server error

Example request

curl --request POST \
  --url "https://production-api.shoutaboutus.com/api/v1/plans/cancel-account-subscription" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"company_id": 12, "cancelling_reason": "Price too high", "cancelling_reason_other": "Switching to a competitor"}'

Did this page help you?