Skip to main content

Chapter 26 — Payment Plans: Splitting Big Money

Attend onboarding guide · ~7 min read · ↑ Back to contents

Chapter 22 mentioned payment plans in one paragraph. Here's the full machine — born because the Miami Dolphins' payment processor cannot authorize anything over $25,000, and suite purchases routinely are. Rather than hard-code an exception, a reusable plan system was built (in about a week — the team already knew the V2 implementation).

⚠️ Status: built, not yet live. The charging code is still in testing; the recurring-charge job isn't running in production yet. What follows is the design as implemented.

What the fan sees

A Miami Dolphins suite checkout: 'PAYMENT PLAN — $25,000.00 will be charged today', with a timeline of Today $25,000 / July 10 $25,000 / August 10 $500, total $50,500, and 'fully automatic, no interest, no fees' badges.

A $50,500 suite on a $25k-per-installment plan: $25,000 today, $25,000 next month, $500 to finish. "No interest, no fees, automatic payment on the same card."

Per program, a config says whether plans are enabled and whether they're required — required means the fan cannot pay in full (the Miami case: nothing over $25k can go through anyway, so full-pay isn't offered).

Two schedule flavors

Fixed — the plan lists literal dates (the V2 model): "installments on June 20, July 20, August 20." The wrinkle is daysPriorToCharge: a date within that window of "now" drops out, and the plan shrinks — a 4-installment plan quietly becomes 3, then 2, then stops being offered at all. (A flag can flip that behavior to "don't shrink — withdraw the plan instead.")

Dynamic — no dates, just a cadence: daily, weekly, biweekly, monthly, monthly-first, monthly-last (and as of this week, every-N-days). A cadence alone is dangerous — "if your bill is $1,000, I can take your installments to 1,000 weeks" — so at least one terminator must be set:

  • total installments ("five payments"), or
  • end date ("paid off before opening day"), or
  • installment amount ("$25,000 per charge" — the Miami terminator).

Either flavor can add a first-installment carve-out ("$X now, the rest split equally"). Plans can also be gated like everything else — pack, package, minimum events, minimum/maximum cart total.

How the later installments actually get charged

This is the clever (and Archtics-only) part. TM applies money to an order top-down, line item by line item: pay $200 against five $100 events and the first two are paid, the third is half-paid, the rest pending.

So at checkout, Attend charges installment #1 through the normal payment request, then creates an invoice on the fan's TM account for the remainder. Each later installment is charged against the invoice — same payment API, different parameters. TM's own books always know exactly which events are paid off.

The ledger on our side (tbl_payment_plan_installments) tracks each installment's due date, amount, status, and — when charging fails — a failure code, reason, and append-only history. A recurring job will pick up the dues daily. (That job is the not-yet-live piece.)

Why not just schedule N card charges? Same answer as the Host checkout: "no bank will allow 10 payments back to back." The invoice makes the remainder one well-defined debt on the vendor's books instead of a pile of future card transactions.

Recap

  • Payment plans exist because Miami can't process >$25k; per-program config = enabled + required (required ⇒ full-pay never offered).
  • Fixed = literal dates that shrink as they pass; dynamic = cadence + a terminator (count, end date, or per-installment amount); optional first-installment carve-out; fully filterable like pricing rules.
  • Installment #1 is charged at checkout; the remainder becomes a TM invoice, charged installment-by-installment — TM applies money to order line items top-down.
  • Not yet live: the charging code is still in testing; the recurring job isn't running yet.

Back to contents