How it works
- Connect your org. An admin signs in to Salesforce from Settings → Integrations and approves Crumb through Salesforce's OAuth flow.
- Accounts come across. The first sync runs immediately. Crumb queries the ID, name, and AnnualRevenue of every named Account, then links each one to the Crumb account with the same name or creates a new one. Accounts without AnnualRevenue come in at $0.
- AnnualRevenue becomes ARR. The standard AnnualRevenue field is stored as the account's ARR, unless you've set that account's ARR by hand in Crumb.
- Requests carry the dollars. Widget feedback lands on the account whose name your app passes in, so each request shows its ARR, and initiatives add it up across accounts.
- Refresh when you need to. Sync now pulls again on demand, and the CRM sync job refreshes every connected workspace whenever it runs. On self-host, you schedule that job with a cron.
What syncs
| What | Direction | When |
|---|---|---|
| Account name | Salesforce → Crumb | Every sync |
| AnnualRevenue, as ARR | Salesforce → Crumb | Every sync, unless set by hand in Crumb |
| Account ID | Salesforce → Crumb | Stored to keep the link on later syncs |
| Opportunities, contacts, custom fields | Not synced | Crumb queries the Account object only |
| Feedback, accounts, ARR | Not synced back | Nothing is written to Salesforce |
If your team tracks ARR somewhere other than AnnualRevenue, such as a custom field or rolled-up opportunity amounts, Crumb won't see it today. You can set ARR by hand on any account in Crumb, and the sync will respect it. ARR is capped at $21M per account.
When Salesforce expires the access token, Crumb refreshes it on the next sync. If the refresh fails, the integration shows as disconnected in Settings until an admin reconnects, instead of quietly failing on every sync.
Setup
Crumb Cloud: connect Salesforce in one click from Settings → Integrations, on the Team plan and up. The integrations page shows the connected instance, how many accounts synced, and when.
Self-hosted: create a Connected App with the api and refresh_token OAuth scopes and a callback URL of /api/integrations/salesforce/callback on your Crumb domain, then set SALESFORCE_CLIENT_ID and SALESFORCE_CLIENT_SECRET. To connect a sandbox, also set SALESFORCE_LOGIN_URL to https://test.salesforce.com. For scheduled refreshes, call POST /api/v1/internal/crm-sync from a cron with your sweep secret.
Using HubSpot instead?
The HubSpot integration works the same way, reading companies and their annual revenue.
Frequently asked questions
Does Crumb use opportunities to calculate ARR?
No. Crumb reads the AnnualRevenue field on Account records and nothing else. Opportunities, contacts, and custom fields aren't queried.
Does Crumb write to Salesforce?
No. The connection requests Salesforce's standard api and refresh_token scopes, but Crumb only runs a read query against Account. Nothing is written back.
Can I connect a Salesforce sandbox?
On self-host, yes: set SALESFORCE_LOGIN_URL to https://test.salesforce.com before connecting. The login host is a deployment-wide setting, not a per-workspace choice.
What happens to ARR I've set by hand?
It stays. Setting an account's ARR in Crumb marks it as manual, and later syncs refresh the name and link but leave that number alone.
How often does Crumb sync with Salesforce?
When you connect, whenever an admin or PM presses Sync now, and whenever the CRM sync job runs. On self-host, you schedule that job with a cron; the README suggests every six hours.