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-jstokenizeCard()→ token. - Server:
POST /payment-instruments/create-from-token→pi_...(vault, PSP-agnostic). ThenPOST /payments/process {amount, currency, storeId, paymentInstrumentId, paymentFlowId, initiatedBy:'customer', mode:'purchase'}. - One-click OTO on saved card: same
payments.processwithinitiatedBy:'merchant', reasonType:'recurring'. No re-entry of card. Maps 1:1 onto Divine Rev Upsell Checkout v2 tokenized branch. - 3DS:
create-3ds-sessionfamily; client runsstartChallenge, server confirms viaget-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.checkoutOffersexist 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.devvsapp.tagadapay.dev); resolve withGET /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 onX-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
descriptorobject on processor credentials supportsdescriptor,descriptor_suffix,phone,address,city,state,postal,country,mcc,url. Email-only support fits: useurl(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)
- Processing account (TPA) live. Last known:
tpa_2a416aea44b5pending on 2026-09-02. - A separate store for the prayer brand (isolation rule). Existing store
store_3c1ac969c839is Numina House. Confirm whether one org can hold a second store with its own descriptor, or whether a second TPA is needed. - Dev access token + sandbox token. Payment flow id (single processor, 3DS per their risk rule). Webhook endpoint registered per env, secret captured at creation.
- 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.tswith amockadapter 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).