Skip to content

Payment Schedule (Crowdfunding)

Access prerequisites

  • Permission (module): manageCrowdfunding
  • License/Feature: CROWDFUNDING enabled in the tenant license (Vault).
  • Menu container: GENERAL → Products group → Crowdfunding (action on the offering row)

What it is / when to use

The Payment Schedule allows you to plan the expected payments of a crowdfunding offering (interest, amortizations, dividends) and, at the right time, materialize them as scheduled distributions in the FinanceManagementService (FMS). It is the bridge between what was "promised to the investor during the fundraising" and the "distribution automatically executed on the date".

Use it when the offering has already been funded and has a token generated: each line in the schedule becomes a distribution_request with scheduled_at, and an FMS scheduler executes it when the date arrives — paying whoever holds the token on that date (not at the time of materialization).

Prerequisites

  • Permission: manageCrowdfunding (CPM static enum + dynamic module in the DB).
  • License/Feature: CROWDFUNDING enabled.
  • Dependencies: the offering must have an assetId (token/NFT already generated) to materialize. Without it, lines can be added but not materialized.

Step by step

  1. In the Crowdfunding listing, click the Payment schedule icon for the offering.
  2. Use Add line for each expected payment.
  3. Fill in the expected date, type (ABSOLUTE/PERCENTAGE), amount and, if ABSOLUTE, the currency/token.
  4. Save each line individually (Save line).
  5. When you want to execute, use Materialize — confirm in the dialog. Pending lines become scheduled distributions in the FMS.

Fields (per line)

FieldWhat it isRequired?System/backend effect
Order (order_index)Position of the line in the sequenceYes (automatic)Calculated as max(order_index)+1; defines the execution order.
Expected date (expected_date)When the payment should occurYesBecomes scheduled_at of the distribution_request. The FMS scheduler (*/5 * * * *) looks for SCHEDULED requests with scheduled_at <= NOW() and executes them.
Type (type)ABSOLUTE (fixed amount) or PERCENTAGE (% of the total)YesDefault PERCENTAGE. Determines how the FMS calculates the total to distribute.
Amount (amount)Amount (ABSOLUTE) or percentage (PERCENTAGE)YesMust be > 0. For PERCENTAGE, ≤ 100. Does not need to sum to 100% across lines — consistency is the operator's responsibility.
Currency/token (currency)Token to distributeConditionalRequired only for ABSOLUTE. For PERCENTAGE, the token is specified at materialization.
Description (description)Free textNoIdentifies the payment (e.g., "1st interest installment").

Actions and modals

  • Add / Save line: creates/updates the line. An invalid line (no date, amount ≤ 0, percentage > 100, ABSOLUTE without currency) is rejected with a message.
  • Remove line: deletes the line. Already materialized lines cannot be removed.
  • Materialize: opens a confirmation (window.confirm). If there is a pending PERCENTAGE line, it is required to specify the token to distribute (percentageTokenToDistribute). Upon confirmation, the CrowdfundingService calls the FMS via fin-lib, creating the scheduled distributions. The result reports how many were materialized and how many were ignored (already materialized).

Business rules / considerations

Attention

  • PERCENTAGE calculates the total at execution time: total_to_distribute = supply × %, scanning the holders on the date. ABSOLUTE uses the fixed amount + specified token.
  • Holders are calculated at execution, not at materialization — whoever holds the token on the payment date receives it. This preserves secondary transfers between the fundraising and the payment.
  • Materialization is only possible if the offering has an assetId and all pending lines are saved (with an id).

Irreversible

  • Materialize creates scheduled distributions in the FMS. Each materialized line becomes read-only individually; the table as a whole remains editable (new lines can be added afterward), but an already-materialized line cannot be undone.
  • Idempotency: the distribution_request is idempotent by the key (source = 'CROWDFUNDING_SCHEDULE', source_reference_id = schedule_entry_id). Re-executions are safe. When executing the distribution via FinLib, the errorCode E00021 "already processed" is treated as SUCCESS, not an error.
  • Financial values: handled as BigNumber — no rounding.

Examples

Scenario 1 — Three interest installments as percentage
  1. Add 3 PERCENTAGE lines: 06/30 → 2%, 09/30 → 2%, 12/30 → 2% (descriptions "Interest Q2/Q3/Q4").
  2. Save each line.
  3. Click Materialize, specify the payment token (e.g.: tBRL) and confirm.
  4. The FMS creates 3 SCHEDULED distributions. On each date, the scheduler calculates supply × 2% and pays the current holders.
Scenario 2 — Final amortization as absolute amount
  1. Add 1 ABSOLUTE line with date 12/31, amount R$ 500,000 and currency tBRL.
  2. Save and materialize.
  3. On the date, the FMS distributes exactly R$ 500,000 in tBRL, prorated among holders.
Scenario 3 — Adding an extra payment after materializing
  1. An offering already has materialized lines (read-only).
  2. Add a new line (the table remains editable), save it and materialize again.
  3. The old lines appear as ignored (idempotency); only the new one is materialized.