Skip to main content

Building a Payout Ledger with Double-Entry Bookkeeping for Platform Financial Records

By Gruv Editorial Team
Contributor
Published on
•
24 min read
Building a Payout Ledger with Double-Entry Bookkeeping for Platform Financial Records - hero image

Quick Answer

Define the payout subledger’s account model and its mapping to the general ledger. Map statuses to economic events, including explicit no-journal transitions. Post each financial event once with balanced entries, preserve its external evidence, and reconcile provider records, journals and derived balances at a common cutoff.

What a Double-Entry Payout Ledger Needs to Do#

A usable payout ledger should be treated as an accounting system, not just a record of money moving out. This guide focuses on the mechanics your finance and ops teams need every day: record transactions in a journal, post them to the general ledger, and confirm that debits and credits stay in balance.

Those mechanics are the control surface. A journal records transactions. Posting summarizes journal entries into general ledger accounts. If those layers are not explicit, it is harder to resolve differences in status views because the accounting trail is unclear. What business transaction occurred? What evidence supports it? Which Debit and Credit entries should exist because of it?

That thread runs through the rest of the guide. For each payout flow you support, define the journal entries first and the balance views second. Dashboards and wallet-style summaries are useful, but they should not replace the source accounting record. If a movement cannot be traced to a business transaction and supporting evidence, treat it as a design failure before you treat it as a reporting problem.

Before you start. You will get more value from the later steps if you settle a few basics up front:

  • Define the general ledger as the core accounting record, not a derived balance table.
  • Decide which account categories you will use. One common model uses five types: asset, liability, equity, revenue, and expense.
  • Require debit and credit totals to balance in your trial-balance checks.

That last rule is a regular operating check, not theory. If totals do not match, stop and investigate. The scope here is operational process design. We stay anchored in ledger mechanics so finance, ops, and product can work from the same source of truth: what evidence should exist, where journal entries are created, and where balance checks belong.

What good looks like. By the end, your design should answer four practical questions clearly:

  • What is the source transaction for each payout-related entry?
  • What exact Debit and Credit lines should be posted?
  • What proof should exist before and after posting?
  • How will breaks be detected when debit and credit totals do not align?

A strong design makes failures visible early by building evidence, posting, and balance checks into the workflow instead of leaving accounting treatment for later cleanup. The next step is to set boundaries: what belongs in the ledger, what belongs in derived views, and which account model will keep entries consistent as volume and complexity grow.

For volume-driven architecture tradeoffs, see Real-Time Ledger vs Batch Settlement for Platform Volume Decisions.

Step 1 Set payout ledger scope and account model#

Use the payout subledger as the detailed record of recipient obligations, financial events and their journal effects. Reconcile it to the company’s general ledger under an approved mapping; the two need not be the same store. Wallet and dashboard balances should remain reproducible from the relevant ledger history, reservations and pending movements.

Make the ledger authoritative#

A balance table tells you the current value. A ledger tells you how that value changed. In payout operations, that history is what lets you investigate exceptions and timing issues using recorded transactions and journal entries.

Set the boundary early: store transactions, journal entries, and account effects in the ledger, then derive wallets and dashboards from posted history. When numbers drift, teams can ask which entry is missing or wrong instead of debating which screen to trust.

Freeze the account model before coding#

Lock the account model before you build payout logic. Since the ledger tracks core financial positions, define your core account classes explicitly up front, including at least assets and liabilities. Use additional account areas only where they fit your flow design, such as:

Account areaWhat it represents
AssetsResources the platform controls
LiabilitiesAmounts owed to users or counterparties
Equity (if used)Residual owner interest
Operating accounts (if used)Fee, clearing, or reserve movements in your model

Back this with an explicit schema for ledgers, transactions, and journal entries so finance, ops, and engineering agree on what gets recorded.

Write posting rules in debit and credit terms#

Do not leave posting logic implied in product states. Define each payout movement in double-entry terms: which account is debited, which is credited, and why. The integrity check is simple. Each transaction affects at least two accounts, and total debits equal total credits.

ItemRequirement
Account listwith purpose
Allowed transaction typesper account
Journal patternper payout movement
Validation rulethat rejects unbalanced postings

Your minimum design pack should include:

A practical internal stop-ship rule is: if a money movement cannot be represented as balanced journal lines, do not launch it. This helps prevent balance-only fixes that bypass journal history and can make reconciliation more fragile when something fails.

For a deeper look at deterministic posting and replay safety, see How to Build a Deterministic Ledger for a Payment Platform.

Step 2 Prepare prerequisites and evidence packs before posting#

Separate authorization to send a new payout from accounting for events that have already happened. A release check can block new execution. It must not hide a receipt, fee, bank debit or return that has already occurred.

Capture one release record per payout#

Attach a release record with the approval, applicable policy version and decision evidence to each payout. If approval evidence is missing, prevent a new send and investigate. If funds have already moved, record the actual financial event under the accounting policy and flag the control breach separately.

Gate compliance and tax checks before release#

Run legal, regulatory, and program checks before funds move, not later during reporting. Define explicit releasable statuses in your workflow and require those statuses before approval.

Collect the tax documentation applicable to the payee and payment, and record the resulting withholding or reporting treatment. Missing documentation or a TIN mismatch is not a universal ban on payment; route it through the applicable legal and provider requirements.

Keep reporting fields close to the transaction#

Link payee reporting data to the payout records finance needs. Keep restricted tax documents separately where appropriate, with a controlled reference rather than copying sensitive fields into every journal.

Track documentation gaps, applicable withholding decisions and payment totals explicitly. Do not use a tax-profile gap as a reason to omit a financial event from the ledger.

For rejected payout recovery flows, see Bank-Rejected Contractor Payout Recovery for Platform Teams.

Step 3 Map journal entries to each payout status#

Map each status to the economic event it proves, including an explicit “no journal” result. Requested and approved states can be operational records or reservations; they do not automatically change assets or liabilities.

Every financial posting must balance in its currency under your account model. Validate operational transitions separately. A valid status change can have no journal effect, and a balanced journal can still use the wrong accounts or amount.

Build a status matrix, then distinguish status updates, fund reservations and actual financial events. Give each economic event a stable posting identity so two callbacks about the same movement do not book it twice.

StatusJournal mapping ruleRequired checkpoint
requestedRecord intent; normally no financial journalRequest identity, recipient and obligation reference
approvedRecord authorization or reservation; no automatic cash postingApplicable release evidence and reservation model
sentPost only the financial effect supported by provider or bank evidenceDistinguish request acceptance from actual debit; use clearing if policy requires
paidConfirm completion; post only any economic effect not already bookedPrior journals and confirmation refer to the same movement
failedNo reversal if no financial effect occurred; otherwise investigate the debit and recoveryResolve unknown execution before retrying or restoring availability
returnedRecord confirmed returned funds and restore the obligation where applicableActual return amount, fees, receipt evidence and prior posting references

For an illustrative USD-only flow, assume a USD 100 recipient payable already exists and the approved policy discharges it when a confirmed USD 100 bank payment occurs: debit recipient payable 100 and credit bank cash 100. A later paid callback adds no second journal. If the full amount is confirmed back in the bank and the obligation is reinstated, debit bank cash 100 and credit recipient payable 100. A failure before any debit has no cash reversal. Real flows may need clearing accounts, different liability timing and separate fee entries; document those assumptions before using the example.

Step 4 Enforce idempotent posting and event ordering#

If your posting path is not replay-safe, the rest of the design can break under normal operational noise. Every retry of the same payout action should resolve to the same outcome, not a second set of Debit and Credit lines. Put idempotency controls at both the payout request layer and the journal posting layer, and treat webhook arrival as input to validate, not automatic permission to post.

Retries, timeouts, and message redelivery can trigger the same operation multiple times. A server cannot inherently distinguish a retry from a brand-new request. Duplicate recognition has to happen before you touch the general ledger.

Store idempotency keys where the posting commits#

Give each payout command and each economic posting event a stable identity. In a single transactional store, enforce uniqueness and commit the posting claim and complete balanced journal together. PostgreSQL transactions provide an all-or-nothing boundary, but uniqueness and account validation still have to be designed. Persist a response or reference for duplicate requests.

Persisted itemRequirement
the idempotency keystore the key in the primary database within the same transaction as the business operation
the journal or state transition created by the requestcommit the idempotency key and business write atomically
the response you will return for duplicatespersist the response tied to that key

In practice, commit the idempotency key and business write atomically, and persist the response tied to that key:

On a duplicate command with matching parameters, return its prior result without posting again. A changed amount or recipient under the same identity should be rejected. Keep economic posting deduplication separate from webhook delivery deduplication.

Primary database key storage has a cost: higher write latency and more database load. But it reduces a worse failure mode, partial failure, where one write succeeds and another does not, creating duplicate-posting risk on retry.

Handle webhook events as deduped, potentially out-of-sequence input#

Verify webhook signatures using the provider’s documented method before trusting events. Deduplicate delivery IDs, but also enforce a unique economic posting identity: different events can describe the same financial movement. Do not rely on arrival order.

Event conditionHandling ruleVerify before posting
Duplicate delivery or repeated economic eventAcknowledge safely; do not create another journalDelivery identity and unique economic posting identity, not provider payout reference alone
Event arrives out of expected sequenceRecord receipt; do not infer missing transitions from arrival order aloneParent payout exists and transition is valid in your state map
Provider confirmation arrives lateReconcile against current canonical payout stateCurrent state and existing references still reconcile
Event has no known parent referenceFollow your operator policy, for example hold for review instead of blind postingParent lookup result, raw payload retained, escalation or retry path set

Post from canonical transitions when ordering is unclear#

Validate provider evidence against the payout and its financial event history. A state machine can organize that history, but it does not replace bank or provider evidence of actual money movement. Preserve delayed or corrective events and decide whether their economic effect is already posted.

For each processed webhook, log:

  • provider event ID or reference
  • linked parent payout reference
  • idempotency key or dedupe fingerprint
  • resulting canonical transition, if any
  • resulting journal ID, or reason no posting occurred

That audit trail helps demonstrate that replayed events did not create duplicate postings.

For a step-by-step walkthrough, see How to Generate Financial Reports for Investors from Your Gig Platform.

Step 5 Build daily reconciliation with ownership and escalation#

Regular reconciliation helps confirm records and surface potential issues early. Run it on a fixed cadence for your operation, and treat every mismatch as a tracked break with an owner, status, and evidence. A practical pattern is to compare the same payout activity across three views in one cycle: provider statements, posted general ledger journals, and derived balance projections.

Payment reconciliation means comparing internal records against external statements. In payout operations, comparing those three views in the same operating window can reveal different break patterns.

Step 5.1 Compare three views in the same operating window. Use one business date or cutoff window across:

  1. provider statements or processor reports
  2. posted general ledger journals
  3. derived balance projections, for example wallet, available, reserve, or return-related balances

Your checkpoint is simple: each payout reference is either matched across all three views or logged as an open break with a next action.

Step 5.2 Assign first ownership by break type. Shared exception queues usually slow everything down. Assign a first responder by break type so someone owns the first question immediately. A practical model is:

Break typeFirst ownerFirst checks
Timing breakOpsstatement window, payout state, pending confirmations
Accounting breakFinancejournal integrity, mapping, amounts/currency, reversals
System-state breakProduct/Engineeringtransition validity, derived-balance logic, event handling

This split is an operating choice, not a universal rule. The important part is clear separation of duties, so teams can resolve their first check quickly.

Step 5.3 Standardize evidence and escalation. Standardize documentation for every break so handoffs stay auditable and fast. Define a minimum evidence pack for your process, such as payout, journal, and provider references, relevant webhook events, timestamps, and decision logs.

Set explicit escalation timers by risk. There is no universal SLA in the source material, so define thresholds that fit your reporting and close process, then enforce them consistently.

Step 5.4 Define coverage for credits and returns. If you operate Virtual Accounts, document whether credits and returns are reconciled in the same cycle or in a linked follow-up cycle. The key control is that these flows are documented consistently so records stay complete and reporting risk is reduced.

A reliable reconciliation process is not one with zero breaks. It is one where breaks are small, owned, and documented well enough that another operator can continue without starting the investigation over. Related reading: Building a Monthly Payout Reconciliation Process for a 1000-Contractor Platform.

Step 6 Choose storage and posting architecture that fits your scale#

Do not let storage choices rewrite accounting behavior. Keep your posting contract stable first, then pick storage. If backend changes force you to rethink accounting rules, references, or reversal behavior, the ledger contract was not stable enough.

Keep accounting behavior consistent across storage choices. In a separate ledger store such as TigerBeetle, the application database and ledger do not share an ordinary SQL transaction. Persist the command intent, use a stable ledger transfer ID for retries, recover its result, and reconcile pending intents with accepted ledger records. TigerBeetle’s submission guidance explains reuse of transfer IDs after network failures.

Use a simple test: take one payout from requested to paid, then reconstruct it from journal entries and references alone. If you need a separate balance table to explain what happened, tighten your journal contract before changing storage.

Step 6.2 Choose the backend by your real bottleneck. Choose storage based on measured pain in your operation, not architecture preference. There is no established throughput winner here between PostgreSQL and TigerBeetle, so use your own constraints and tests to decide.

Whatever backend you choose, define invariants that do not change: posting rules, immutability expectations, reconciliation inputs, and correction workflow. If you want journal writes to be authoritative and balances to be derived, document that as an explicit operating rule and test it in failure scenarios.

Before changing the backend, define a cutover point, preserve posting identities and establish how pending commands and late provider events will be handled. Compare historical balances and entry populations before allowing new writes to the target ledger.

Before cutover, answer four questions:

  1. Which posting rules, mappings, and reference fields are frozen during migration?
  2. How will you prove historical entries are complete and reproducible in the target store?
  3. What evidence pack shows audit trail continuity for the same payout before and after cutover?
  4. What rollback rule applies if derived balances and journals diverge?

If cutover checks fail, stop new execution through the affected path and recover the records. Rollback must preserve accepted external payments and ledger entries; do not resubmit an unresolved payout merely because the storage migration failed.

Step 7 Add compliance and tax gates without stalling payouts#

At the pre-send boundary, evaluate the controls actually required for this flow. Define whether an unresolved result blocks a new send, requires review or changes withholding. Continue recording financial events that have already occurred.

Step 7.1 Gate release with explicit machine-readable outcomes. Your approval step should read named decisions, not notes or chat context. For controls your policy defines (for example identity, screening, or tax-profile checks), require a discrete status and store the decision record used at release time. Do not assume this section establishes any specific legal requirement for KYC, KYB, AML, W-8/W-9, or VAT checks.

Control areaReleasable outcome (example)Non-releasable outcome (example)Store for audit
Identity / screening control (policy-defined)explicit pass per policyfailed, review-required, expired, blank, nonstandarddecision ID, decision source, timestamp
Tax documentation and treatmentApplicable documentation or authorized withholding treatment recordedUnresolved condition that the applicable law or provider requires to block executionApplicable requirement, document reference and withholding decision
Eligibility rules (policy-defined)eligible per policyineligible, unverified, blank, nonstandardrule version, result, rationale

An absent response from a required release control should block a new send until resolved. Keep that authorization rule separate from recording actual movement and from deciding whether funds may lawfully be held.

Step 7.2 Route unknowns before send, not by manual exception after. Predeclare every path. If policy defines a missing or invalid result as blocking, block it. If policy allows review routing, send it to review automatically and keep the payout non-releasable until the decision is written back.

Treat planned controls as unavailable until they are active and verified. Record the gap and decide whether it prevents launch or needs another approved control; a target release date is not an operating safeguard.

Step 7.3 Separate automated checks from override authority. Overrides need to be explicit, limited, and reviewable. Managerial review and separation of duties matter here. The same actor pushing payout completion should not be the only actor who can override a failed or missing gate.

For each override, log the failed control, approving authority, rationale, timestamp, and required follow-up.

Step 7.4 Verify every gate is auditable after release. Use a hard rule: if a control cannot be audited later, it is not a valid release control. You should be able to reconstruct why a payout was releasable from stored decision statuses and metadata, without relying on informal history. Related: Integrated Payouts vs. Standalone Payouts: Which Architecture Is Right for Your Platform?.

Step 8 Decide integrated payouts or standalone payouts for your platform#

Choose this based on your accounting boundary and integration gates, not product preference. Start by identifying where debits and credits first become authoritative in your general ledger, then choose the design that keeps that boundary and each handoff explicit.

Step 8.1 Anchor the decision to the accounting boundary. Evaluate integrated and standalone payouts against the same test: can you keep collection, posting, and disbursement handoffs traceable at the accounting boundary? If collection is already handled upstream by your existing stack, a standalone payout layer can still work as long as the accounting handoff is explicit.

In either model, define explicit integration gates into accounting. A practical baseline is to name how data enters Accounts Receivable, Accounts Payable, and Journal Entry, then confirm where bank-statement matching happens for reconciliation.

Step 8.2 Compare designs by operational load.

Decision areaIntegrated payoutsStandalone payoutsWhat to confirm before committing
Implementation timeDepends on how much collection, posting, and payout logic is net-newDepends on how much of the existing collection stack can be reused and how large payout integration scope isOwners, sequence, and dependencies for each integration gate
Reconciliation burdenDepends on how clearly posting and bank-match checkpoints are definedDepends on how clearly posting and bank-match checkpoints are defined across systemsExact bank-match checkpoint and break-resolution owner
Exception volumeDepends on handoff quality and how failures are routedDepends on handoff quality and how failures are routedNamed handling path for payout exceptions
Ownership clarityWorks when each state transition has a named ownerWorks when each state transition and cross-system handoff has a named ownerWritten owner per state transition and handoff

Keep the comparison concrete: where records are created, where they are posted, and who resolves mismatches.

Step 8.3 Validate posting and reporting shape before go-live. Review posting and reconciliation checkpoints in the same design pass so obligations and exceptions are explicit. For posting, decide explicitly between invoices and journal entries, and between invoice-level detail and daily summary.

Before any integration switch, treat continuity as a control point. A switch may look simple, but reset or switch actions can remove current mappings and disable sync jobs. Capture current mappings and recent successful sync state before cutover.

If rollout constraints are the blocker, compare operational fit and rollout requirements in Gruv Payouts.

Step 9 Handle common payout ledger failures and recovery actions#

Recovery discipline is part of ledger design, not after-the-fact cleanup. If a payout issue cannot be repaired through traceable state changes, journal treatment, and a clear audit trail, it is likely to show up again at close.

Failure caseRecovery action
Duplicate postingcheck your posting key and the linked journal entry or ledger transaction for that payout event
Payout state mismatchesverify the payout record, provider reference, and event order before you change state
Returns after closehandle that with dated adjustment entries and reconciliation review
Exception handlingkeep the rule application explicit in the audit trail

Step 9.1 Block duplicate posting before you repair it. First prove whether the business event was already accepted before posting anything new. Idempotency belongs with transaction-state and batching design, so check your posting key and the linked journal entry or ledger transaction for that payout event.

If you confirm a double post, correct it through standard journal controls rather than manual balance edits. The fix is complete only when you can trace the original entry, the correcting entry, and the triggering event record.

Step 9.2 Repair payout state mismatches first, then post if needed. Treat this as a state-repair problem first, not a posting shortcut. When external payout records and internal ledger state diverge, verify the payout record, provider reference, and event order before you change state.

Then apply the state update and annotate the audit trail instead of silently mutating the record, so the correction remains defensible in review.

Record a confirmed return using the applicable accounting date, amount and correction policy, with links to the earlier movement. A return arriving after close requires finance review of period treatment; it is not permission to rewrite closed history or assume every refund restores the same payable.

This is also where cost and timing pressures meet. Batching payouts can reduce disbursement cost, but timing still has to be managed. Keep each return tied to provider records, adjustment entries, and reconciliation review.

Step 9.4 Standardize exception handling with predefined rules. Consistent, predefined posting rules reduce manual-error risk during repairs and exceptions. Keep the rule application explicit in the audit trail so reviewers can follow what changed and why.

For API-side design patterns that support reliable ledger posting, see Payout API Design Best Practices for a Reliable Disbursement Platform.

Conclusion and copy paste launch checklist#

Do not launch payouts until your team can trace any payout from request to internal general ledger impact, provider evidence, and final reporting fields without guessing.

Use this as the final checkpoint before go-live:

  • Journal posting rules are documented (including reference IDs and posting triggers), and sampled payouts confirm amounts, currency, and request traceability in the internal general ledger.
  • Ownership for retry and webhook handling is explicit, the posting trigger is documented, and duplicate or delayed deliveries are tested so they do not create extra journal impact.
  • Daily reconciliation covers provider records, journal entries, and derived balances together, with operational exception tracking (owner, age, next action) and ledger correction when discrepancies are confirmed.
  • Compliance checks required by your program (for example KYC and AML) are applied before payout release, with auditable decision records instead of informal approvals in chat or email.
  • Applicable tax documentation, withholding and reporting treatment are defined separately from financial event recording.
  • Your ledger architecture is validated against audit-trace outcomes: historical journal retrieval, reference-link continuity, explainable balance derivation, and trace continuity through backfills or migrations.

When your checklist is complete, use Gruv Docs to map payout states, webhooks, and retry handling into your implementation plan.

Frequently Asked Questions

What is a payout ledger in `double-entry bookkeeping` terms?

A payout ledger records the financial effects of payout-related business events with balanced debit and credit entries. Operational statuses can have no journal effect. The detailed payout subledger can feed a separate general ledger, with mappings and reconciliation between them.

How is a `payout ledger` different from a balance table?

A ledger is the accounting record built from journal entries that update accounts. A balance table can be a derived summary view used for reporting or product display. If they diverge, review how the balance view was derived from the journaled ledger entries.

What entries should be posted when a payout fails or is returned?

If execution failed before any financial effect, there may be no journal to reverse. If money was debited or later returned, use the actual amount and evidence to apply the approved clearing, cash and liability treatment. Link corrections to the original entries and preserve history.

Why are `idempotent retries` mandatory for payout bookkeeping?

Repeated commands and callbacks must not book the same economic event twice. Use stable command identities and unique posting identities, enforced when the journal commits. When a provider submission has an unknown outcome, resolve it through the original reference before creating a new payment attempt.

What should platform teams reconcile daily for payout accuracy?

One practical baseline is to reconcile journal entries and general ledger balances for internal consistency, then compare them against your external payment evidence under your own policy. Design the check to surface unmatched or duplicate items quickly.

Which records are required for an audit-ready payout operation?

Keep the business obligation, financial event, balanced journal and external evidence linked. Retain posting identities, corrections, reconciliation breaks and release decisions under the applicable retention policy. The point is to reconstruct the financial effect and its authorization without relying on a dashboard balance.

How should finance, ops, and product split payout ledger ownership?

Define explicit decision rights for accounting treatment, operational exception handling, and system posting behavior so control boundaries are clear. If responsibilities overlap, document handoffs and approval points before scale increases.

Gruv Editorial Team

Researched and edited by the Gruv editorial team. Gruv builds cross-border billing, payouts, and finance-operations software for global businesses.

Sources

Includes 3 external sources outside the trusted-domain allowlist.

  1. docs.stripe.com/webhookstrusted
  2. docs.stripe.com/api/idempotent_requeststrusted
  3. docs.tigerbeetle.com/coding/reliable-transaction-submissionexternal
  4. netsuite.com/portal/resource/articles/accounting/double-e...external
  5. postgresql.org/docs/current/tutorial-transactions.htmlexternal

Educational content only. Not legal, tax, or financial advice.

Related Posts

The Freelance Payment Penalty: A Modeled Audit of Platform Fees, FX Spreads, and Payout Delays
Research Reports19 min read

The Freelance Payment Penalty: A Modeled Audit of Platform Fees, FX Spreads, and Payout Delays

The money rarely disappears through a single, easy-to-spot fee. The real loss is stacked. A marketplace takes its commission, a processor adds a charge for international cards, a bank or payment company converts the currency at a spread, a platform holds the funds before release, and a wire sheds a little to intermediaries on the way in. Each layer looks defensible on its own, but the worker feels the combined result as a smaller deposit and a later payday.

freelance payment feescross-border paymentsplatform fees
Read
How to Respond to a Subpoena for Business Records
Legal Action26 min read

How to Respond to a Subpoena for Business Records

Move fast, but do not produce records on instinct. If you need to **respond to a subpoena for business records**, your immediate job is to control deadlines, preserve records, and make any later production defensible.

subpoena responselegal documente-discovery
Read
A US Expat's Guide to Investing in UCITS ETFs to Avoid PFIC Issues
Professional Deep Dives15 min read

A US Expat's Guide to Investing in UCITS ETFs to Avoid PFIC Issues

The real problem is a two-system conflict. U.S. tax treatment can punish the wrong fund choice, while local product-access constraints can block the funds you want to buy in the first place. For **us expat ucits etfs**, the practical question is not "Which product is best?" It is "What can I access, report, and keep doing every year without guessing?" Use this four-part filter before any trade:

ucits etfspficus expat investing
Read