{"record":{"id":"55aae2f7b33833ed","repo":"TryGhost/Ghost","slug":"your-email-has-failed-to-resubscribe-please-try-a","errorCode":null,"errorMessage":"Your email has failed to resubscribe, please try again","messagePattern":"Your email has failed to resubscribe, please try again","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"apps/portal/src/utils/api.js","lineNumber":291,"sourceCode":"                credentials: 'same-origin',\n                body: JSON.stringify(body)\n            }).then(function (res) {\n                if (!res.ok) {\n                    return null;\n                }\n                return res.json();\n            });\n        },\n\n        deleteSuppression() {\n            const url = endpointFor({type: 'members', resource: 'member/suppression'});\n\n            return makeRequest({\n                url,\n                method: 'DELETE'\n            }).then(function (res) {\n                if (!res.ok) {\n                    throw new Error('Your email has failed to resubscribe, please try again');\n                }\n                return true;\n            });\n        },\n\n        async getIntegrityToken() {\n            const url = endpointFor({type: 'members', resource: 'integrity-token'});\n            const res = await makeRequest({\n                url,\n                method: 'GET'\n            });\n\n            if (res.ok) {\n                return res.text();\n            } else {\n                const humanError = await HumanReadableError.fromApiResponse(res);\n                if (humanError) {\n                    throw humanError;","sourceCodeStart":273,"sourceCodeEnd":309,"githubUrl":"https://github.com/TryGhost/Ghost/blob/47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe/apps/portal/src/utils/api.js#L273-L309","documentation":"Thrown in api.member.deleteSuppression() when DELETE {siteUrl}/members/api/member/suppression/ returns non-ok. Message 'Your email has failed to resubscribe, please try again'. This is the path that re-enables sending email to a member who was previously suppressed/bounced.","triggerScenarios":"A member with a suppressed (bounced/complained) email tries to resubscribe via Portal; the suppression-delete call fails server-side — e.g. the member is not actually signed in, the suppression list service is unreachable, or a rate limit fires.","commonSituations":"Session expired between opening Portal and clicking resubscribe; Email service (Mailgun/SES) API down or misconfigured; member record already gone; CSRF/identity token missing; member is on a provider-level suppression that Ghost cannot clear.","solutions":["Reload the page and re-authenticate to refresh the member session, then retry resubscribe.","Verify the Email service connection in Settings > Email is healthy.","Check the suppression list in the email provider's dashboard — some provider-level blocks cannot be cleared from Ghost.","Inspect the DELETE response status/body in the Network tab for the server's reason."],"exampleFix":"// before\nif (!res.ok) { throw new Error('Your email has failed to resubscribe, please try again'); }\n\n// after\nif (!res.ok) {\n    const detail = await res.text().catch(() => '');\n    throw new Error(`Your email has failed to resubscribe (${res.status}${detail ? ': ' + detail : ''})`);\n}","handlingStrategy":"try-catch","validationCode":"// confirm member is signed in before allowing resubscribe\nasync function ensureSignedIn(api) {\n    const identity = await api.member.identity().catch(() => null);\n    if (!identity) { throw new Error('Sign in again to resubscribe'); }\n}","typeGuard":null,"tryCatchPattern":"try {\n    await api.member.deleteSuppression();\n    notifySuccess('You are resubscribed');\n} catch (err) {\n    // err.message === 'Your email has failed to resubscribe, please try again'\n    notifyError(err.message);\n}","preventionTips":["Refresh the member session before suppression delete.","Verify the Email service connection is healthy.","Some provider-level suppressions cannot be cleared from Ghost — surface that to the user.","Inspect the DELETE response status to differentiate session vs. provider failures."],"tags":["portal","suppression","email","members-api","resubscribe"],"backgroundTag":null,"analyzedSha":"47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe","analyzedAt":"2026-08-13T01:25:26.651Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}