Payment Schedule (Crowdfunding)
Access prerequisites
- Permission (module):
manageCrowdfunding - License/Feature:
CROWDFUNDINGenabled 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:
CROWDFUNDINGenabled. - 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
- In the Crowdfunding listing, click the Payment schedule icon for the offering.
- Use Add line for each expected payment.
- Fill in the expected date, type (ABSOLUTE/PERCENTAGE), amount and, if ABSOLUTE, the currency/token.
- Save each line individually (Save line).
- When you want to execute, use Materialize — confirm in the dialog. Pending lines become scheduled distributions in the FMS.
Fields (per line)
| Field | What it is | Required? | System/backend effect |
|---|---|---|---|
Order (order_index) | Position of the line in the sequence | Yes (automatic) | Calculated as max(order_index)+1; defines the execution order. |
Expected date (expected_date) | When the payment should occur | Yes | Becomes 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) | Yes | Default PERCENTAGE. Determines how the FMS calculates the total to distribute. |
Amount (amount) | Amount (ABSOLUTE) or percentage (PERCENTAGE) | Yes | Must 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 distribute | Conditional | Required only for ABSOLUTE. For PERCENTAGE, the token is specified at materialization. |
Description (description) | Free text | No | Identifies 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
assetIdand all pending lines are saved (with anid).
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_requestis idempotent by the key(source = 'CROWDFUNDING_SCHEDULE', source_reference_id = schedule_entry_id). Re-executions are safe. When executing the distribution via FinLib, the errorCodeE00021"already processed" is treated as SUCCESS, not an error. - Financial values: handled as BigNumber — no rounding.
Examples
Scenario 1 — Three interest installments as percentage
- Add 3 PERCENTAGE lines: 06/30 → 2%, 09/30 → 2%, 12/30 → 2% (descriptions "Interest Q2/Q3/Q4").
- Save each line.
- Click Materialize, specify the payment token (e.g.: tBRL) and confirm.
- The FMS creates 3
SCHEDULEDdistributions. On each date, the scheduler calculatessupply × 2%and pays the current holders.
Scenario 2 — Final amortization as absolute amount
- Add 1 ABSOLUTE line with date 12/31, amount R$ 500,000 and currency tBRL.
- Save and materialize.
- On the date, the FMS distributes exactly R$ 500,000 in tBRL, prorated among holders.
Scenario 3 — Adding an extra payment after materializing
- An offering already has materialized lines (read-only).
- Add a new line (the table remains editable), save it and materialize again.
- The old lines appear as ignored (idempotency); only the new one is materialized.