Connect a WordPress + WooCommerce store to LoyaltyDog.
The LoyaltyDog WordPress plugin syncs customers and orders from your WooCommerce store into your LoyaltyDog loyalty program in real time, and renders a loyalty UI in the customer’s My Account area.
The plugin calls the /wordpress/ui/* endpoints to render the customer’s loyalty UI. These authenticate with the plugin’s API token (a loyaltydog_pk_* registration key or the legacy WordPress webhook token) sent as a bearer token. GET requests identify the customer with ?email= or ?customer_id=.
GET /v2/wordpress/ui/eligible-awards returns the loyalty awards a customer can claim right now, and backs the My Account → Loyalty Program page so it can list redeemable awards without re-deriving eligibility client-side. Identify the customer with either ?email= or ?customer_id=.Only LIVE offers the customer can afford are returned — offers costing more points than the customer’s balance (and offers blocked by pointsMin/pointsMax, per-customer or availability limits, or an offer the customer has already claimed) are excluded.
A successful call returns 200 OK with a JSON array of awards. Each award carries an id (pass it as offer_id when claiming), a display name, and its points cost — exposed both as pointsCost and as the snake_case alias points_required for the plugin UI. Offers may also include the balance bounds (pointsMin/pointsMax), a per-customer claim limit (limitPerCustomer), and an endDate, each null when unset.
The endpoint responds with 401 for a missing or invalid bearer token, 400 when neither email nor customer_id is supplied, and 404 when no customer matches the supplied identity in the program.
POST /v2/wordpress/resend-activation is public and unauthenticated — unlike the /ui/* endpoints above, it’s called before the plugin has any credentials. A merchant whose activation link expired or was lost can use it to have a fresh activation code emailed to them.The endpoint is enumeration-safe: it always returns the same neutral 200 whether or not the email address is registered to a program, so it can’t be used to probe which emails have LoyaltyDog accounts. Any failure looking up the account, minting a new code, or sending the email is swallowed server-side and reported to Sentry rather than surfaced to the caller.
A successful call always returns 200 OK with the same static body:
{ "message": "If an account exists for that email, we've sent a new activation code."}
The endpoint is rate-limited in layers, none of which change the response the caller sees:
Per-IP — 10 requests per hour, enforced before anything else runs.
Per-email — 5 requests per hour per address (tracked by a hashed key, not the raw email).
Per-program — the existing 60-second throttle on the underlying resend machinery.
A request that trips any of these limits still gets the same neutral 200 — never a 429 — so a spent budget is indistinguishable from a successful send.
Orders aren’t awarding points — Confirm the plugin activated successfully (Settings shows a linked program) and that order-completion webhooks are reaching LoyaltyDog.
My Account page shows no awards — The customer may not have enough points for any LIVE offer, or no offers are LIVE for the program. The GET /v2/wordpress/ui/eligible-awards response is empty in both cases. Check the program’s offers in your dashboard.
Customer not created — Ensure the WooCommerce customer has an email address; LoyaltyDog dedupes on email.
Merchant never received a new activation code — POST /v2/wordpress/resend-activation always returns 200, even when nothing was sent (unknown email, or the per-email/per-program rate limit was already spent). Confirm the merchant’s email matches the one on their LoyaltyDog account, and check spam/junk folders before assuming the request failed.
Awards listed by GET /v2/wordpress/ui/eligible-awards are claimed with POST /v2/wordpress/ui/claim, passing the award’s id as offer_id.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"LoyaltyDog","description":"Developer documentation for the LoyaltyDog loyalty, gift card, and wallet pass platform.","colors":{"primary":"#E02040","light":"#FF4D6A","dark":"#A00C24"},"logo":{"light":"https://mintcdn.com/loyaltydog/nTgeGLHuJsYgNjQM/logo/logofull.png?fit=max\u0026auto=format\u0026n=nTgeGLHuJsYgNjQM\u0026q=85\u0026s=5a49eb0f121927ffebb8c5e5e8cbdd13","dark":"https://mintcdn.com/loyaltydog/nTgeGLHuJsYgNjQM/logo/logofull.png?fit=max\u0026auto=format\u0026n=nTgeGLHuJsYgNjQM\u0026q=85\u0026s=5a49eb0f121927ffebb8c5e5e8cbdd13","href":"https://loyalty.dog"},"favicon":"https://mintcdn.com/loyaltydog/nTgeGLHuJsYgNjQM/logo/logomark.png?fit=max\u0026auto=format\u0026n=nTgeGLHuJsYgNjQM\u0026q=85\u0026s=68cf1efecc80404347ea7d9668387bee","api":{"openapi":"openapi.public.json","playground":{"display":"interactive","proxy":true},"examples":{"defaults":"required","languages":["bash","javascript","python"],"autogenerate":true},"mdx":{"auth":{"method":"bearer"},"server":"https://api.loyalty.dog"}},"navbar":{"links":[{"href":"mailto:[email protected]","label":"Support"},{"href":"https://loyalty.dog/support/","label":"Contact"}],"primary":{"type":"button","label":"Get an API key","href":"https://app.loyalty.dog/account/appkeys"}},"footer":{"socials":{"github":"https://github.com/loyaltydog","linkedin":"https://www.linkedin.com/company/loyaltydog"},"links":[{"header":"Product","items":[{"label":"Marketing site","href":"https://loyalty.dog"},{"label":"Pricing","href":"https://loyalty.dog/pricing"},{"label":"Contact","href":"https://loyalty.dog/support"}]},{"header":"Developers","items":[{"label":"API reference","href":"/api-reference"},{"label":"OpenAPI spec","href":"/resources/openapi"},{"label":"MCP server","href":"/mcp/overview"},{"label":"Status","href":"https://status.loyalty.dog"}]},{"header":"Legal","items":[{"label":"Terms of service","href":"https://loyalty.dog/loyalty-program-terms-of-service"},{"label":"Privacy policy","href":"https://loyalty.dog/privacy-policy"}]}]},"contextual":{"options":["copy","view","download-spec","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"API status","icon":"signal-bars","href":"https://status.loyalty.dog"},{"anchor":"Marketing site","icon":"globe","href":"https://loyalty.dog"},{"anchor":"GitHub","icon":"github","href":"https://github.com/loyaltydog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"loyaltydog","hasAudioNarration":false,"actualSubdomain":"loyaltydog","customDomains":["docs.loyalty.dog"],"gitSource":{"type":"github","owner":"loyaltydog","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae64943426c3612a89990f1","collectionId":"4b677e8c-f46d-4675-a415-ecd1345fb237","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae64943426c3612a89990f1"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae64943426c3612a89990f1","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API reference","count":206},{"language":"default","tag":"Loyalty","count":60},{"language":"default","tag":"Gift Cards","count":44},{"language":"default","tag":"Documentation","count":25},{"language":"default","tag":"fraud","count":12},{"language":"default","tag":"Passes","count":10},{"language":"default","tag":"Passes > Pass Images","count":9},{"language":"default","tag":"Integrations","count":8},{"language":"default","tag":"Guides","count":7},{"language":"default","tag":"Pass Templates > Images","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"integrations/wordpress","slug":"/integrations/wordpress","pageMetadata":{"title":"WordPress / WooCommerce","description":"Connect a WordPress + WooCommerce store to LoyaltyDog.","href":"/integrations/wordpress"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect a WordPress + WooCommerce store to LoyaltyDog.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The LoyaltyDog WordPress plugin syncs customers and orders from your WooCommerce store into your LoyaltyDog loyalty program in real time, and renders a loyalty UI in the customer’s `,_jsx(_components.strong,{children:`My Account`}),` area.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-it-does`,children:`What it does`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Creates a LoyaltyDog customer record the first time a WooCommerce customer places an order.`}),`\n`,_jsx(_components.li,{children:`Awards loyalty points on order completion, based on rules you configure in your program.`}),`\n`,_jsx(_components.li,{children:`Lets customers redeem points for discount codes at checkout.`}),`\n`,_jsxs(_components.li,{children:[`Surfaces the customer’s points balance and the awards they can claim on the `,_jsx(_components.strong,{children:`My Account → Loyalty Program`}),` page.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`install`,children:`Install`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Sign in to your WordPress admin.`}),`\n`,_jsxs(_components.li,{children:[`Install the `,_jsx(_components.strong,{children:`LoyaltyDog`}),` plugin from the WordPress plugin directory (or upload the ZIP).`]}),`\n`,_jsxs(_components.li,{children:[`Activate the plugin, then open `,_jsx(_components.strong,{children:`LoyaltyDog → Settings`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Paste the single-use `,_jsx(_components.strong,{children:`activation key`}),` from your onboarding email — the plugin exchanges it for your program credentials automatically.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`plugin-facing-ui-endpoints`,children:`Plugin-facing UI endpoints`}),`\n`,_jsxs(_components.p,{children:[`The plugin calls the `,_jsx(_components.code,{children:`/wordpress/ui/*`}),` endpoints to render the customer’s loyalty UI. These authenticate with the plugin’s API token (a `,_jsx(_components.code,{children:`loyaltydog_pk_*`}),` registration key `,_jsx(_components.strong,{children:`or`}),` the legacy WordPress webhook token) sent as a bearer token. `,_jsx(_components.code,{children:`GET`}),` requests identify the customer with `,_jsx(_components.code,{children:`?email=`}),` or `,_jsx(_components.code,{children:`?customer_id=`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`listing-a-customer’s-eligible-awards`,children:`Listing a customer’s eligible awards`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET /v2/wordpress/ui/eligible-awards`}),` returns the loyalty awards a customer can claim right now, and backs the `,_jsx(_components.strong,{children:`My Account → Loyalty Program`}),` page so it can list redeemable awards without re-deriving eligibility client-side. Identify the customer with either `,_jsx(_components.code,{children:`?email=`}),` or `,_jsx(_components.code,{children:`?customer_id=`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Only `,_jsx(_components.strong,{children:`LIVE`}),` offers the customer can afford are returned — offers costing more points than the customer’s balance (and offers blocked by `,_jsx(_components.code,{children:`pointsMin`}),`/`,_jsx(_components.code,{children:`pointsMax`}),`, per-customer or availability limits, or an offer the customer has already claimed) are excluded.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.loyalty.dog/v2/wordpress/ui/[email protected]\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer loyaltydog_pk_live_...\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A successful call returns `,_jsx(_components.code,{children:`200 OK`}),` with a JSON array of awards. Each award carries an `,_jsx(_components.code,{children:`id`}),` (pass it as `,_jsx(_components.code,{children:`offer_id`}),` when claiming), a display `,_jsx(_components.code,{children:`name`}),`, and its points cost — exposed both as `,_jsx(_components.code,{children:`pointsCost`}),` and as the snake_case alias `,_jsx(_components.code,{children:`points_required`}),` for the plugin UI. Offers may also include the balance bounds (`,_jsx(_components.code,{children:`pointsMin`}),`/`,_jsx(_components.code,{children:`pointsMax`}),`), a per-customer claim limit (`,_jsx(_components.code,{children:`limitPerCustomer`}),`), and an `,_jsx(_components.code,{children:`endDate`}),`, each `,_jsx(_components.code,{children:`null`}),` when unset.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"prog_offer_123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Free Coffee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"points_required\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`100`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"pointsCost\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`100`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"pointsMin\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"pointsMax\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"limitPerCustomer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"endDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The endpoint responds with `,_jsx(_components.code,{children:`401`}),` for a missing or invalid bearer token, `,_jsx(_components.code,{children:`400`}),` when neither `,_jsx(_components.code,{children:`email`}),` nor `,_jsx(_components.code,{children:`customer_id`}),` is supplied, and `,_jsx(_components.code,{children:`404`}),` when no customer matches the supplied identity in the program.`]}),`\n`,_jsx(Heading,{level:`3`,id:`requesting-a-fresh-activation-code`,children:`Requesting a fresh activation code`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /v2/wordpress/resend-activation`}),` is `,_jsx(_components.strong,{children:`public and unauthenticated`}),` — unlike the `,_jsx(_components.code,{children:`/ui/*`}),` endpoints above, it’s called before the plugin has any credentials. A merchant whose activation link expired or was lost can use it to have a fresh activation code emailed to them.`]}),`\n`,_jsxs(_components.p,{children:[`The endpoint is enumeration-safe: it always returns the same neutral `,_jsx(_components.code,{children:`200`}),` whether or not the email address is registered to a program, so it can’t be used to probe which emails have LoyaltyDog accounts. Any failure looking up the account, minting a new code, or sending the email is swallowed server-side and reported to Sentry rather than surfaced to the caller.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.loyalty.dog/v2/wordpress/resend-activation\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{\"email\": \"[email protected]\"}'`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A successful call always returns `,_jsx(_components.code,{children:`200 OK`}),` with the same static body:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"If an account exists for that email, we've sent a new activation code.\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The endpoint is rate-limited in layers, none of which change the response the caller sees:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Per-IP`}),` — 10 requests per hour, enforced before anything else runs.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Per-email`}),` — 5 requests per hour per address (tracked by a hashed key, not the raw email).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Per-program`}),` — the existing 60-second throttle on the underlying resend machinery.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A request that trips any of these limits still gets the same neutral `,_jsx(_components.code,{children:`200`}),` — never a `,_jsx(_components.code,{children:`429`}),` — so a spent budget is indistinguishable from a successful send.`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Orders aren’t awarding points`}),` — Confirm the plugin activated successfully (Settings shows a linked program) and that order-completion webhooks are reaching LoyaltyDog.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`My Account page shows no awards`}),` — The customer may not have enough points for any LIVE offer, or no offers are LIVE for the program. The `,_jsx(_components.code,{children:`GET /v2/wordpress/ui/eligible-awards`}),` response is empty in both cases. Check the program’s offers in your dashboard.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Customer not created`}),` — Ensure the WooCommerce customer has an email address; LoyaltyDog dedupes on email.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Merchant never received a new activation code`}),` — `,_jsx(_components.code,{children:`POST /v2/wordpress/resend-activation`}),` always returns `,_jsx(_components.code,{children:`200`}),`, even when nothing was sent (unknown email, or the per-email/per-program rate limit was already spent). Confirm the merchant’s email matches the one on their LoyaltyDog account, and check spam/junk folders before assuming the request failed.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Awards listed by `,_jsx(_components.code,{children:`GET /v2/wordpress/ui/eligible-awards`}),` are claimed with `,_jsx(_components.code,{children:`POST /v2/wordpress/ui/claim`}),`, passing the award’s `,_jsx(_components.code,{children:`id`}),` as `,_jsx(_components.code,{children:`offer_id`}),`.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"WordPress / WooCommerce","description":"Connect a WordPress + WooCommerce store to LoyaltyDog.","href":"/integrations/wordpress"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What it does","slug":"what-it-does","depth":2,"children":[]},{"title":"Install","slug":"install","depth":2,"children":[]},{"title":"Plugin-facing UI endpoints","slug":"plugin-facing-ui-endpoints","depth":2,"children":[{"title":"Listing a customer’s eligible awards","slug":"listing-a-customer’s-eligible-awards","depth":3,"children":[]},{"title":"Requesting a fresh activation code","slug":"requesting-a-fresh-activation-code","depth":3,"children":[]}]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"loyaltydog","siteName":"LoyaltyDog","title":"WordPress / WooCommerce - LoyaltyDog","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-02T07:37:24.327Z","originalFileLocation":"integrations/wordpress.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect a WordPress + WooCommerce store to LoyaltyDog.\">\u003cmeta data-mint-head name=\"application-name\" content=\"LoyaltyDog\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"WordPress / WooCommerce - LoyaltyDog\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect a WordPress + WooCommerce store to LoyaltyDog.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"LoyaltyDog\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.loyalty.dog/integrations/wordpress\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://loyaltydog.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=WordPress+%2F+WooCommerce\u0026amp;description=Connect+a+WordPress+%2B+WooCommerce+store+to+LoyaltyDog.\u0026amp;theme=f938ddbe6f2a962c0952e794\u0026amp;signature=a5a0a537e6bb7a6cf8d2186c1a9bb2afe760fe207fc59aeb5d59c26a4b5e866c\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"WordPress / WooCommerce - LoyaltyDog\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect a WordPress + WooCommerce store to LoyaltyDog.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://loyaltydog.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=WordPress+%2F+WooCommerce\u0026amp;description=Connect+a+WordPress+%2B+WooCommerce+store+to+LoyaltyDog.\u0026amp;theme=f938ddbe6f2a962c0952e794\u0026amp;signature=a5a0a537e6bb7a6cf8d2186c1a9bb2afe760fe207fc59aeb5d59c26a4b5e866c\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/loyaltydog/_pzTcBR0IkeVAmm7/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"LoyaltyDog\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#E02040\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.loyalty.dog/integrations/wordpress\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/wordpress.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.loyalty.dog/#organization\",\"name\":\"LoyaltyDog\",\"url\":\"https://docs.loyalty.dog\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/loyaltydog/nTgeGLHuJsYgNjQM/logo/logofull.png?fit=max\u0026auto=format\u0026n=nTgeGLHuJsYgNjQM\u0026q=85\u0026s=5a49eb0f121927ffebb8c5e5e8cbdd13\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.loyalty.dog#website\",\"name\":\"LoyaltyDog\",\"url\":\"https://docs.loyalty.dog\",\"publisher\":{\"@id\":\"https://docs.loyalty.dog/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.loyalty.dog/integrations/wordpress#webpage\",\"url\":\"https://docs.loyalty.dog/integrations/wordpress\",\"name\":\"WordPress / WooCommerce\",\"description\":\"Connect a WordPress + WooCommerce store to LoyaltyDog.\",\"dateModified\":\"2026-07-02T07:37:24.327Z\",\"isPartOf\":{\"@id\":\"https://docs.loyalty.dog#website\"},\"breadcrumb\":{\"@id\":\"https://docs.loyalty.dog/integrations/wordpress#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.loyalty.dog/integrations/wordpress#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Integrations\",\"item\":\"https://docs.loyalty.dog/integrations/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WordPress / WooCommerce\",\"item\":\"https://docs.loyalty.dog/integrations/wordpress\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.loyalty.dog/integrations/wordpress#article\",\"headline\":\"WordPress / WooCommerce\",\"name\":\"WordPress / WooCommerce\",\"description\":\"Connect a WordPress + WooCommerce store to LoyaltyDog.\",\"url\":\"https://docs.loyalty.dog/integrations/wordpress\",\"mainEntityOfPage\":{\"@id\":\"https://docs.loyalty.dog/integrations/wordpress#webpage\"},\"dateModified\":\"2026-07-02T07:37:24.327Z\",\"publisher\":{\"@id\":\"https://docs.loyalty.dog/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.loyalty.dog#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"LoyaltyDog\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"LoyaltyDog","nav":{"global":{"anchors":[{"anchor":"API status","icon":"signal-bars","href":"https://status.loyalty.dog"},{"anchor":"Marketing site","icon":"globe","href":"https://loyalty.dog"},{"anchor":"GitHub","icon":"github","href":"https://github.com/loyaltydog"}]},"tabs":[{"tab":"Documentation","groups":[{"group":"Get started","pages":[{"title":"Welcome to LoyaltyDog","href":""},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"}]},{"group":"MCP","pages":[{"title":"MCP overview","href":"/mcp/overview"},{"title":"Install the MCP server","href":"/mcp/installation"},{"title":"Connect an MCP client","href":"/mcp/clients"}]},{"group":"Integrations","pages":[{"title":"Integrations overview","href":"/integrations/overview"},{"title":"Shopify","description":"Connect a Shopify storefront to LoyaltyDog.","href":"/integrations/shopify"},{"title":"WordPress / WooCommerce","href":"/integrations/wordpress"},{"title":"Square","description":"Award loyalty points and run points-discount checkouts from Square POS.","href":"/integrations/square"},{"title":"Clover","href":"/integrations/clover"},{"title":"Eposnow","href":"/integrations/eposnow"},{"title":"Zapier","href":"/integrations/zapier"},{"title":"Build a custom integration","href":"/integrations/custom"}]},{"group":"Guides","pages":[{"title":"Webhooks","href":"/guides/webhooks"},{"title":"Errors","href":"/guides/errors"},{"title":"Rate limits","href":"/guides/rate-limits"},{"title":"Idempotency","href":"/guides/idempotency"},{"title":"Test mode","href":"/guides/test-mode"},{"title":"Wallet passes","href":"/guides/wallet-passes"},{"title":"Reporting","href":"/guides/reporting"}]},{"group":"Resources","pages":[{"title":"Changelog","href":"/resources/changelog"},{"title":"Support","href":"/resources/support"},{"title":"Status","href":"/resources/status"},{"title":"OpenAPI spec","href":"/resources/openapi"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"WordPress / WooCommerce - LoyaltyDog","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}