Enrichment cache for Clay.
Enrich each lead once without buying the same data again
Stockpile lets you reuse enrichment results across Clay tables when the same people and companies keep appearing in new lists, by checking a self-hosted cache before each provider call and saving new results for the next exact match.
✓ 100% free and open source ✓ One‑click Railway deploy ✓ Works with HTTP enrichment providers
⭐ Used by top GTM Engineers
Keep every enrichment result useful after the first lookup
A lead enriched in one table arrives in the next campaign with the same work ready to reuse. New provider calls are reserved for data the team has not already bought.
Choose between paying again, maintaining a shared sheet, building a cache — or deploying the one made for Clay
| Stockpile | No cache | Shared spreadsheet | Custom cache | |
|---|---|---|---|---|
| Free software | ✅ | ✅ | ✅ | ✅ |
| No code to deploy | ✅ | ✅ | ✅ | ❌ |
| No new service to run | ❌ | ✅ | ✅ | ❌ |
| Works across Clay tables | ✅ | ❌ | ✅ | ✅ |
| Checks before provider calls | ✅ | ❌ | ❌ | ✅ |
| Provider-specific cache slots | ✅ | ❌ | ❌ | ✅ |
| Normalizes common input formats | ✅ | ❌ | ❌ | ✅ |
| Automatic result expiry | ✅ | ❌ | ❌ | ✅ |
| One-click Railway deploy | ✅ | ❌ | ❌ | ❌ |
Check Stockpile before the provider call. Clay keeps the interface, Stockpile remembers exact past results, and new credits are spent only when the cache misses.
Check Stockpile from Clay. Reuse the result before another provider call runs.
📈 Keep each enrichment useful across tables
An Apollo person match or Hunter email lookup stored in one workflow can serve the next matching lead in another. The result stays separated by provider, endpoint, and exact normalized inputs.
⚡ Let Stockpile recognize repeat lookups
Stockpile normalizes harmless changes in email case, phone formatting, and URL shape before matching. It does not use fuzzy identity guesses.
💬 Call the provider only when Stockpile misses
Place the cache check before the enrichment column and run the provider when no result is found. Store each successful result so the next matching row can reuse it.
Cache your first enrichment in ten minutes
1️⃣Deploy StockpileUse the Railway template to create the service, persistent volume, public URL, and API key. |
2️⃣Add the cache checkPlace a Stockpile lookup before the provider column using the lead inputs that define the enrichment. |
3️⃣Reuse the resultRun the provider on a miss, store the successful result, and let future matching rows use the cache. |
Choose how to get started
Self-serveFor GTM engineers who manage Clay enrichmentFree ✓ Lookup, store, invalidate, and stats endpoints ✓ Exact provider, endpoint, and input keys ✓ Cross-provider and endpoint lookups ✓ Optional expiry and automatic cleanup ✓ Bearer token protection ✓ Railway deployment and SQLite persistence |
Done-with-youHands-on setup and ongoing support for your GTM teamLet's talk ✓ Everything in self-serve ✓ Full setup and Railway deployment ✓ Clay cache-check and store-column configuration ✓ Provider naming and cache-key design ✓ Team rollout, training, and best practices ✓ Ongoing maintenance and upgrades ✓ Dedicated Slack channel support |
| Deploy Stockpile | Book a demo |
Get your questions answered
Do I need to know how to code?
No code is needed to deploy the Railway template. You still need to configure the lookup, provider, and store columns in Clay's HTTP API builder.
Does Stockpile call enrichment providers for me?
No. Clay keeps calling Apollo, Hunter, Findymail, Icypeas, or another provider. Stockpile checks whether that exact enrichment is already cached and stores successful results for later reuse.
Can the wrong lead receive a cached result?
Stockpile does not fuzzy match identities. A cache slot is defined by the provider, endpoint, and deterministic hash of the normalized inputs you send.
Where is the cached data stored?
In one SQLite file on the host running Stockpile. The Railway template mounts a persistent volume at /data so the cache survives service restarts.
Do cached results expire?
Only when you set a time to live. Omit it or use zero to keep the result until you invalidate it.
Does Stockpile work outside Clay?
Yes. Any workflow that can make authenticated HTTP requests can use the lookup and store endpoints.
What does it cost?
The software is free and MIT licensed. You pay for the infrastructure where you deploy it and for any enrichment provider calls that still run on cache misses.
Cache your first enrichment in ten minutes
A repeat lead can reuse a past enrichment after one deployment and three Clay columns. Stockpile handles exact cache matching. You connect the lookup, provider, and store steps.
✓ 100% free and open source ✓ One‑click Railway deploy ✓ Works with HTTP enrichment providers
⭐ Used by top GTM Engineers
{
"request": {
"method": "GET",
"url": "https://api.eliasstravik.com/projects/stockpile"
},
"response": {
"status": "200 OK",
"headers": {
"content-type": "application/json; charset=utf-8",
"x-powered-by": "one person + systems"
},
"body": {
"name": "stockpile",
"description": "Enrichment cache for Clay",
"language": "TypeScript",
"stars": 7,
"forks": 0,
"repo": "https://github.com/eliasstravik/stockpile",
"readme": "https://github.com/eliasstravik/stockpile#readme"
}
}
}