Overview
Distributing a dividend pool calculates individual member allocations based on your organization’s distribution method and creates a journal entry that debits retained earnings and credits member savings accounts. This action transitions the pool from draft status to distributed status and is permanent and irreversible.What happens: Distribution creates a single DIVIDEND_DISTRIBUTION journal entry with one debit to RETAINED_EARNINGS and multiple credits to member SAVINGS accounts. The pool’s
journalEntryId is set, permanently marking it as distributed.Before You Begin
Prerequisites:
- You have
dividends:writepermission - Dividend pool exists in draft status (
journalEntryId = null) - Pool period end is on or before the last closed accounting period end
- At least one accounting period has been closed
- Sufficient retained earnings balance to cover the pool amount
- At least one active member (isActive = true) exists
Step-by-Step Instructions
Step 1: Navigate to Pool
Step 2: Review Calculated Allocations
Before distributing, verify the automatically calculated member allocations: Check individual amounts:- Review each member’s calculated dividend amount
- Verify calculations match your expectations based on distribution method
- Ensure no members are unexpectedly excluded
- Sum of all member allocations should equal pool total amount
- Agatabo handles rounding automatically to ensure exact match
- Equal: All active members receive equal shares (or time-weighted if enabled)
- By contribution: Members with higher savings contributions receive proportionally larger dividends
- Time-weighting (if enabled): Allocations adjusted based on participation days during period
Distribution method is organization-level: The method used (equal vs. by_contribution) and time-weighting setting come from organization dividend settings. All pools use the same distribution rules.
Step 3: Verify Prerequisites
Before distributing, confirm: Accounting period closure:- Pool period end must be on or before last closed accounting period end
- At least one accounting period must be closed
- Distribution date will default to pool.periodEnd + 1 day (or you can specify a custom date)
- Retained earnings balance ≥ pool amount
- Distribution will debit retained earnings by the full pool amount
- At least one active member (isActive = true) exists
- Only active members receive dividends
- Inactive members are automatically excluded from allocations
Step 4: Distribute the Pool
Set distribution date (optional)
Default: pool.periodEnd + 1 day
Custom: Choose specific date (must be after last closed period end)
Custom: Choose specific date (must be after last closed period end)
Step 5: Verify Distribution
After distribution completes:Review journal entry
Navigate to General Ledger → Journal Entries
Find DIVIDEND_DISTRIBUTION entry
Verify one debit to RETAINED_EARNINGS and multiple credits to member SAVINGS
Find DIVIDEND_DISTRIBUTION entry
Verify one debit to RETAINED_EARNINGS and multiple credits to member SAVINGS
Spot-check member balances
Navigate to a few member profiles
Verify SAVINGS account balance increased by dividend amount
Verify SAVINGS account balance increased by dividend amount
What Happens During Distribution
When you distribute a dividend pool, Agatabo automatically:-
Validates accounting period constraints
- Checks at least one accounting period is closed
- Validates pool.periodEnd ≤ last closed accounting period end
- Validates distribution date > last closed accounting period end
-
Retrieves organization settings
- Loads distribution method (equal or by_contribution)
- Loads time-weighting setting (enabled or disabled)
-
Identifies eligible members
- Queries all organization users with
isActive = true - Excludes inactive members from allocations
- Requires at least one active member
- Queries all organization users with
-
Calculates individual allocations
- Equal method: Divides pool amount equally (or by participation days if time-weighted)
- By contribution method: Allocates proportionally based on savings balance (or time-weighted contributions)
- Handles rounding to ensure exact total match
- Filters out zero-amount allocations
-
Creates single journal entry
- Kind:
DIVIDEND_DISTRIBUTION - One DEBIT line: RETAINED_EARNINGS (pool amount)
- Multiple CREDIT lines: SAVINGS accounts (one per member with non-zero allocation)
- Transaction date: specified date or default (pool.periodEnd + 1 day)
- Idempotency key: prevents duplicate distribution
- Kind:
-
Updates pool status
- Sets
journalEntryIdto the created journal entry ID - Pool status changes from “draft” to “distributed”
- Pool becomes locked (cannot be edited or deleted)
- Sets
-
Logs audit trail
- Records who distributed the pool (actorOrganizationUserId)
- Timestamp of distribution
- All journal entry details
Critical: Distribution creates ONE journal entry with multiple lines, not separate journal entries for each member. This ensures the transaction is atomic and balanced.
Distribution Methods
Equal Distribution
All active members receive the same amount (or time-weighted equal shares). Without time-weighting:By Contribution Distribution
Members receive dividends proportional to their savings contributions during the period. Without time-weighting:Distribution Date
The distribution date determines when the journal entry is recorded (transaction date). Default behavior:- If no distribution date specified:
pool.periodEnd + 1 day - Example: Pool period Jan 1 - Mar 31 → default distribution date is April 1
- You can specify any date after the last closed accounting period end
- Cannot be on or before the last closed period end
- Typically set to the actual day you’re distributing
Eligibility
Only active members receive dividends. Eligibility criteria:organizationUser.isActive = true(only requirement)- No minimum savings balance required
- No minimum membership duration required
- Automatically excluded from allocations
- Do not appear in dividend distribution
- Cannot receive dividends even if they have savings
- If an active member’s calculated allocation is zero (e.g., no savings in by_contribution method), they are excluded from the journal entry
- Only members with non-zero allocations receive credits
Common Scenarios
Quarterly Dividend Distribution
Standard quarterly workflow:Create draft pool
Period: 2026-01-01 to 2026-03-31
Amount: Based on profit and dividend policy
Pool starts in draft status
Amount: Based on profit and dividend policy
Pool starts in draft status
Annual Dividend Distribution
Year-end distribution:Review at member meeting
Present pool to members at Annual General Meeting (optional governance)
Show total amount and allocation method
Show total amount and allocation method
Handling Insufficient Retained Earnings
If retained earnings balance is less than pool amount:Validation and Constraints
Accounting Period Constraints
Rules enforced at distribution:- ✅ At least one accounting period must be closed
- ✅ pool.periodEnd ≤ last closed accounting period end
- ✅ distributionDate > last closed accounting period end
Balance Constraints
Retained earnings check:- By default, retained earnings must be ≥ pool amount
- If insufficient, distribution fails with error
- Can override with
skipNegativeBalanceCheck: true(use with caution)
Member Eligibility Constraints
Rules:- ✅ At least one active member (isActive = true) must exist
- ✅ Only active members included in allocations
- ✅ Inactive members automatically excluded
Allocation Constraints
Rules:- ✅ Sum of member allocations must exactly equal pool amount
- ✅ Zero-amount allocations are filtered out
- ✅ At least one non-zero allocation must exist
Best Practices
Dividend distribution best practices:Before Distributing:
- Verify accounting period for pool period is closed
- Review all calculated member allocations carefully
- Check retained earnings balance is sufficient
- Spot-check a few member calculations manually
- Document any governance approvals obtained (optional, not enforced by system)
- Distribute within 1-2 weeks after pool creation
- Don’t leave pools in draft status for extended periods
- Consider distributing all quarterly pools on same day each quarter
- Notify members after distribution
- Explain distribution method used (equal vs. by_contribution)
- Provide information on how to view dividend in their account
- Inform members they can withdraw or leave funds to compound
- Ensure sufficient retained earnings before creating pool
- Don’t distribute 100% of profit (keep buffer for operations)
- Allocate to reserves before creating dividend pools
- Consider upcoming expenses before large distributions
- While system has no approval workflow, establish internal governance
- Document dividend policy in bylaws
- Get appropriate approvals per your organization’s rules
- Keep records of approval decisions (meeting minutes, votes)
- Double-check pool amount before distributing
- Verify correct period dates
- Review distribution method setting before creating pools
- Test with small pool first if new to dividend feature
Troubleshooting
”No accounting period has been closed yet”
Cause: Cannot distribute dividends until at least one accounting period is closed Solution:
Learn about accounting periods →
“Period end must be on or before last closed period”
Cause: Pool period end is after the last closed accounting period end Example:”Distribution date must be after last closed period end”
Cause: Custom distribution date is on or before the last closed accounting period end Example:- Change distribution date to Apr 1, 2026 or later
- Or leave blank to use default (pool.periodEnd + 1 day)
“Insufficient retained earnings”
Cause: Retained earnings balance is less than pool amount Possible reasons:- Another dividend distributed after pool creation
- Large expenses recorded reducing retained earnings
- Funds allocated to reserves
- Manual journal entries adjusting retained earnings
”No active organizationUsers eligible for dividend distribution”
Cause: No members haveisActive = true
Solution:
”Computed allocations are zero for all organizationUsers”
Cause: All calculated member allocations are zero (typically in by_contribution method when no members have savings) Solution:- Verify members have savings balances (for by_contribution method)
- Check distribution method setting (may need to use equal instead)
- Ensure period dates are correct
- Review member participation during period
Cannot find pool after distribution
Cause: Default view may filter to only show draft pools Solution:- Change status filter to “All” or “Distributed”
- Search by pool period label
- Check Dividend Reporting section for historical pools
Member disputes dividend amount
If a member questions their allocation:Explain calculation
Equal: Total ÷ Number of active members
By contribution: (Member savings ÷ Total savings) × Pool amount
Time-weighted: Adjusted by participation days
By contribution: (Member savings ÷ Total savings) × Pool amount
Time-weighted: Adjusted by participation days
Verify member data
Check member’s savings balance during period
Verify member was active (isActive = true) at distribution time
Verify member was active (isActive = true) at distribution time
Correcting Errors After Distribution
Option 1: Manual Journal Entry
For small corrections affecting one or two members:Create correction entry
Kind: ADJUSTMENT
Title: “Dividend Correction - Q1 2026”
Lines:
Title: “Dividend Correction - Q1 2026”
Lines:
- DEBIT: Member A SAVINGS (reduce overpayment)
- CREDIT: Member B SAVINGS (correct underpayment)
Option 2: Corrective Pool
For larger corrections or errors affecting many members:Create new dividend pool
Period Label: “Dividend Correction - Q1 2026”
Period: Same as original pool
Amount: Net correction amount
Period: Same as original pool
Amount: Net correction amount
Distribute correction pool
This will create credits to underpaid members
For overpaid members, create separate debit journal entries
For overpaid members, create separate debit journal entries
Option 3: Adjust Next Distribution
For minor discrepancies:- Note correction needed for next period
- Adjust next dividend pool to include +/- correction amounts
- Document in next pool description
Permissions Required
| Action | Permission | Scope |
|---|---|---|
| View pools | dividends:read | ANY |
| Distribute pool | dividends:write | ANY |
| View journal entries | general-ledger:read | ANY |
Typical roles: Administrators and Accountants have
dividends:write. Regular members typically have dividends:read (view only) or no access.Technical Details
API Endpoint
Journal Entry Structure
Single journal entry created:Status Change
Before distribution:Idempotency
Thex-idempotency-key header prevents duplicate distributions:
- If same key used twice, second request returns cached result
- No duplicate journal entries created
- Safe to retry failed requests with same key
Related Topics
Dividends Overview
Understand dividend pools and distribution methods
Creating Dividend Pools
Set up new dividend pools
Dividend Reporting
View distribution history and member allocations
Accounting Periods
Understand period closure requirements
Manual Journal Entries
Create corrections after distribution
Retained Earnings
Understand retained earnings accounting