RESEARCH

TAGADAPAY DIGEST — payments rail for the prayer engine (2026-09-14)

prayer/research/TAGADAPAY-DIGEST.md

TAGADAPAY DIGEST — payments rail for the prayer engine (2026-09-14)

"Tagged Pay" (dictated) = TagadaPay (api.tagada.io, docs.tagada.io), white-labelled to Shaw as PayFresco (app.payfresco.com, partner retryhub). PayFresco has no API of its own.

Sources (all local, read this session):

  • /home/sha/vibing/devine_rev/00-PROJECT-HQ/PAYFRESCO-SCOPE-20260901.md (rate card verbatim, MoR evaluation, API surface, gaps)
  • /home/sha/vibing/devine_rev/00-PROJECT-HQ/TAGADA-MAPPING-DIGEST-20260906.md (adapter contract, signed commercial terms)
  • /home/sha/vibing/rosaluna-wt-r2quiz/SPEC-TAGADA-RAIL-v1.md (adapter spec T1–T5, verification gates)
  • /home/sha/vibing/devine_rev/00-PROJECT-HQ/tagada-docs-20260906/ (docs mirror: processor-credentials, webhooks-events, sdks-at-a-glance, card-tokenization, subscriptions, sandbox-testing)

Commercial terms (signed 2026-09-03, per TAGADA-MAPPING-DIGEST line 51)

  • Shaw's entity 9566-0866 is merchant of record, full chargeback liability.
  • ~10.4% + $0.70 blended per approved transaction; +2% on subscriptions and upsells; +2% Amex; +1.5% international.
  • Chargeback fee $15. Reserve 10% held 60 days rolling. Texas law, 30-day term.
  • Platform schedule (PayFresco Billing → Plan Details): $75/week base, $0.30 per declined attempt, $0.07 per 3DS check, wallets 6.5% of wallet volume, custom domain $2/week.
  • Open in writing (never answered as of 2026-09-03): payout schedule, reserve release on termination, acquirer identity, cross-border fee, descriptor string on managed acquiring.

Effect on prayer engine unit economics

Ticket Fee (10.4% + $0.70) Note
FE $34.90 $4.33 (12.4%) SPEC §3 contribution drops from ~$33.50 to ~$30.40
FE + candle + rush ($48.89) $5.79 + 2% on bump volume
OTO1 $14 $2.16 + 2% one-tap counts as upsell surcharge
OTO2 $9.90 $1.73 + 2%
Monthly $9.90 rebill $1.73 + $0.20 = $1.93 (19.5%) rebills are the worst case
Annual $79 $8.92 + $1.58
Kill rule and scale rule in SPEC §9 must use the new contribution. Base fee $325/mo is fixed overhead regardless of volume.

Integration model (own funnel pages, Tagada tokenizes + charges)

  • Browser: @tagadapay/core-js tokenizeCard() → token.
  • Server: POST /payment-instruments/create-from-tokenpi_... (vault, PSP-agnostic). Then POST /payments/process {amount, currency, storeId, paymentInstrumentId, paymentFlowId, initiatedBy:'customer', mode:'purchase'}.
  • One-click OTO on saved card: same payments.process with initiatedBy:'merchant', reasonType:'recurring'. No re-entry of card. Maps 1:1 onto Divine Rev Upsell Checkout v2 tokenized branch.
  • 3DS: create-3ds-session family; client runs startChallenge, server confirms via get-3ds-challenge-result.
  • Refunds: refund-payment (full or partial).
  • Subscriptions: native engine with dunning ladder 24h/48h/96h/168h/168h then cancel; pause/resume/cancel via API; subscriptions.changeProcessor() moves a live sub without re-collecting the card. Decision for this engine: use Tagada's subscription engine (D1 in the Rosaluna spec kept its own cron because of ROSCA evidence assets; the prayer engine has no such asset yet, so use theirs and mirror events). Revisit if dunning email control proves insufficient.
  • Order bumps and offers: tagada.offers / tagada.checkoutOffers exist but only matter on their hosted checkout. We own checkout, so bumps are just amount math on the FE charge.
  • Products/prices: none created on Tagada. Amounts come from BrandConfig in cents.
  • Wallets: Apple/Google Pay supported via core-js but billed 6.5%. OFF for v1. PayPal: only via BYO processors that support it; OFF.
  • Sandbox: sandbox processor type + sandbox payment flow; accepts any card number. Sandbox host is documented inconsistently (api.tagadapay.dev vs app.tagadapay.dev); resolve with GET /auth/test. Prod: https://api.tagada.io/api/public/v1.
  • Rate limit 100 req/min.

Webhooks

  • HMAC-SHA256 over raw body, header X-TagadaPay-Signature, replay check on X-TagadaPay-Timestamp. Secret returned once at endpoint creation.
  • Delivery contract is weak: 3 attempts inside ~34 s, any non-2xx burns an attempt, endpoint auto-disabled after 3 days of failures. Handler must return 2xx instantly and enqueue. Add a 48h reconciliation sweep against the orders/payments list API.
  • Event catalog (docs mirror): checkout/initiated, checkout/emailValidated, order/created, order/paymentInitiated, order/paid, order/failed, order/refunded, order/upsellStarted, order/syncFailed, payment/created, payment/authorized, payment/succeeded, payment/failed, payment/rejected, payment/refunded, subscription/created, subscription/rebillUpcoming, subscription/rebillSucceeded, subscription/rebillDeclined, subscription/rebillCaptureFailed, subscription/pastDue, subscription/paused, subscription/resumed, subscription/cancelScheduled, subscription/canceled.
  • No dispute or chargeback event exists in the catalog. The 0.6% dispute kill-switch cannot be webhook-driven. Disputes must be read from the dashboard (or a statements export) on a daily manual or scripted check. Ask Leon whether dispute alerts exist on managed acquiring.
  • No idempotency key on payments. Write a pre-charge intent row and never re-fire an in-flight charge.
  • No payouts, balance, or settlement API. Reconciliation is dashboard/CSV.

Statement descriptor

  • On BYO processors the descriptor object on processor credentials supports descriptor, descriptor_suffix, phone, address, city, state, postal, country, mcc, url. Email-only support fits: use url (support site) and no phone.
  • On TagadaPay managed acquiring (tagadapay-router) the descriptor is set by their acquiring setup, not documented. Must be confirmed with Leon before launch. Rule stands: brand short name, no word "prayer".

Prerequisites before any payment code (Shaw-side)

  1. Processing account (TPA) live. Last known: tpa_2a416aea44b5 pending on 2026-09-02.
  2. A separate store for the prayer brand (isolation rule). Existing store store_3c1ac969c839 is Numina House. Confirm whether one org can hold a second store with its own descriptor, or whether a second TPA is needed.
  3. Dev access token + sandbox token. Payment flow id (single processor, 3DS per their risk rule). Webhook endpoint registered per env, secret captured at creation.
  4. Written answers from Leon: descriptor string on managed acquiring, dispute alerting, payout cadence, reserve release.

Reuse map

  • Adapter contract and method table: SPEC-TAGADA-RAIL-v1.md §4 T1 (PspAdapter: createCustomer, vaultCard, charge, confirmAction, cancelSubscription, refund, parseWebhook). Port as packages/payments/tagada.ts with a mock adapter for tests.
  • Verification gates: SPEC-TAGADA-RAIL-v1.md §5 (mock parity → sandbox E2E with real browser card submit → webhook chaos check → one live purchase + refund → payout watch before ad scale). Adopt verbatim.
  • OTO page pattern: Divine Rev Upsell Checkout v2 (confirmation-not-checkout, decline ladder, one follow-up email, ownership pre-check, per-token rate limit).