CRM Solid logo
Revenue Sources

Your other websites'
revenue, in one
finance dashboard.

Connect a WooCommerce store, a Shopify shop, a custom PHP or Node site, or any other SaaS. Every sale becomes an Income entry in your CRM Finance ledger, and the buyer is matched to a CRM contact automatically.

  • Push or pull
  • Feeds CRM Finance
  • No double counting
app.crmsolid.com / finance
Revenue ledger
Live sync
Income, today
$512.50
+18%
WooCommerce
Pushmatched to contact
+$129.00
Shopify store
Pushmatched to contact
+$84.50
Custom PHP site
Pullmatched to contact
+$240.00
Course platform
Pushmatched to contact
+$59.00
4 sources connected, deduped by external id
Two ways to connect

Push to us, or let us pull from you

Push is best when your site can fire an HTTP request on every sale. Pull is best when you would rather expose a feed and let CRM Solid poll it on a schedule. Use either, or both.

Push mode
Your site
on every sale
POST
CRM Solid
stores + matches
Pull mode
CRM Solid
on a schedule
GET
Your feed URL
returns events
your-site -> CRM Solid
POST event
curl -X POST https://api.crmsolid.com/public/v1/revenue/events \
-H "Authorization: Bearer rsk_live_***" \
-H "Content-Type: application/json" \
-d '{
"externalId": "wc_10482",
"amount": 129.00, "currency": "USD",
"status": "completed",
"customer": { "email": "[email protected]" }
}'
120 events / minute
A generous rate limit, with up to 500 events per batch request.
rsk_ keys, shown once
The raw key is displayed a single time, then stored only as a BCrypt hash.
AI integration brief
Copy a ready-made prompt into Cursor or Claude and let it write the PHP, cURL, or Node code for your own site.
One rich event model

Every sale, captured in full detail

Three fields are required. Everything else is optional, so you send as much as you have: product lines, taxes and fees, the customer, and any custom metadata.

sale.event.json
{
"externalId": "wc_10482", // dedupe key
"type": "income", // or "expense"
"status": "completed",
"amount": 129.00, "currency": "USD",
"occurredAt": "2026-06-02T14:32:18Z",
"tax": 21.50, "fee": 4.07, // net = amount - fee
"product": "Pro Plan", "sku": "PRO-001",
"quantity": 1, "unitPrice": 129, "discount": 0,
"coupon": "SPRING",
"customer": {
"externalId": "cust_77", "email": "[email protected]",
"name": "Sara Miller", "country": "US"
},
"metadata": { "orderTags": ["vip"] }
}
Required
always
  • externalId
    Your own ID for the sale. Used to dedupe and update.
  • amount
    Gross value of the sale, in the given currency.
  • occurredAt
    When the sale actually happened (ISO 8601).
Status & type
  • status
    completed, pending, refunded, or failed.
  • type
    income, or expense to feed ad spend through the same endpoint.
Product
  • product / sku
    Product name and stock keeping unit.
  • quantity / unitPrice
    How many units, and the price each.
  • discount / coupon
    Discount amount and the coupon code used.
Accounting
  • tax
    Tax collected on the sale.
  • fee
    Processing fee. Net is computed as amount minus fee.
Customer
  • externalId / email
    Used to match an existing CRM contact, or create one.
  • name / phone / company
    Profile fields that enrich the contact record.
  • country / city
    Location, attached to the contact.
Metadata
  • metadata
    Any free-form JSON you want to carry along with the event.
Idempotent + real profit

Profit and loss, per source

For each connected source, CRM Solid nets revenue against costs, both the manual costs you log and the processing fees on each sale, so you see true profit, not just top-line income.

Daily net, WooCommerce store
income minus all costs
profit loss
0
Mon
+62
Tue
+88
Wed
-34
Thu
+110
Fri
+74
Sat
-18
Sun
+96
Income
$3,140
Costs + fees
$762
Net profit
$2,378
Idempotent by external ID
Send the same sale twice and it updates the existing entry instead of creating a duplicate. Retries are completely safe.
Refunds tracked, not faked
Flag a sale as refunded or failed later and the finance dashboard follows along, subtracting the refund from already-counted revenue.
Last sync log2 min ago
Accepted
142
Duplicates
9
Updated
6
Rejected
1
Every run records what was accepted, what was skipped as a duplicate, what got updated, and what was rejected, so nothing silently goes missing.
Customer enrichment

Every sale enriches a contact

CRM Solid matches each buyer to an existing CRM contact, or creates a new one, then attaches the purchase, location, and any profile fields you sent. Matching follows a clear priority order:

externalId
exact source ID
email
fallback
phone
last resort
Safe by design

Pull feeds are SSRF-protected

When CRM Solid fetches your feed URL, requests to private and internal networks are blocked. Your stored feed credentials stay encrypted, and a malicious URL can never be used to reach somewhere it should not.

Private network ranges blocked
Feed secrets stored encrypted
Revenue Sources is part ofCRM Finance
Ready when you are

Bring all your revenue
into one ledger

Connect your first source in minutes. Push a sale, or point us at a feed, and watch income, profit, and enriched contacts show up in CRM Solid.

  • Free 14-day trial, no credit card
  • Push API or scheduled pull, your choice
  • Idempotent, refunds tracked, deduped
  • Cancel any time, export your data

We value your privacy

We use cookies to improve our site, analyze traffic, and personalize ads. You can accept all, reject non-essential, or customize your choices. Read our Cookie Policy.