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.journalEntryId is set, permanently marking it as distributed.Before You Begin
- 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
Open Dividends section
Find draft pool
Click on 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
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
Click Distribute
Set distribution date (optional)
Custom: Choose specific date (must be after last closed period end)
Review warning
Confirm distribution
Step 5: Verify Distribution
After distribution completes:Check pool status
Review journal entry
Find DIVIDEND_DISTRIBUTION entry
Verify one debit to RETAINED_EARNINGS and multiple credits to member SAVINGS
Spot-check member balances
Verify SAVINGS account balance increased by dividend amount
Check retained earnings
Verify balance decreased by pool 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
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:Close quarter accounting period
Create draft pool
Amount: Based on profit and dividend policy
Pool starts in draft status
Review allocations
Distribute
Default distribution date: 2026-04-01
Confirm permanent action
Verify
Check RETAINED_EARNINGS decreased
Annual Dividend Distribution
Year-end distribution:Close full year
Create draft pool
Amount: Annual profit distribution amount
Review at member meeting
Show total amount and allocation method
Distribute
Distribution date can be set to meeting date
Communicate to members
Handling Insufficient Retained Earnings
If retained earnings balance is less than pool amount:Check retained earnings
View current balance
Identify shortfall
Choose resolution
Option 2: Release funds from reserves to retained earnings first
Option 3: Wait for more profit to accumulate
Option 4: Use skipNegativeBalanceCheck parameter (not recommended)
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
- 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:Navigate to Accounting Periods
Close the period
Retry distribution
“Period end must be on or before last closed period”
Cause: Pool period end is after the last closed accounting period end Example:Close required accounting period
Or delete and recreate pool
Retry distribution
”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
Check current balance
Determine shortfall
Choose resolution
Option 2: Release funds from reserves to retained earnings
Option 3: Wait for more profit to accumulate
Option 4: Record income or adjust previous entries
”No active organizationUsers eligible for dividend distribution”
Cause: No members haveisActive = true
Solution:
Navigate to Organization Users
Check active status
Activate members if needed
Retry distribution
”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:Review distribution method
Explain calculation
By contribution: (Member savings ÷ Total savings) × Pool amount
Time-weighted: Adjusted by participation days
Verify member data
Verify member was active (isActive = true) at distribution time
If error confirmed
Create corrective adjustment (manual journal entry or new small pool)
Correcting Errors After Distribution
Option 1: Manual Journal Entry
For small corrections affecting one or two members:Navigate to Journal Entries
Create correction entry
Title: “Dividend Correction - Q1 2026”
Lines:
- DEBIT: Member A SAVINGS (reduce overpayment)
- CREDIT: Member B SAVINGS (correct underpayment)
Document reason
Option 2: Corrective Pool
For larger corrections or errors affecting many members:Create new dividend pool
Period: Same as original pool
Amount: Net correction amount
Distribute correction pool
For overpaid members, create separate debit journal entries
Document thoroughly
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
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