Skip to main content

Onchain data for crypto accounting

What is onchain data for crypto accounting?

Onchain data for crypto accounting is the history of every transfer in and out of the wallets a firm accounts for, each with its USD value at the time it happened, loaded into a crypto subledger.

Fintechs, stablecoin issuers and payment rails need it so finance can book each movement and close the month without rebuilding wallet history by hand.

Goldsky can load each wallet’s history, keep new transfers coming and supply USD values at transfer time; your team joins them, posts the entries and closes the books.

You can feed a crypto accounting subledger three ways: stream every wallet transfer into your warehouse with Turbo Pipelines and add USD values from Feeds, pull transfers with their USD values from the Feeds transfers API, or have Feeds sync those transfers into your database.

Who uses onchain data for crypto accounting?

Fintechs that keep their own ledger, stablecoin issuers and payment rails whose finance teams close the books on wallet activity.

How onchain data reaches a crypto accounting subledger

The diagram follows wallet activity from the moment you connect a wallet to the close of the books, and shows who does each step. Your setup may differ.

Your business, step 1: Connect your walletsEvery wallet finance accounts for
Goldsky, step 2: TurboLoad past activityFrom each wallet’s first transaction
Blockchains, step 3: Cash movesTransfers in and out, every day
Goldsky, step 4: TurboCapture every transferLive, into your warehouse
Your business, step 6: Join and postMatched on transaction and token, then booked
Goldsky, step 5: FeedsGet priced transfersUSD value at transfer time, per wallet
Your business, step 7: Close the booksYour subledger holds priced entries
  • Goldsky

Ways to feed onchain data to a crypto subledger

Only the pipeline leaves the USD values to you, joined from Feeds onto transfer rows in columns you choose; the transfers API and the synced feed bring each transfer with its USD value already on the row.

Best for
Many wallets, full history in your warehouse
Products
TurboFeeds
What you run
The destination: your database, queue or bucket, or a Postgres database Goldsky hosts
What you write
Pipeline YAML and SQL; TypeScript transforms when needed
Where your data lives
In your own database or systems
How results reach you
Pushed to you
Best for
A few wallets, pulled before each close
Products
Feeds
What you run
Nothing; you call an endpoint and keep what you need
What you write
REST requests
Where your data lives
Hosted by Goldsky
How results reach you
Returned when you call
Best for
Valued transfers kept in your database, no pipeline
Products
Feeds
What you run
The destination database or endpoint
What you write
Nothing to get the rows; your own SQL to use them
Where your data lives
In your own database or systems
How results reach you
Pushed to you

Option 1: Feed a crypto subledger by streaming transfers to your warehouse

A pipeline backfills each wallet’s history and keeps writing new transfers to your warehouse. USD values at transfer time come from the Feeds transfers API, and your team joins them to the transfer rows before posting.

When to stream wallet transfers to your warehouse

You account for many wallets, want full transfer history in your own warehouse, and your team can join prices to transfers before posting.

What you’ll need

  • Goldsky Turbo
  • Goldsky Feeds
  • A register of the firm’s wallets and their ledger accounts
  • A data warehouse or object store
  • A crypto subledger or general ledger to post to
  • A pricing policy for tokens with no USD value
  1. List every wallet finance accounts for

    The books can only be as complete as the list of wallets behind them.

    Keep one register of the firm’s wallets with chain, owner and the ledger account each one maps to. A wallet missing from it means its transfers never reach the subledger, and the gap shows up as an unexplained balance at audit.

  2. Load each wallet’s past activity

    Handled by Goldsky Turbo

    Opening balances depend on everything that happened before you started, so history comes first.

    Load every transfer from each wallet’s first transaction to today. A history that starts late gives wrong opening balances, and every later period inherits the error.

    Goldsky’s Turbo Pipelines can backfill the history once in job mode, filtered to your wallets, and exit when it reaches the end of the range.

    Run a one-time backfill job (opens in a new tab)
  3. Move funds through the wallets

    Every transfer in or out of a firm wallet is an accounting event.

    Stablecoins and other tokens arrive from customers and leave for payouts, fees and treasury moves. Each one needs an entry, including small ones such as network fees.

  4. Capture every new transfer

    Handled by Goldsky Turbo

    After the backfill, new transfers keep arriving and each needs an entry.

    Write each new transfer to the warehouse as it happens, with chain, transaction, token, amount and direction. Rows corrected after a reorg have to be updated in place, or the subledger books transfers that no longer exist.

    A streaming pipeline writes new transfers to your warehouse; sinks keyed on a primary_key apply reorg corrections to the same rows, and append-only sinks such as S3 receive correction records to apply.

    How reorgs reach your sinks (opens in a new tab)
  5. Get USD values at transfer time

    Handled by Goldsky Feeds

    Accounting books each movement at its value when it happened, not today’s price.

    Fetch each wallet’s transfers with their USD value, and store the value when you post. Prices for old transfers can be filled in later, so a value read twice may differ.

    The Feeds transfers endpoint returns each wallet’s transfers with price_usd and amount_usd at transfer time. Add include_unknown_price=true so tokens without a price still come back.

    Read the transfers endpoint reference (opens in a new tab)
  6. Join prices to transfers and post entries

    An entry needs both the movement and its value in your reporting currency at the time it happened.

    Each transfer is priced at the token’s price just before its block, so every transfer of one token in a transaction has the same price. Join that price to your transfer rows by chain, transaction and token, then post the entry to the right ledger account. A transfer with no USD value needs one from your own pricing policy before it’s booked.

  7. Close the books

    At period end, finance confirms the subledger agrees with the wallets and rolls it into the general ledger.

    Compare each wallet’s booked balance with its balance on the chain at the period end, explain any difference and post the summary entries. A difference left unexplained is carried into the next period and gets harder to trace.

What to know about streaming transfers to your warehouse

  • Prices come from a separate call per wallet, so joining them to transfer rows is your step, by chain, transaction and token.
  • Transfers of the same token in one transaction share a price, so identical transfers don’t need telling apart for the join.
  • The pipeline’s SQL decides the columns, so the rows can match your subledger’s import format.
  • Goldsky runs the pipeline; you own the warehouse, the join and the postings.

Option 2: Feed a crypto subledger with a wallet transfers API

Your code calls the Feeds transfers endpoint for each wallet and gets its transfers with token details and the USD value at transfer time, ready to post. There’s no pipeline to run.

When to pull wallet transfers with USD values from an API

Finance accounts for a handful of wallets on chains the API covers, and a pull before each close is often enough.

What you’ll need

  • Goldsky Feeds
  • A register of the firm’s wallets and their ledger accounts
  • A crypto subledger or general ledger to post to
  • A store for the transfers and values you’ve posted
  1. List every wallet finance accounts for

    The books can only be as complete as the list of wallets behind them.

    Keep one register of the firm’s wallets with chain, owner and the ledger account each one maps to. A wallet missing from it means its transfers never reach the subledger, and the gap shows up as an unexplained balance at audit.

  2. Move funds through the wallets

    Every transfer in or out of a firm wallet is an accounting event.

    Stablecoins and other tokens arrive from customers and leave for payouts, fees and treasury moves. Each one needs an entry, including small ones such as network fees.

  3. Pull each wallet’s transfers with USD values

    Handled by Goldsky Feeds

    Each entry needs the movement and its USD value at the time.

    Request every transfer in the period, both directions, including tokens without a price. Transfers have no ID, so your record of what’s posted can’t rely on amount and address alone.

    Feeds returns each wallet’s native and ERC-20 transfers with price_usd and amount_usd, filtered by from and to times for the period you’re closing.

    Read the transfers endpoint reference (opens in a new tab)
  4. Post entries to the subledger

    Each transfer, with its USD value, becomes an entry against the wallet’s ledger account.

    Book each transfer once, at the value you stored when you pulled it, and give tokens with no USD value one from your own policy. An entry posted without that check can be posted twice on the next pull.

  5. Close the books

    At period end, finance confirms the subledger agrees with the wallets and rolls it into the general ledger.

    Compare each wallet’s booked balance with its balance on the chain at the period end, explain any difference and post the summary entries. A difference left unexplained is carried into the next period and gets harder to trace.

What to know about pulling transfers from an API

  • Each row already carries its USD value, so there’s no price join.
  • The API values each transfer when you request it, so store the value you post.
  • Native and ERC-20 transfers only; other assets need another source.
  • A transfer undone by a reorg stops appearing with no flag, so pull after transfers are final.

Option 3: Feed a crypto subledger with a synced transfers feed

Feeds pushes each wallet’s new transfers, with token details and USD values, into your database as they land. Your subledger posts from those rows.

When to sync transfers with USD values to your database

You want transfers and their USD values kept current in your own database without defining a pipeline, and the feed’s columns fit your subledger.

What you’ll need

  • Goldsky Feeds
  • A register of the firm’s wallets and their ledger accounts
  • A database or webhook endpoint you run to receive the rows
  • A crypto subledger or general ledger to post to
  1. List every wallet finance accounts for

    The books can only be as complete as the list of wallets behind them.

    Keep one register of the firm’s wallets with chain, owner and the ledger account each one maps to. A wallet missing from it means its transfers never reach the subledger, and the gap shows up as an unexplained balance at audit.

  2. Move funds through the wallets

    Every transfer in or out of a firm wallet is an accounting event.

    Stablecoins and other tokens arrive from customers and leave for payouts, fees and treasury moves. Each one needs an entry, including small ones such as network fees.

  3. Sync transfers and USD values into your database

    Handled by Goldsky Feeds

    Transfers with their USD values land where your subledger can read them, without anyone pulling.

    Each row needs wallet, token, amount, direction, transaction and value. A sync that falls behind delays the close.

    With Goldsky, Feeds can sync the transfers feed to a Postgres, MySQL or ClickHouse database you own as new rows land.

    Sync Feeds to your database (opens in a new tab)
  4. Post entries to the subledger

    Each transfer, with its USD value, becomes an entry against the wallet’s ledger account.

    Post each row once it’s final, at the value on the row, and keep that value with the entry. Give tokens with no USD value one from your own policy before they’re booked.

  5. Close the books

    At period end, finance confirms the subledger agrees with the wallets and rolls it into the general ledger.

    Compare each wallet’s booked balance with its balance on the chain at the period end, explain any difference and post the summary entries. A difference left unexplained is carried into the next period and gets harder to trace.

What to know about syncing a transfers feed

  • Rows arrive in the Feeds schema, so the subledger import reads those columns.
  • New transfers are pushed as they land, so nothing polls for them.
  • Waiting for finality and posting each transfer once stay in your code.
  • Goldsky runs the sync; you own the destination.

What you control

Your team
  • List every wallet finance accounts for
  • Join prices to transfers and post entries
  • Close the books

Security and deployment

  • SOC 2 Type IIIndependently audited security controls.
  • Dedicated infrastructureSingle-tenant options for production workloads.
  • Data residencyCloud, on-premises or co-located.

Feed a crypto accounting subledger with Goldsky

We’ll map it to your systems and show you what Goldsky runs, so your team builds the product, not the pipelines underneath it.

© Endless Sky Inc. All rights reserved.

PrivacyTermsSecurity

System status