Skip to content

Payment Terms Structure - When & How Money Moves

Core Concept

A payment_term describes the timing and method for paying out a single financial obligation (from any clause type—financial, benefit, etc.). It answers:

  • When is the money due?
  • How is it paid (ACH, check, wire, etc.)?
  • What's the payment structure (lump sum, installments, recurring)?

The payment_term does NOT answer "why is this money owed?" That's the clause's job.


Payment_Terms Array Structure

Each financial_clause can have one or more payment_terms entries. The amount must sum up to the amount of the financial_clause (if the clause amount is fixed) or be defined logically to cover the total obligation.

json
{
  "financial_clause_id": "clause_guarantee_vs_nbor",
  "name": "Guarantee vs NBOR",
  "amount": 25000,
  
  "payment_terms": [
    {
      "payment_term_id": "pt_advance_001",
      "payment_term_name": "50% Advance",
      "status": "scheduled",
      "amount": { "type": "percentage", "value": 50 },
      "due_date": { "type": "absolute", "value": "2025-11-15" }
    },
    {
      "payment_term_id": "pt_balance_001",
      "payment_term_name": "Balance",
      "status": "pending",
      "amount": { "type": "percentage", "value": 50 },
      "due_date": { "type": "relative", "offset_days": 0, "trigger": "SHOW_SETTLED.status == 'C'" }
    }
  ]
}

Payment_Terms Schema Definition

1. Payment Term Object

FieldTypeDescription
payment_term_idstringUnique identifier (e.g., pt_adv_001)
payment_term_namestringHuman-readable name
statusstringCurrent state: pending, scheduled, ready_to_pay, paid, cancelled
payment_typestringlump_sum, installment, recurring, holdback, advance
amountobjectDefinition of how much to pay (see below)
triggerstring(Optional) Condition for this term to become active
due_dateobjectDefinition of when payment is due (see below)
payment_methodstringach, check, wire, cash, other
payment_destination_input_refstringLoose reference to an external ID or Input key defining where money goes (e.g., PAYMENT_PROFILE_INPUT)
special_conditionsobjectArbitrary key-value pairs for tax, FX, etc.

2. Amount Object

json
// Fixed Amount
{
  "type": "fixed",
  "value": 12500
}

// Percentage of Total Clause Amount
{
  "type": "percentage",
  "value": 50  // 50%
}

// Calculated Amount
{
  "type": "calculated",
  "calculation": "clause.amount - 5000"
}

3. Due Date Object

json
// Absolute Date
{
  "type": "absolute",
  "value": "2025-12-15"
}

// relative
{
  "type": "relative",
  "trigger": "CONTRACT_SIGNED_STATE.value == true", 
  "value": "2025-12-15"
  "calculation": "CONTRACT_SIGNED_STATE.value.date + 30 days",
  "offset_days": 30
}

// Rule-Based (Recurring)
{
  "type": "rule_based",
  "frequency": "quarterly",          // daily, weekly, monthly, quarterly, annual
  "frequency_value": 1,              // every 1 quarter
  "start_date": "2025-12-31",
  "end_date": "2026-12-31",
  "payment_day_of_period": "last_day", // first_day, last_day, specific_day_X
  "statement_lag_days": 30           // Days to pay after period closes
}

4. Generated Schedule (for Rule-Based)

When due_date.type is rule_based, the engine generates a schedule.

json
"generated_schedule": [
  {
    "sequence": 1,
    "period_start": "2025-10-01",
    "period_end": "2025-12-31",
    "due_date": "2026-01-30",
    "amount_projected": 4166.66
  },
  {
    "sequence": 2,
    "period_start": "2026-01-01",
    "period_end": "2026-03-31",
    "due_date": "2026-04-30",
    "amount_projected": 4166.66
  }
]

Detailed JSON Example

json
{
  "payment_term_id": "pt_advance_001",
  "payment_term_name": "50% Advance",
  
  "payment_type": "lump_sum",
  "status": "paid",
  
  "amount": {
    "type": "fixed",
    "value": 12500
  },
  
  "trigger": "CONTRACT_SIGNED.value == true",
  
  "due_date": {
    "type": "absolute",
    "value": "2025-10-01"
  },
  
  "payment_method": "wire",
  "payment_destination_input_ref": "BANK_ACCOUNT_REF",
  
  "special_conditions": {
    "currency": "USD",
    "tax_withholding": 0
  },
  
  "metadata": {
    "notes": "Paid upon signature"
  }
}

Confidential. For internal use only.