Re-enroll a previously excluded customer
POST /customers/{customer_id}/reenroll| Scope | customers:write |
| Customer session token | Not accepted: call from your server with an API key |
| Rate limit class | write (limits) |
| Idempotency key | Required (idempotency) |
| MCP tool | charm_reenroll_customer |
Parameters
Section titled “Parameters”| Name | In | Type | Description |
|---|---|---|---|
customer_id | path | string | Shopify customer GID (percent-encoded, e.g. gid%3A%2F%2Fshopify%2FCustomer%2F123) or the numeric customer id. |
Response 200
Section titled “Response 200”Returns CustomerWriteResult.
| Field | Type | Description |
|---|---|---|
changed | boolean | |
customer | Customer or CustomerState | |
previous_tier_id | string or null | (optional, nullable) |
bonus_points | number | (optional) |
{ "changed": true, "customer": { "id": "gid://shopify/Customer/7712345", "legacy_id": 7712345, "email": "shopper@example.com", "first_name": "Jane", "last_name": "Doe", "points_balance": 120, "points_earned": 120, "points_redeemed": 120, "pending_points": 120, "tier": null, "next_tier": null, "rewards": [ null ], "history": [ null ], "program": { "enabled": null, "program_name": null, "points_name": null, "points_expiry": null, "reward_expiry": null, "eligibility": null, "referral": null, "memberships_enabled": null, "tiers_enabled": null, "earning_rules": null, "redemption_rules": null, "revision": null, "updated_at": null }, "referral": null, "referral_code": "JANE10", "excluded_from_program": false, "enrolled_at": "2026-10-01T09:30:00.000Z", "enrolled_via": "Embedded Widget", "birthday": null, "orders_count": 1, "lifetime_spend": 1, "last_activity_at": "2026-10-01T09:30:00.000Z", "updated_at": "2026-10-01T09:30:00.000Z" }, "previous_tier_id": "silver", "bonus_points": 120}Example
Section titled “Example”curl -X POST "https://charm.appfleece.app/api/v1/customers/7712345/reenroll" \ -H "Authorization: Bearer chrm_live_..." \ -H "Idempotency-Key: $(uuidgen)"Errors
Section titled “Errors”unauthorized · invalid_token · insufficient_scope · access_required · not_found · validation_error · rate_limited · idempotency_conflict
Every error body carries code, message, request_id and a doc_url pointing at the matching entry in the error catalog.