---
updatedAt: 2026-08-11T14:25:22.000Z
---

Fetch the complete documentation index at: https://developers.pismo.io/pismo-docs/llms.txt. Use this file to discover all available pages before exploring further. Append .md to any documentation page URL to get its markdown version.

# Penalties for CD accounts

You can apply penalties to certificate of deposit (CD) accounts when specific withdrawal conditions occur, such as shortly after account opening, during the term, or after multiple withdrawals within a short period.

CD penalty configuration lets you model different withdrawal behaviors across the product lifecycle. You can apply these penalty types individually or combine them to enforce product rules more precisely. Penalties are configured at the deposit product level during its creation, and the Pismo platform evaluates them at withdrawal time.

You can also preview the penalties that would apply to a planned withdrawal, including a full withdrawal of the account balance before executing it. Refer to [Simulate penalties](#simulate-penalties).

When designing a penalty strategy, pay close attention to:

* the customer event that triggers the penalty
* whether the penalty should be percentage-based or fixed
* the dependency on the interest plan
* whether multiple penalties may apply together

A CD product can include one or more of these penalty types, refer to the [Penalty types](#penalty-types) section for more details. Depending on the product configuration, you can apply more than one penalty to the same withdrawal.

## Supported penalty models

CD account penalties use two main calculation models.

<Table>
  <thead>
    <tr>
      <th>
        Penalty model
      </th>

      <th>
        Description
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        Percentage-based
      </td>

      <td>
        Calculates the penalty by applying the equivalent of a configured number of interest days to the withdrawn amount. In a percentage‑based penalty, the Pismo platform calculates the value of X interest days on the withdrawn amount. Percentage‑based penalties require the following interest‑plan values from the product:

        * `fixed_interest_rate` or `benchmark_rate`
        * `accrual_basis`
      </td>
    </tr>

    <tr>
      <td>
        Fixed amount
      </td>

      <td>
        Calculates a penalty as the monetary value of forfeited interest days, typically based on the account balance or CD principal. Fixed-amount penalties calculate the monetary value of X forfeited interest days for the account balance.
      </td>
    </tr>
  </tbody>
</Table>

## Penalty types

Here is a summary table of all penalty types. For the relevant fee IDs and transaction flows, refer to [Create deposit product](https://developers.pismo.io/pismo-docs/reference/interest-bearing-v1-create-deposit-product).

| Penalty type                                                      | Model                            | Basis                                      | Main configuration                                                   |
| ----------------------------------------------------------------- | -------------------------------- | ------------------------------------------ | -------------------------------------------------------------------- |
| [Early withdrawal after opening](#early-withdwawal-after-opening) | Percentage-based                 | Withdrawn amount                           | `applicable_within_days`, `penalty_interest_days`                    |
| [Tiered interest forfeiture](#tiered-interest-forfeiture)         | Fixed amount                     | Days held tier                             | `min_days_held`, `max_days_held`, `forfeited_interest_days`          |
| [Subsequent withdrawal](#subsequent-withdrawal)                   | Percentage-based                 | Withdrawn amount                           | `window_behavior`, `applicable_within_days`, `penalty_interest_days` |
| [Grace period](#grace-period)                                     | Percentage-based                 | Withdrawn amount                           | `duration_days`, `penalty_interest_days`                             |
| [Withdrawal fee](#withdrawal-fee)                                 | Percentage-based or fixed amount | Withdrawn amount or fixed configured value | `type`, `value`                                                      |

### Early withdrawal after opening

This penalty applies to any withdrawal made within a configured number of days after account opening.

#### How it works

This is how early withdrawal after opening is calculated.

| Calculation factor | Description                                    |
| ------------------ | ---------------------------------------------- |
| Type               | Percentage-based                               |
| Basis              | Withdrawn amount                               |
| Equivalent to      | `penalty_interest_days` days of interest       |
| Applies within     | `applicable_within_days` after account opening |

#### Example

```json
"penalties": {
  "early_withdrawal_after_opening": {
    "applicable_within_days": 10,
    "penalty_interest_days": 7
  }
}
```

In this example, the Pismo platform applies a penalty equivalent to **seven days of simple interest** on the withdrawn amount for any withdrawal made within the first **ten days** after the deposit account opens.

### Tiered interest forfeiture

This penalty applies a fixed penalty amount based on how long the funds remained in the account before withdrawal.

#### How it works

| Calculation factor | Description                                                                  |
| ------------------ | ---------------------------------------------------------------------------- |
| Type               | Fixed amount                                                                 |
| Basis              | A holding‑period tier defined by `min_days_held` and `max_days_held`         |
| Equivalent to      | `forfeited_interest_days` days of interest, converted into a monetary amount |

#### Rules

* You can define multiple tiers.
* Tiers must not overlap.
* The last tier’s `max_days_held` must **not exceed** the product’s `max_term`.

#### Example

```json
"tiered_interest_forfeiture": [
  {
    "min_days_held": 1,
    "max_days_held": 90,
    "forfeited_interest_days": 30
  },
  {
    "min_days_held": 91,
    "max_days_held": 180,
    "forfeited_interest_days": 90
  }
]
```

In this example:

* A withdrawal made between day 1 and day 90 forfeits 30 days of interest.
* A withdrawal made between day 91 and day 180 forfeits 90 days of interest.

The Pismo platform converts the forfeited interest days into a fixed monetary penalty amount. The penalty amount remains fixed and does not vary based on the amount withdrawn.

### Subsequent withdrawal

This penalty applies when a customer makes subsequent withdrawals within a configured time window.

#### How it works

| Calculation factor | Description                              |
| ------------------ | ---------------------------------------- |
| Type               | Percentage-based                         |
| Basis              | Withdrawn amount                         |
| Equivalent to      | `penalty_interest_days` days of interest |
| Window             | `applicable_within_days`                 |

#### Window strategies

Window strategies define how the time window is tracked when evaluating whether a penalty applies. The window sets the period in which withdrawals are reviewed, and the strategy determines how that period behaves after each withdrawal.

This penalty supports two window strategies:

* `ROLLING`: the window resets after each withdrawal
* `FIXED`: the window starts with the first withdrawal and does not reset

#### Example

```json
"subsequent_withdrawals": {
  "window_behavior": "ROLLING",
  "applicable_within_days": 6,
  "penalty_interest_days": 7
}
```

In this example, the Pismo platform applies a penalty equivalent to seven days of simple interest to any subsequent withdrawal made within a six-day rolling window. Each qualifying withdrawal resets the window and starts a new six-day period.

### Grace period

This penalty applies to withdrawals made during the grace period.

During the grace period, customers can make multiple cash‑out transactions without penalty as long as the total amount withdrawn does not exceed the matured CD balance.

When cumulative withdrawals go beyond the matured CD balance, only the excess amount is classified as an early withdrawal and is subject to the grace‑period penalty defined at the deposit product level.

If a withdrawal reduces the remaining balance below the previous principal amount, the Pismo platform applies the grace‑period penalty.

This behavior is deterministic and evaluated per transaction:

* The penalty applies only to the withdrawal that causes the cumulative amount to exceed the matured balance.
* The penalty is calculated solely on the excess amount and is never applied retroactively.

#### How it works

| Calculation factor | Description                              |
| ------------------ | ---------------------------------------- |
| Type               | Percentage-based                         |
| Basis              | Withdrawn amount                         |
| Equivalent to      | `penalty_interest_days` days of interest |
| Duration           | `duration_days`                          |

#### Example

```json
"grace_period": {
  "duration_days": 10,
  "penalty_interest_days": 30
}
```

In this example, a withdrawal made during the ten-day grace period triggers a penalty only if it causes the remaining balance to fall below the previous CD principal. If that happens, the Pismo platform applies a penalty equivalent to 30 days of interest.

### Withdrawal fee

This penalty is a generic withdrawal fee that you can configure as either a percentage-based fee or a fixed amount.

#### How it works

| Calculation factor | Description                                                                     |
| ------------------ | ------------------------------------------------------------------------------- |
| Type               | Percentage-based or fixed amount                                                |
| Values             | The product defines these directly in the `withdrawal_fee` configuration object |

#### Example

```json
"withdrawal_fee": {
  "type": "PERCENTAGE",
  "value": 1.5
}
```

In this example, a 1.5% fee is applied to the withdrawn amount because the penalty is configured using the `PERCENTAGE` type.

## Penalty calculation

Penalty calculation depends on the penalty type.

### Percentage-based penalties

This model applies to:

* Early withdrawal after opening
* Subsequent withdrawal
* Grace period
* Withdrawal fee when configured as a percentage

The Pismo platform derives the effective penalty percentage from the product’s interest settings.

#### Example parameters

The following formula is used to calculate a percentage-based penalty.

| Calculation factor      | Value       |
| ----------------------- | ----------- |
| `fixed_interest_rate`   | 3% annually |
| `accrual_basis`         | 365         |
| `penalty_interest_days` | 7           |
| `withdrawal_amount`     | 10,000      |

#### Step 1: Compute the daily rate

```text
daily_rate = fixed_interest_rate / accrual_basis
daily_rate = 0.03 / 365 ≈ 0.0000822
```

#### Step 2: Compute the penalty factor for X interest days

```text
penalty_factor = daily_rate * penalty_interest_days
penalty_factor = 0.0000822 * 7 ≈ 0.0005754
```

#### Step 3: Convert the factor into a percentage

```text
penalty_percent = penalty_factor * 100
penalty_percent ≈ 0.05754 (%)
```

#### Step 4: Apply the percentage to the withdrawal amount

```text
penalty_amount = withdrawal_amount * (penalty_percent / 100)
penalty_amount = 10,000 * 0.0005754 ≈ 5.75
```

#### Result

The penalty amount is 5.75.

### Fixed-amount penalties

This model applies to:

* Tiered interest forfeiture
* Withdrawal fee when configured as a fixed amount

The Pismo platform computes a monetary penalty based on forfeited interest days.

#### Example parameters

| Calculation factor        | Value       |
| ------------------------- | ----------- |
| `interest_rate`           | 3% annually |
| `accrual_basis`           | 365         |
| `forfeited_interest_days` | 30          |
| CD principal amount       | 500         |

#### Formula

```text
penalty = (((1 + (interest_rate * n / accrual_basis)) * CD_amount) - CD_amount)
```

#### Applied example

Note that the subtraction of 500 removes the original principal amount, ensuring the formula returns only the interest portion, which represents the penalty.

```text
penalty = (((1 + (0.03 * 30 / 365)) * 500) - 500)
penalty ≈ 1.23
```

#### Result

The fixed penalty amount is 1.23. The Pismo platform then uses this monetary value as the fixed amount for the fee model.

## Simulate penalties

Before performing an actual withdrawal, you can preview the penalties that would apply by using the [Simulate penalty](https://developers.pismo.io/pismo-docs/reference/interest-bearing-v1-simulate-penalty) endpoint:

The simulation is read-only and does not modify any data. It evaluates all penalty rules configured for the account's product, including:

* Early withdrawal after opening
* Grace period
* Tiered interest forfeiture
* Withdrawal fee
* Subsequent withdrawal

For details about penalty types, refer to the `penalties` object in [Create deposit product]().

### Request parameters

| Field               | Required | Description                                                                                                                                                          |
| ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `withdrawal_date`   | Yes      | Simulated withdrawal date, in ISO 8601 format. For example, `2026-12-15T00:00:00Z`.                                                                                  |
| `withdrawal_amount` | No       | The amount the customer intends to withdraw. When passed, it must not exceed the current book balance. When omitted, the Pismo platform simulates a full withdrawal. |

### Simulate a full withdrawal

If you omit `withdrawal_amount`, the Pismo platform fetches the account's current book balance using [Get transaction banking account balance](https://developers.pismo.io/pismo-docs/reference/get-account-balances) and calculates the penalty on that value. This lets you simulate a full withdrawal without having to look up the balance first.

The `withdrawal_amount` returned in the response shows the value used in the simulation, which equals the book balance when the field was omitted in the request.

**Request example for a full-withdrawal simulation:**

```shell
curl --request POST \

   --url https://sandbox.pismolabs.io/savings-products/v1/deposits/accounts/accountId/penalty-simulation \

   --header 'accept: application/json' \

   --header 'content-type: application/json' \

   --data '

{

 "withdrawal_date": "2026-12-15T00:00:00Z" 

}
```

**Response example:**

```json
{
  "withdrawal_amount": 40667.17,
  "withdrawal_date": "2026-12-15T00:00:00Z",
  "penalty_rule_applied": [
    {
      "type": "fixed",
      "value": 50.00,
      "description": "Withdrawal fee"
    },
    {
      "type": "percentage",
      "value": 181.75,
      "description": "Early withdrawal after opening penalty"
    }
  ],
  "penalty_amount": 231.75,
  "penalty_breakdown": {
    "fixed_amount": 50.00,
    "percentage_amount": 181.75
  },
  "currency": "BRL",
  "gross_amount": 41329.34,
  "interest_earned_amount": 667.17,
  "net_amount": 41097.59,
  "simulation_timestamp": "2026-06-19T19:22:55Z"
}
```

In this example, you can see the results of a withdrawal simulation, including any applicable penalty rules, penalty amounts, and calculated withdrawal values.

**Response fields**

| Field                    | Description                                                                                                                                                 |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `withdrawal_amount`      | The withdrawal amount used in the simulation. Equals the book balance when omitted in the request.                                                          |
| `withdrawal_date`        | The withdrawal date used in the simulation, in ISO 8601 format.                                                                                             |
| `penalty_rule_applied`   | List of penalty rules that apply to the withdrawal. Each item includes type (percentage or fixed), value, and description. Omitted when no penalties apply. |
| `penalty_amount`         | Total penalty amount, combining all relevant penalty rules.                                                                                                 |
| `penalty_breakdown`      | Total penalty split by calculation type, in `fixed_amount` and `percentage_amount`. Omitted when no penalty applies.                                        |
| `currency`               | Currency in ISO 4217 alphabetic format. Omitted when no penalty applies.                                                                                    |
| `gross_amount`           | Gross amount of the deposit account: total balance without interest plus total interest earned. Always present; `0` when no total record exists.            |
| `interest_earned_amount` | Total interest earned (paid or capitalized) on the account. Always present; `0` when no total record exists.                                                |
| `net_amount`             | Net amount after deducting penalties: `gross_amount - penalty_amount`.                                                                                      |
| `simulation_timestamp`   | Date and time of the simulation, in ISO 8601 format.                                                                                                        |

### Simulation rules and errors

* A `withdrawal_date` inside the cool-off period results in no penalties.
* `withdrawal_date` must not be in the past.
* A withdrawal\_amount of zero or a negative value is rejected.
* A `withdrawal_amount` greater than the current book balance is rejected, and the error details return the available balance.
* Simulation is available only for deposit accounts.

## Key rules and considerations

* Penalties are evaluated at withdrawal time.
* A single withdrawal can trigger multiple penalties if the product configuration allows it.
* Percentage-based penalties depend on the product’s interest plan to derive the effective rate.
* To preview penalties for a planned withdrawal, including a full withdrawal, use the [Simulate penalty](https://developers.pismo.io/pismo-docs/reference/interest-bearing-v1-simulate-penalty) endpoint. Refer to [Simulate penalties](#simulate-penalties) for more information.
* Tiered interest forfeiture tiers must be:
  * non-overlapping
  * logically ordered
  * bounded by the product’s maximum term

## Example penalties object

This example shows how a CD product can define multiple penalties.

```json
"penalties": {
  "early_withdrawal_after_opening": {
    "applicable_within_days": 10,
    "penalty_interest_days": 7
  },
  "tiered_interest_forfeiture": [
    {
      "min_days_held": 1,
      "max_days_held": 90,
      "forfeited_interest_days": 30
    },
    {
      "min_days_held": 91,
      "max_days_held": 180,
      "forfeited_interest_days": 90
    }
  ],
  "subsequent_withdrawals": {
    "window_behavior": "ROLLING",
    "applicable_within_days": 6,
    "penalty_interest_days": 7
  },
  "grace_period": {
    "duration_days": 10,
    "penalty_interest_days": 30
  },
  "withdrawal_fee": {
    "type": "PERCENTAGE",
    "value": 1.5
  }
```