# Coinvay Kajabi custom integration · 1.2.0 Delivered: Custom Code purchase form, Node checkout backend, durable payment outbox, and Kajabi Public API offer-grant worker. This is an external checkout/custom integration, not a native Kajabi Payments provider. ## Setup 1. Confirm Kajabi **Public API access** is active. Kajabi documents current Pro access or a separate API add-on. An owner/subowner creates API credentials in Settings → Public API. Grant only the permissions needed for contacts and offer grants. Do not paste credentials into a web page or send them to chat. 2. Deploy the included Node `server/` using BACKEND.md. Configure Coinvay receiving wallets, API key, private database, webhook secret if eligible, and real cron polling. The server uses only server-side catalog prices. 3. Copy catalog.example.json to a private configuration path, set your real SKU, USD price, Kajabi site ID and offer ID. Set COINVAY_CATALOG_FILE to this path. Do not allow customers to choose offer IDs or prices. 4. Set ALLOWED_ORIGINS to your exact Kajabi custom domain and/or Kajabi subdomain. Put persistent rate limiting at your HTTPS proxy; do not expose `/internal/orders` to customers. 5. Replace the backend origin and SKU in checkout-embed.html, then paste it into a Kajabi Custom Code block on a sales page that allows custom code. It collects the name/email for access and calls the server's `/purchase`. The hosted crypto checkout opens at Coinvay; no merchant secret is in the embed. 6. In server-only environment controls set KAJABI_CLIENT_ID and KAJABI_CLIENT_SECRET. Schedule `node fulfill.mjs` once per minute in addition to `node server/reconcile.mjs`. Both use the same private COINVAY_ORDER_DB. Run one fulfill process at a time. Its lock file is not automatically stolen; after a crash, stop all workers before removing `.kajabi-lock`. 7. Payment verification writes one outbox job. The worker finds an exact email + site contact (or creates one without marketing subscription), checks the existing offer grant, grants the configured offer and marks the job complete. Transient errors leave the job pending for retry. A successful API grant may send Kajabi welcome email; configure those emails in Kajabi. A checkout returning to a page does not grant access. A course is granted only after confirmed payment. These are granted offers, not a replacement for Kajabi's native purchase/payment/subscription reporting; test your site automations and emails. Refunds, cancellations, subscription renewals and access revocation are manual/business-specific and are not automatic in this kit. For membership subscriptions, do not use a one-time grant as a recurring billing entitlement. ## Test before enabling Use a staging offer and an email you control. Confirm pending payment gives no access; a valid confirmed payment grants exactly once; duplicate webhook/worker retry does not grant again; wrong site/email/offer is rejected; API outage leaves the job pending. Test existing customers and welcome emails. Kajabi API/account setup and a real grant trial have not been performed for your account. Official references: https://developers.kajabi.com/api-reference/contacts/grant-offer-to-contact and https://help.kajabi.com/en/articles/17175718-use-kajabi-s-public-api ## Branding The updated Coinvay logo assets and usage instructions are included in [BRANDING.md](BRANDING.md). Use SVG on supported web surfaces and PNG for native/platform restrictions. The embed uses the official Coinvay HTTPS logo URLs because Kajabi Custom Code blocks do not serve the downloaded asset directory. To self-host, upload the included assets to your own HTTPS asset host and replace only those image URLs. Do not put API keys into the block. ## Original store currency The currency-aware backend uses `currency` with a trusted decimal `amount` when creating a saved order, or integer `cents` in that currency’s minor units when calling the SDK directly (legacy field name). USD is the default for existing records. Example: `{reference:"order-123", amount:"1000.00", currency:"INR", email:"buyer@example.com"}` for `Store.create`; for `Coinvay.create`, use `{reference:"order-123", cents:100000, currency:"INR"}`. The server catalog may set `currency`. The Shopify adapter takes currency only from its authenticated payment session. Coinvay returns USD amount/currency plus originalAmount/originalCurrency and the rate snapshot. Save and compare both source and USD totals before fulfillment. Kit database upgrades add the original currency and locked USD amount without changing old USD orders. Actual FX availability and codes come from /api/currencies. No fiat conversion/remittance is performed. ## Manual or automatic account connection · 1.2.0 Use **Connect to Coinvay** to sign in and authorize this store, or retain manual API-key setup. This release adds separate checkout business name/logo and per-store signed webhooks without changing other stores. Read **CONNECT.md**, included in this package, for exact controls, environment variables, administrator-session integration, encryption/backups, permissions and staging checks. Custom app kits require your existing administrator authentication; Shopify remains subject to platform approval.