[{"data":1,"prerenderedAt":1370},["ShallowReactive",2],{"navigation":3,"external-navigation":214,"external_core:\u002Fcore\u002Fprocessors\u002Fchoice-digital":443},[4,8,201],{"title":5,"path":6,"stem":7},"Documentation","\u002F","README",{"title":9,"path":10,"stem":11,"children":12},"EOS","\u002Feos","eos\u002FREADME",[13,44,121,181],{"title":14,"collapsed":15,"path":16,"stem":17,"children":18,"page":43},"Adrs",true,"\u002Feos\u002Fadrs","eos\u002Fadrs",[19,23,27,31,35,39],{"title":20,"path":21,"stem":22},"Use Turborepo for the EOS monorepo","\u002Feos\u002Fadrs\u002F0001-use-turborepo-for-eos","eos\u002Fadrs\u002F0001-use-turborepo-for-eos",{"title":24,"path":25,"stem":26},"Use Oxc for linting and formatting","\u002Feos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting","eos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting",{"title":28,"path":29,"stem":30},"Lint Markdown and validate links in CI","\u002Feos\u002Fadrs\u002F0004-lint-markdown-in-ci","eos\u002Fadrs\u002F0004-lint-markdown-in-ci",{"title":32,"path":33,"stem":34},"Use Lefthook for repository-managed Git hooks","\u002Feos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks","eos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks",{"title":36,"path":37,"stem":38},"Use Commitlint's conventional configuration","\u002Feos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration","eos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration",{"title":40,"path":41,"stem":42},"Use Nx for EOS task execution","\u002Feos\u002Fadrs\u002F0007-use-nx-for-eos","eos\u002Fadrs\u002F0007-use-nx-for-eos",false,{"title":45,"path":46,"stem":47,"children":48},"Harbourmaster","\u002Feos\u002Fharbourmaster","eos\u002Fharbourmaster\u002FREADME",[49,58,71,96],{"title":50,"path":51,"stem":52,"children":53,"page":43},"Decisions","\u002Feos\u002Fharbourmaster\u002Fdecisions","eos\u002Fharbourmaster\u002Fdecisions",[54],{"title":55,"path":56,"stem":57},"AI-50: GitHub auth and fork pull request policy","\u002Feos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy","eos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy",{"title":59,"path":60,"stem":61,"children":62,"page":43},"Explanation","\u002Feos\u002Fharbourmaster\u002Fexplanation","eos\u002Fharbourmaster\u002Fexplanation",[63,67],{"title":64,"path":65,"stem":66},"The Harbourmaster review pipeline","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline","eos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline",{"title":68,"path":69,"stem":70},"The Harbourmaster shared-action trust boundary","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary","eos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary",{"title":72,"path":73,"stem":74,"children":75,"page":43},"How To","\u002Feos\u002Fharbourmaster\u002Fhow-to","eos\u002Fharbourmaster\u002Fhow-to",[76,80,84,88,92],{"title":77,"path":78,"stem":79},"How to add Harbourmaster reviews to a repository","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository","eos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository",{"title":81,"path":82,"stem":83},"How to build a pilot dashboard","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard","eos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard",{"title":85,"path":86,"stem":87},"How to configure model routing","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing","eos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing",{"title":89,"path":90,"stem":91},"How to request a Harbourmaster review","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review",{"title":93,"path":94,"stem":95},"How to diagnose a Harbourmaster review failure","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review",{"title":97,"path":98,"stem":99,"children":100,"page":43},"Reference","\u002Feos\u002Fharbourmaster\u002Freference","eos\u002Fharbourmaster\u002Freference",[101,105,109,113,117],{"title":102,"path":103,"stem":104},"Harbourmaster command-line interface","\u002Feos\u002Fharbourmaster\u002Freference\u002Fcli","eos\u002Fharbourmaster\u002Freference\u002Fcli",{"title":106,"path":107,"stem":108},"Harbourmaster configuration","\u002Feos\u002Fharbourmaster\u002Freference\u002Fconfiguration","eos\u002Fharbourmaster\u002Freference\u002Fconfiguration",{"title":110,"path":111,"stem":112},"Harbourmaster GitHub Action","\u002Feos\u002Fharbourmaster\u002Freference\u002Fgithub-action","eos\u002Fharbourmaster\u002Freference\u002Fgithub-action",{"title":114,"path":115,"stem":116},"Harbourmaster review behavior","\u002Feos\u002Fharbourmaster\u002Freference\u002Freview-behavior","eos\u002Fharbourmaster\u002Freference\u002Freview-behavior",{"title":118,"path":119,"stem":120},"Harbourmaster telemetry","\u002Feos\u002Fharbourmaster\u002Freference\u002Ftelemetry","eos\u002Fharbourmaster\u002Freference\u002Ftelemetry",{"title":72,"path":122,"stem":123,"children":124,"page":43},"\u002Feos\u002Fhow-to","eos\u002Fhow-to",[125,129,133,137,141,145,149,153,157,161,165,169,173,177],{"title":126,"path":127,"stem":128},"How to add an external documentation source","\u002Feos\u002Fhow-to\u002Fadd-external-documentation-source","eos\u002Fhow-to\u002Fadd-external-documentation-source",{"title":130,"path":131,"stem":132},"How to connect SDLC integrations","\u002Feos\u002Fhow-to\u002Fconnect-sdlc-integrations","eos\u002Fhow-to\u002Fconnect-sdlc-integrations",{"title":134,"path":135,"stem":136},"How to consume the EOS plugin marketplace","\u002Feos\u002Fhow-to\u002Fconsume-eos-marketplace","eos\u002Fhow-to\u002Fconsume-eos-marketplace",{"title":138,"path":139,"stem":140},"How to create a spike ticket","\u002Feos\u002Fhow-to\u002Fcreate-spike-ticket","eos\u002Fhow-to\u002Fcreate-spike-ticket",{"title":142,"path":143,"stem":144},"How to finalise a repository change","\u002Feos\u002Fhow-to\u002Ffinalise-change","eos\u002Fhow-to\u002Ffinalise-change",{"title":146,"path":147,"stem":148},"How to install the EOS Docs MCP server","\u002Feos\u002Fhow-to\u002Finstall-eos-docs-mcp","eos\u002Fhow-to\u002Finstall-eos-docs-mcp",{"title":150,"path":151,"stem":152},"How to resolve a spike ticket","\u002Feos\u002Fhow-to\u002Fresolve-spike-ticket","eos\u002Fhow-to\u002Fresolve-spike-ticket",{"title":154,"path":155,"stem":156},"How to run Git hook checks","\u002Feos\u002Fhow-to\u002Frun-git-hook-checks","eos\u002Fhow-to\u002Frun-git-hook-checks",{"title":158,"path":159,"stem":160},"How to use the AI-enabled SDLC","\u002Feos\u002Fhow-to\u002Fuse-ai-enabled-sdlc","eos\u002Fhow-to\u002Fuse-ai-enabled-sdlc",{"title":162,"path":163,"stem":164},"Use the Aikido plugin","\u002Feos\u002Fhow-to\u002Fuse-aikido-plugin","eos\u002Fhow-to\u002Fuse-aikido-plugin",{"title":166,"path":167,"stem":168},"How to use Compass","\u002Feos\u002Fhow-to\u002Fuse-compass","eos\u002Fhow-to\u002Fuse-compass",{"title":170,"path":171,"stem":172},"How to use Fallow","\u002Feos\u002Fhow-to\u002Fuse-fallow","eos\u002Fhow-to\u002Fuse-fallow",{"title":174,"path":175,"stem":176},"How to use incremental mutation tests","\u002Feos\u002Fhow-to\u002Fuse-incremental-mutation-tests","eos\u002Fhow-to\u002Fuse-incremental-mutation-tests",{"title":178,"path":179,"stem":180},"How to use Scout","\u002Feos\u002Fhow-to\u002Fuse-scout","eos\u002Fhow-to\u002Fuse-scout",{"title":97,"path":182,"stem":183,"children":184,"page":43},"\u002Feos\u002Freference","eos\u002Freference",[185,189,193,197],{"title":186,"path":187,"stem":188},"Compass CLI","\u002Feos\u002Freference\u002Fcompass-cli","eos\u002Freference\u002Fcompass-cli",{"title":190,"path":191,"stem":192},"EOS marketplace skills","\u002Feos\u002Freference\u002Fmarketplace-skills","eos\u002Freference\u002Fmarketplace-skills",{"title":194,"path":195,"stem":196},"Nx task execution and cache","\u002Feos\u002Freference\u002Fnx-task-execution","eos\u002Freference\u002Fnx-task-execution",{"title":198,"path":199,"stem":200},"Scout CLI","\u002Feos\u002Freference\u002Fscout-cli","eos\u002Freference\u002Fscout-cli",{"title":202,"path":203,"stem":204,"children":205},"Product engineering","\u002Fproduct-engineering","product-engineering\u002FREADME",[206],{"title":14,"collapsed":15,"path":207,"stem":208,"children":209,"page":43},"\u002Fproduct-engineering\u002Fadrs","product-engineering\u002Fadrs",[210],{"title":211,"path":212,"stem":213},"Codify Engineering Standards as Skills","\u002Fproduct-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills","product-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills",[215,268],{"nav":216,"source":265},[217],{"title":218,"path":219,"stem":220,"children":221},"Ember","\u002Fember","ember",[222,225,257,261],{"title":223,"path":219,"stem":224},"StoreFront Documentation","ember\u002Findex",{"title":14,"path":226,"stem":227,"children":228,"page":43},"\u002Fember\u002Fadrs","ember\u002Fadrs",[229,233,237,241,245,249,253],{"title":230,"path":231,"stem":232},"Add Infection as a non-blocking mutation testing tool for Ember","\u002Fember\u002Fadrs\u002F0001-infection-mutation-testing","ember\u002Fadrs\u002F0001-infection-mutation-testing",{"title":234,"path":235,"stem":236},"Process DELETE scheduled changes before CREATE_UPDATE at the same instant","\u002Fember\u002Fadrs\u002F0002-scheduled-change-processing-order","ember\u002Fadrs\u002F0002-scheduled-change-processing-order",{"title":238,"path":239,"stem":240},"Standard rate scheduling is permanent until overridden","\u002Fember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent","ember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent",{"title":242,"path":243,"stem":244},"Promotions require an existing standard rate","\u002Fember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate","ember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate",{"title":246,"path":247,"stem":248},"UTC datetime contract between Storefront and Hub","\u002Fember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub","ember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub",{"title":250,"path":251,"stem":252},"Elapsed unprocessed scheduled changes do not block rate changes","\u002Fember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes","ember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes",{"title":254,"path":255,"stem":256},"ADR-0007: Delete ConfigureTenantAuth routing command once OIDC setup migrates to Hub","\u002Fember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command","ember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command",{"title":258,"path":259,"stem":260},"Domain Overview","\u002Fember\u002Fdomain_overview","ember\u002Fdomain_overview",{"title":262,"path":263,"stem":264},"Main Flows","\u002Fember\u002Fkey_flows","ember\u002Fkey_flows",{"collectionName":266,"label":267,"prefix":220},"external_ember","StoreFront (Ember)",{"nav":269,"source":441},[270],{"title":271,"path":272,"stem":273,"children":274},"Core","\u002Fcore","core",[275,278,306,310,332,336,346,363,420,424],{"title":276,"path":272,"stem":277},"Documentation Index","core\u002Findex",{"title":14,"path":279,"stem":280,"children":281,"page":43},"\u002Fcore\u002Fadrs","core\u002Fadrs",[282,286,290,294,298,302],{"title":283,"path":284,"stem":285},"ADR-XXXX: Short, descriptive title","\u002Fcore\u002Fadrs\u002F0000-template","core\u002Fadrs\u002F0000-template",{"title":287,"path":288,"stem":289},"ADR-1: Promotions endpoint","\u002Fcore\u002Fadrs\u002F0001-add-promotions-endpoint","core\u002Fadrs\u002F0001-add-promotions-endpoint",{"title":291,"path":292,"stem":293},"ADR-2: EOM partner report job dispatch","\u002Fcore\u002Fadrs\u002F0002-eom-report-job-dispatch","core\u002Fadrs\u002F0002-eom-report-job-dispatch",{"title":295,"path":296,"stem":297},"ADR-3: Replace PB fee waive flag with a Zero scheme override","\u002Fcore\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme","core\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme",{"title":299,"path":300,"stem":301},"ADR-4: No processor Digital Top-up capability gate in Reloadable Commercials","\u002Fcore\u002Fadrs\u002F0004-no-processor-top-up-capability-gate","core\u002Fadrs\u002F0004-no-processor-top-up-capability-gate",{"title":303,"path":304,"stem":305},"ADR-5: Sparse polymorphic sale fee override reason stamp","\u002Fcore\u002Fadrs\u002F0005-sale-fee-override-reason-stamp","core\u002Fadrs\u002F0005-sale-fee-override-reason-stamp",{"title":307,"path":308,"stem":309},"Agent Workflow","\u002Fcore\u002Fai-workflow","core\u002Fai-workflow",{"title":311,"path":312,"stem":313,"children":314},"Backend Guide","\u002Fcore\u002Fbackend","core\u002Fbackend\u002Findex",[315,316,320,324,328],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319},"Backend AI Tooling","\u002Fcore\u002Fbackend\u002Fai-tooling","core\u002Fbackend\u002Fai-tooling",{"title":321,"path":322,"stem":323},"Backend Linting and Formatting","\u002Fcore\u002Fbackend\u002Flinting-and-formatting","core\u002Fbackend\u002Flinting-and-formatting",{"title":325,"path":326,"stem":327},"Backend Setup","\u002Fcore\u002Fbackend\u002Fsetup","core\u002Fbackend\u002Fsetup",{"title":329,"path":330,"stem":331},"Backend Testing","\u002Fcore\u002Fbackend\u002Ftesting","core\u002Fbackend\u002Ftesting",{"title":333,"path":334,"stem":335},"Documentation Health","\u002Fcore\u002Fdoc-health","core\u002Fdoc-health",{"title":337,"path":338,"stem":339,"children":340},"Frontend Guide","\u002Fcore\u002Ffrontend","core\u002Ffrontend\u002Findex",[341,342],{"title":337,"path":338,"stem":339},{"title":343,"path":344,"stem":345},"Frontend Development","\u002Fcore\u002Ffrontend\u002Fdevelopment","core\u002Ffrontend\u002Fdevelopment",{"title":347,"path":348,"stem":349,"children":350,"page":43},"Modules","\u002Fcore\u002Fmodules","core\u002Fmodules",[351,355],{"title":352,"path":353,"stem":354},"Connect API","\u002Fcore\u002Fmodules\u002Fconnect-api","core\u002Fmodules\u002Fconnect-api",{"title":356,"path":357,"stem":358,"children":359,"page":43},"Secure Links","\u002Fcore\u002Fmodules\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links",[360],{"title":356,"path":361,"stem":362},"\u002Fcore\u002Fmodules\u002Fsecure-links\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links\u002Fsecure-links",{"title":364,"path":365,"stem":366,"children":367,"page":43},"Processors","\u002Fcore\u002Fprocessors","core\u002Fprocessors",[368,372,376,380,384,388,392,396,400,404,408,412,416],{"title":369,"path":370,"stem":371},"Amazon Processor and API","\u002Fcore\u002Fprocessors\u002Famazon","core\u002Fprocessors\u002Famazon",{"title":373,"path":374,"stem":375},"Amilon Processor and API","\u002Fcore\u002Fprocessors\u002Familon","core\u002Fprocessors\u002Familon",{"title":377,"path":378,"stem":379},"Cadooz Processor and API","\u002Fcore\u002Fprocessors\u002Fcadooz","core\u002Fprocessors\u002Fcadooz",{"title":381,"path":382,"stem":383},"Choice Digital Processor and API","\u002Fcore\u002Fprocessors\u002Fchoice-digital","core\u002Fprocessors\u002Fchoice-digital",{"title":385,"path":386,"stem":387},"Diggecard processor reference","\u002Fcore\u002Fprocessors\u002Fdiggecard","core\u002Fprocessors\u002Fdiggecard",{"title":389,"path":390,"stem":391},"ePay Processor and API","\u002Fcore\u002Fprocessors\u002Fepay","core\u002Fprocessors\u002Fepay",{"title":393,"path":394,"stem":395},"GoGift v2 Processor and API","\u002Fcore\u002Fprocessors\u002Fgo-gift-v2","core\u002Fprocessors\u002Fgo-gift-v2",{"title":397,"path":398,"stem":399},"InComm Processor and API","\u002Fcore\u002Fprocessors\u002Fincomm","core\u002Fprocessors\u002Fincomm",{"title":401,"path":402,"stem":403},"Ogloba Processor and API","\u002Fcore\u002Fprocessors\u002Fogloba","core\u002Fprocessors\u002Fogloba",{"title":405,"path":406,"stem":407},"SVSECard Processor and API","\u002Fcore\u002Fprocessors\u002Fsvs-ecard","core\u002Fprocessors\u002Fsvs-ecard",{"title":409,"path":410,"stem":411},"Vananam Processor and API","\u002Fcore\u002Fprocessors\u002Fvananam","core\u002Fprocessors\u002Fvananam",{"title":413,"path":414,"stem":415},"Vouchers Depot processor reference","\u002Fcore\u002Fprocessors\u002Fvouchers-depot","core\u002Fprocessors\u002Fvouchers-depot",{"title":417,"path":418,"stem":419},"You Got a Gift Processor and API","\u002Fcore\u002Fprocessors\u002Fyou-got-a-gift","core\u002Fprocessors\u002Fyou-got-a-gift",{"title":421,"path":422,"stem":423},"Development Quickstart","\u002Fcore\u002Fsetup","core\u002Fsetup",{"title":425,"path":426,"stem":427,"children":428,"page":43},"Workflows","\u002Fcore\u002Fworkflows","core\u002Fworkflows",[429,433,437],{"title":430,"path":431,"stem":432},"Hub Endpoint Workflow","\u002Fcore\u002Fworkflows\u002Fhub-endpoints","core\u002Fworkflows\u002Fhub-endpoints",{"title":434,"path":435,"stem":436},"OpenAPI Tooling","\u002Fcore\u002Fworkflows\u002Fopenapi-tooling","core\u002Fworkflows\u002Fopenapi-tooling",{"title":438,"path":439,"stem":440},"Processor Integration Workflow","\u002Fcore\u002Fworkflows\u002Fprocessors","core\u002Fworkflows\u002Fprocessors",{"collectionName":442,"label":271,"prefix":273},"external_core",{"page":444,"surround":1367},{"id":445,"title":381,"body":446,"config":1362,"description":452,"extension":1363,"meta":1364,"navigation":15,"path":382,"seo":1365,"stem":383,"__hash__":1366},"external_core\u002Fcore\u002Fprocessors\u002Fchoice-digital.md",{"type":447,"value":448,"toc":1345},"minimark",[449,453,458,461,464,535,539,574,577,587,591,596,603,737,740,744,751,758,901,912,921,935,938,948,952,955,1010,1018,1022,1025,1125,1156,1160,1163,1214,1218,1221,1255,1258,1262,1265,1268,1272],[450,451,452],"p",{},"This page explains the Choice Digital integration from an operations and customer-service perspective: how an order moves through the system, which settings control the request shape, and what evidence is useful when investigating a failed or delayed gift-card order.",[454,455,457],"h2",{"id":456},"what-choice-digital-does","What Choice Digital does",[450,459,460],{},"Choice Digital is a digital card processor with catalogue support. The current application behaviour is synchronous: the processor calls the realtime order endpoint and expects the order to be processed and an activation URL to be returned in the same response.",[450,462,463],{},"The processor is configured as:",[465,466,467,480],"table",{},[468,469,470],"thead",{},[471,472,473,477],"tr",{},[474,475,476],"th",{},"Property",[474,478,479],{},"Behaviour",[481,482,483,492,500,508,516,523],"tbody",{},[471,484,485,489],{},[486,487,488],"td",{},"Processor type",[486,490,491],{},"SKU per product",[471,493,494,497],{},[486,495,496],{},"Processing",[486,498,499],{},"Synchronous",[471,501,502,505],{},[486,503,504],{},"Delivery",[486,506,507],{},"Digital voucher\u002Fcode",[471,509,510,513],{},[486,511,512],{},"Balance lookup",[486,514,515],{},"Unsupported",[471,517,518,521],{},[486,519,520],{},"Cancellation",[486,522,515],{},[471,524,525,528],{},[486,526,527],{},"Issue completion rule",[486,529,530,534],{},[531,532,533],"code",{},"response_data.order_status=processed",", a ready-for-activation card, and a valid activation URL",[454,536,538],{"id":537},"order-lifecycle","Order lifecycle",[540,541,542,546,549,552,567],"ol",{},[543,544,545],"li",{},"A partner orders a Choice Digital brand through the normal gift-card API.",[543,547,548],{},"The application reads the Choice Digital product reference and the partner’s funding-source identifier configured for the brand\u002Fpartner relationship.",[543,550,551],{},"Request middleware validates the customer fields required by the selected Choice Digital mode. The processor then builds a realtime order request with the product identifier, amount, and internal transaction reference.",[543,553,554,555,558,559,562,563,566],{},"The client obtains and caches an OAuth bearer token, then sends ",[531,556,557],{},"POST \u002Forders-realtime"," with the ",[531,560,561],{},"x-idempotency-key"," and ",[531,564,565],{},"x-tenant-id"," headers.",[543,568,569,570,573],{},"The response is validated. The provider ",[531,571,572],{},"order_id"," becomes the processor reference and the provider activation URL becomes the card URL.",[450,575,576],{},"If the realtime response is missing a required field, has an unexpected status, fails authentication, or cannot be sent, the issue fails with an external or response-validation error and should be investigated using the processor interaction audit records.",[578,579,580],"blockquote",{},[450,581,582,586],{},[583,584,585],"span",{},"!IMPORTANT","\nChoice Digital uses an idempotency key based on the internal external-card identifier. This helps prevent accidental duplicate orders when the same request is retried.",[454,588,590],{"id":589},"settings","Settings",[592,593,595],"h3",{"id":594},"processor-settings","Processor settings",[450,597,598,599,602],{},"The processor-level settings are environment-backed values in ",[531,600,601],{},"config\u002Fchoice-digital.php",":",[465,604,605,618],{},[468,606,607],{},[471,608,609,612,615],{},[474,610,611],{},"Setting",[474,613,614],{},"Environment variable",[474,616,617],{},"Purpose",[481,619,620,633,646,659,672,685,698,711,724],{},[471,621,622,625,630],{},[486,623,624],{},"API base URI",[486,626,627],{},[531,628,629],{},"CHOICE_DIGITAL_BASE_URI",[486,631,632],{},"Base URL for Choice Digital API requests",[471,634,635,638,643],{},[486,636,637],{},"Authentication URI",[486,639,640],{},[531,641,642],{},"CHOICE_DIGITAL_AUTH_URI",[486,644,645],{},"OAuth token endpoint",[471,647,648,651,656],{},[486,649,650],{},"Client ID",[486,652,653],{},[531,654,655],{},"CHOICE_DIGITAL_CLIENT_ID",[486,657,658],{},"OAuth client identifier",[471,660,661,664,669],{},[486,662,663],{},"Client secret",[486,665,666],{},[531,667,668],{},"CHOICE_DIGITAL_CLIENT_SECRET",[486,670,671],{},"OAuth client secret",[471,673,674,677,682],{},[486,675,676],{},"Audience",[486,678,679],{},[531,680,681],{},"CHOICE_DIGITAL_AUDIENCE",[486,683,684],{},"OAuth audience value",[471,686,687,690,695],{},[486,688,689],{},"Tenant ID",[486,691,692],{},[531,693,694],{},"CHOICE_DIGITAL_TENANT_ID",[486,696,697],{},"Default tenant header",[471,699,700,703,708],{},[486,701,702],{},"Timeout",[486,704,705],{},[531,706,707],{},"CHOICE_DIGITAL_TIMEOUT",[486,709,710],{},"HTTP client timeout",[471,712,713,716,721],{},[486,714,715],{},"Personalisation default",[486,717,718],{},[531,719,720],{},"CHOICE_DIGITAL_IS_PERSONALISATION_REQUIRED",[486,722,723],{},"Optional default controlling whether recipient name and email are sent",[471,725,726,729,734],{},[486,727,728],{},"Fulfillment parameters default",[486,730,731],{},[531,732,733],{},"CHOICE_DIGITAL_IS_FULFILMENT_PARAMETERS_REQUIRED",[486,735,736],{},"Optional default controlling whether name, email, address, phone number, and state details are sent",[450,738,739],{},"The API client caches the access token and attaches both the bearer token and tenant ID to provider requests. These values should stay in processor configuration rather than support notes.",[592,741,743],{"id":742},"brand-settings","Brand settings",[450,745,746,747,750],{},"Each Choice Digital-enabled brand must provide the product identifier expected by the realtime order endpoint. The processor type is ",[531,748,749],{},"SKU_PER_PRODUCT",", so the same configured product value is reused rather than looking up a separate SKU per denomination.",[450,752,753,754,757],{},"The processor supports two mutually exclusive customer-information modes. Configure only one for a Choice Digital brand; ",[531,755,756],{},"is_fulfilment_parameters_required"," includes the recipient name and email checks as well as the physical-address checks.",[465,759,760,775],{},[468,761,762],{},[471,763,764,766,769,772],{},[474,765,611],{},[474,767,768],{},"Request validation",[474,770,771],{},"Choice Digital payload",[474,773,774],{},"Operational use",[481,776,777,819],{},[471,778,779,784,799,816],{},[486,780,781],{},[531,782,783],{},"is_personalisation_required",[486,785,786,787,790,791,794,795,798],{},"Requires ",[531,788,789],{},"fulfilment_parameters.to_first_name",", ",[531,792,793],{},"fulfilment_parameters.to_last_name",", and a valid ",[531,796,797],{},"fulfilment_parameters.to_email",".",[486,800,801,802,790,805,790,808,811,812,815],{},"Sends ",[531,803,804],{},"card.customer_info.entity_type=individual",[531,806,807],{},"first_name",[531,809,810],{},"last_name",", and ",[531,813,814],{},"email_address","; no address fields are added.",[486,817,818],{},"Use when the order needs recipient personalisation but not a physical address.",[471,820,821,825,875,898],{},[486,822,823],{},[531,824,756],{},[486,826,827,828,790,831,790,834,790,837,790,840,790,843,811,846,849,850,790,853,811,856,859,860,862,863,866,867,870,871,874],{},"For Choice Digital, requires ",[531,829,830],{},"to_first_name",[531,832,833],{},"to_last_name",[531,835,836],{},"to_email",[531,838,839],{},"address_1",[531,841,842],{},"city",[531,844,845],{},"postal_code",[531,847,848],{},"country","; ",[531,851,852],{},"address_2",[531,854,855],{},"phone",[531,857,858],{},"state"," are optional. ",[531,861,848],{}," must be ",[531,864,865],{},"US"," or ",[531,868,869],{},"us",", and the postal code must match the supported four-digit, five-digit, ZIP+4, or ",[531,872,873],{},"ABC-123"," formats.",[486,876,877,878,881,882,790,885,790,888,790,890,790,892,790,894,811,896,798],{},"Sends the recipient name\u002Femail and the supplied fulfilment details under ",[531,879,880],{},"card.customer_info","; the provider field names are ",[531,883,884],{},"address1",[531,886,887],{},"address2",[531,889,842],{},[531,891,845],{},[531,893,848],{},[531,895,855],{},[531,897,858],{},[486,899,900],{},"Use for brands whose fulfilment requires physical customer details.",[450,902,903,904,907,908,911],{},"Both settings are resolved by ",[531,905,906],{},"Brand",": a non-empty brand attribute overrides the corresponding processor-level environment default. Do not enable both, Personalisation is a subset, so either disable both or enable one. The middleware evaluates ",[531,909,910],{},"isPersonalisationRequired()"," first and returns after those checks.",[450,913,914,915,918,919,798],{},"The application method is named ",[531,916,917],{},"isFulfillmentParametersRequired()",", and configuration and brand attribute use ",[531,920,756],{},[450,922,923,924,927,928,930,931,934],{},"Brands can override the tenant header with a ",[531,925,926],{},"tenant_id"," attribute; otherwise the processor uses the default tenant configured in ",[531,929,601],{},". The funding source comes from the partner-brand identifier rather than a standalone brand attribute. The ",[531,932,933],{},"funding_source_id"," must be present for the Buyer\u002Fbrand relationship and is entered through the Management Hub approval configuration.",[450,936,937],{},"If the brand is mapped to the wrong Choice Digital product, the provider may reject the order or return voucher data for the wrong product.",[578,939,940],{},[450,941,942,944,945,947],{},[583,943,585],{},"\nChoice Digital exposes a funding-sources operation that can be used operationally to monitor a Buyer’s ",[531,946,933],{}," and approval status. It is not currently integrated into this processor; confirm the configured funding source and approval status through the approved onboarding process.",[454,949,951],{"id":950},"api-operations","API operations",[450,953,954],{},"The application sends JSON REST requests to Choice Digital. The client exposes three operations:",[465,956,957,970],{},[468,958,959],{},[471,960,961,964,967],{},[474,962,963],{},"Operation",[474,965,966],{},"Use",[474,968,969],{},"Required data",[481,971,972,985,997],{},[471,973,974,979,982],{},[486,975,976],{},[531,977,978],{},"POST \u002Foauth\u002Ftoken",[486,980,981],{},"Retrieve an access token",[486,983,984],{},"Client ID, client secret, audience",[471,986,987,991,994],{},[486,988,989],{},[531,990,557],{},[486,992,993],{},"Create a realtime order",[486,995,996],{},"Product identifier, amount, external card ID, tenant ID",[471,998,999,1004,1007],{},[486,1000,1001],{},[531,1002,1003],{},"GET \u002Fcard-products",[486,1005,1006],{},"Retrieve catalogue data",[486,1008,1009],{},"Bearer token, tenant ID, pagination",[450,1011,1012,1013,1015,1016,798],{},"The realtime order request uses the internal external-card ID as the ",[531,1014,561],{},", which makes that value especially important when investigating duplicate-order concerns. When personalisation or fulfilment parameters are enabled for a brand, the corresponding customer details are included under ",[531,1017,880],{},[454,1019,1021],{"id":1020},"response-mapping-and-validation","Response mapping and validation",[450,1023,1024],{},"The interaction accepts an issue only when all of these values are present and valid:",[465,1026,1027,1040],{},[468,1028,1029],{},[471,1030,1031,1034,1037],{},[474,1032,1033],{},"Provider field",[474,1035,1036],{},"Required value",[474,1038,1039],{},"Application result",[481,1041,1042,1058,1073,1085,1097,1112],{},[471,1043,1044,1049,1052],{},[486,1045,1046],{},[531,1047,1048],{},"response_data.order_id",[486,1050,1051],{},"Non-empty string",[486,1053,1054,1055,798],{},"Stored as ",[531,1056,1057],{},"processor_reference",[471,1059,1060,1065,1070],{},[486,1061,1062],{},[531,1063,1064],{},"response_data.order_status",[486,1066,1067],{},[531,1068,1069],{},"processed",[486,1071,1072],{},"Confirms the realtime order completed. Other values fail response validation; there is no separate polling flow in this integration.",[471,1074,1075,1080,1082],{},[486,1076,1077],{},[531,1078,1079],{},"response_data.card.card_id",[486,1081,1051],{},[486,1083,1084],{},"Confirms provider card data is present.",[471,1086,1087,1092,1094],{},[486,1088,1089],{},[531,1090,1091],{},"response_data.card.external_card_id",[486,1093,1051],{},[486,1095,1096],{},"Confirms the provider response contains the external transaction identifier.",[471,1098,1099,1104,1109],{},[486,1100,1101],{},[531,1102,1103],{},"response_data.card.card_status",[486,1105,1106],{},[531,1107,1108],{},"ready_for_activation",[486,1110,1111],{},"Confirms the card can be activated.",[471,1113,1114,1119,1122],{},[486,1115,1116],{},[531,1117,1118],{},"response_data.card.activation_url",[486,1120,1121],{},"Valid URL",[486,1123,1124],{},"Stored as the returned card URL.",[450,1126,1127,1128,790,1130,790,1133,790,1136,811,1139,1142,1143,1145,1146,1149,1150,1152,1153,1155],{},"The provider request uses ",[531,1129,933],{},[531,1131,1132],{},"send_email",[531,1134,1135],{},"card.card_product_id",[531,1137,1138],{},"card.amount",[531,1140,1141],{},"card.external_card_id",". ",[531,1144,880],{}," is omitted for an anonymous order. When present, it contains ",[531,1147,1148],{},"entity_type=individual",", recipient name\u002Femail, and any non-null address, ",[531,1151,855],{},", or ",[531,1154,858],{}," fields; the country is uppercased before serialization.",[454,1157,1159],{"id":1158},"recent-processor-changes","Recent processor changes",[450,1161,1162],{},"The current branch extends Choice Digital ordering in these ways:",[1164,1165,1166,1173,1186,1195,1205,1208],"ul",{},[543,1167,1168,1169,1172],{},"Added optional address fields to the issue request data and forwarded them from ",[531,1170,1171],{},"fulfilment_parameters"," through the synchronous processor interaction.",[543,1174,1175,1176,562,1178,1180,1181,1183,1184,798],{},"Added optional ",[531,1177,855],{},[531,1179,858],{}," fields to the issue request data and forwarded them from ",[531,1182,1171],{}," into Choice Digital ",[531,1185,880],{},[543,1187,1188,1189,1191,1192,1194],{},"Added the ",[531,1190,917],{}," brand helper, the ",[531,1193,756],{}," processor default, and the corresponding Choice Digital issuer metadata so the setting can be configured at processor or brand level.",[543,1196,1197,1198,1200,1201,1204],{},"Made ",[531,1199,880],{}," optional for anonymous orders and changed disabled address fields to ",[531,1202,1203],{},"null",", so they are not serialized into the provider payload.",[543,1206,1207],{},"Added Choice Digital-specific validation for physical fulfilment: recipient name\u002Femail, address line 1, city, postal code, and US country; address line 2, phone number, and state remain optional.",[543,1209,1210,1211,1213],{},"Corrected the previous ",[531,1212,917],{}," spelling and added tests for request payloads, address handling, response validation, and the new middleware rules.",[454,1215,1217],{"id":1216},"customer-service-investigation","Customer-service investigation",[450,1219,1220],{},"When an order fails, check these values in order:",[540,1222,1223,1226,1229,1237,1240,1243,1249,1252],{},[543,1224,1225],{},"The requested brand, currency, and face value.",[543,1227,1228],{},"The brand's Choice Digital product sku.",[543,1230,1231,1232,562,1234,1236],{},"The brand's ",[531,1233,783],{},[531,1235,756],{}," attributes, plus the processor-level defaults when no brand override is set.",[543,1238,1239],{},"Whether the request supplied the required recipient and address fields, plus any optional phone number or state, for the enabled settings.",[543,1241,1242],{},"The sale's processor reference or external card identifier used for idempotency.",[543,1244,1245,1246,1248],{},"The processor interaction audit request and response, including the ",[531,1247,880],{}," fields sent to Choice Digital.",[543,1250,1251],{},"Whether the OAuth token call and tenant header configuration succeeded.",[543,1253,1254],{},"Whether the realtime order response returned the expected voucher data.",[450,1256,1257],{},"Do not manually place a replacement order until the original idempotency key and provider response have been reviewed. Reusing or changing the key incorrectly can hide whether the original purchase already succeeded.",[454,1259,1261],{"id":1260},"limitations-and-support-contacts","Limitations and support contacts",[450,1263,1264],{},"Choice Digital balance checks and cancellations are not implemented by this processor. Requests involving either operation must be handled through the applicable refund, cancellation, or balance-verification procedure rather than through a Choice Digital transaction.",[450,1266,1267],{},"When escalating to the provider, include the internal sale identifier, idempotency key or processor reference, timestamps, and the relevant audit evidence. Do not include stored voucher codes or credentials unless the approved support process requires them.",[454,1269,1271],{"id":1270},"related-code","Related code",[1164,1273,1274,1280,1286,1292,1298,1304,1310,1316,1322,1327,1333,1339],{},[543,1275,1276,1279],{},[531,1277,1278],{},"app\u002FProcessors\u002FChoiceDigital\u002FChoiceDigitalProcessor.php"," — realtime order flow and card mapping.",[543,1281,1282,1285],{},[531,1283,1284],{},"app\u002FProcessors\u002FInteraction\u002FIntegrations\u002FChoiceDigital\u002FChoiceDigitalProcessorInteraction.php"," — request construction and response validation.",[543,1287,1288,1291],{},[531,1289,1290],{},"app\u002FProcessors\u002FInteraction\u002FIssue\u002FIssueRequestData.php"," — recipient and optional address fields passed into issue interactions.",[543,1293,1294,1297],{},[531,1295,1296],{},"app\u002FHttp\u002FMiddleware\u002FV2\u002FAPI\u002FValidateFulfilmentParametersAndPersonalisationMiddleware.php"," — API validation for the selected customer-information mode.",[543,1299,1300,1303],{},[531,1301,1302],{},"app\u002FBrand.php"," — processor-default and brand-attribute resolution for isPersonalisationRequired and isFulfillmentParametersRequired flags.",[543,1305,1306,1309],{},[531,1307,1308],{},"app\u002FHttp\u002FClients\u002FChoiceDigital\u002FChoiceDigitalApi.php"," — OAuth, authenticated requests, and catalogue operations.",[543,1311,1312,1315],{},[531,1313,1314],{},"app\u002FHttp\u002FClients\u002FChoiceDigital\u002FRequests\u002F"," — auth, realtime order, and catalogue request payloads.",[543,1317,1318,1321],{},[531,1319,1320],{},"app\u002FCatalogueService\u002FJobs\u002FChoiceDigital\u002FChoiceDigitalCatalogueCollector.php"," — catalogue import logic.",[543,1323,1324,1326],{},[531,1325,601],{}," — processor environment settings.",[543,1328,1329,1332],{},[531,1330,1331],{},"tests\u002FUnit\u002FApp\u002FHttp\u002FClients\u002FChoiceDigital\u002FChoiceDigitalApiTest.php"," — request payload and API transport coverage.",[543,1334,1335,1338],{},[531,1336,1337],{},"tests\u002FUnit\u002FMiddleware\u002FValidateFulfilmentParametersAndPersonalisationMiddlewareTest.php"," — Choice Digital fulfilment validation coverage.",[543,1340,1341,1344],{},[531,1342,1343],{},"tests\u002FUnit\u002FProcessors\u002FInteraction\u002FIntegrations\u002FChoiceDigital\u002FChoiceDigitalProcessorInteractionTest.php"," — order lifecycle and failure scenarios.",{"title":1346,"searchDepth":1347,"depth":1347,"links":1348},"",3,[1349,1351,1352,1356,1357,1358,1359,1360,1361],{"id":456,"depth":1350,"text":457},2,{"id":537,"depth":1350,"text":538},{"id":589,"depth":1350,"text":590,"children":1353},[1354,1355],{"id":594,"depth":1347,"text":595},{"id":742,"depth":1347,"text":743},{"id":950,"depth":1350,"text":951},{"id":1020,"depth":1350,"text":1021},{"id":1158,"depth":1350,"text":1159},{"id":1216,"depth":1350,"text":1217},{"id":1260,"depth":1350,"text":1261},{"id":1270,"depth":1350,"text":1271},{},"md",{},{"title":381,"description":452},"B88Ze_bIGVyxkRhHE-0Kz1Zja9NgIooh0KqnPHF-9S8",[1368,1369],{"title":377,"path":378,"stem":379,"children":-1},{"title":385,"path":386,"stem":387,"children":-1},1789777548941]