How I Built a High-Converting B2B Lead Generation Funnel Using AI and Auction Provenance Data
October 1, 2025How I Built a Custom Affiliate Tracking Dashboard Using AI and Auction Data Analytics
October 1, 2025Let me tell you about building a headless CMS for numismatic research. It’s been one of my most fascinating projects – like giving a digital backbone to centuries of coin history. When I started creating a platform for tracking coin provenance, I quickly realized traditional CMS platforms just weren’t built for this kind of complex, interconnected data.
Why Headless CMS for Provenance Research?
Picture this: You’re trying to trace a 1916-D Mercury dime’s journey through time. It’s appeared in auctions at Heritage, Stack’s, and Goldberg. It’s been graded by PCGS, then re-graded by NGC. There are catalog scans, high-res images, and notes from dealers who handled it decades ago.
Traditional CMS systems? They choke on this complexity. A headless CMS with an API-first approach acts like a central hub for all this data. It keeps everything connected but separate from how we display it – whether that’s on a website, mobile app, or research tool.
Picking Your Headless CMS Platform
For numismatic work, I tested three platforms that each have their sweet spots:
Contentful: When You Need Serious Media Handling
Perfect if you have the budget and deal with lots of images. Here’s why it shines:
- <
- Handles high-resolution coin images like a champ
- Lets you create custom content types that mirror real-world relationships (like coin → auction → certification)
- Keeps version history when provenance details change
- Global CDN makes those big image files load fast worldwide
<
Here’s how I modeled coin data in Contentful:
// Contentful content model for coin provenance
{
"coin": {
"fields": {
"designation": "1905-O Dime (Blay)",
"certifications": ["PCGS 35 6933.35/5732952"],
"auctionHistory": ["relationship to auction collection"],
"images": ["relationship to assets"],
"provenanceNotes": "Long text field"
}
},
"auction": {
"fields": {
"house": "Heritage/Stack's/Goldberg",
"date": "date",
"lotNumber": "string",
"description": "text",
"images": ["relationship to assets"]
}
}
}Strapi: The Customization King
When I needed to build something tailored specifically for numismatics with limited funds, Strapi was my go-to. It let me:
- Create relationship fields that connect coins to their auction appearances and grading history
- Add validation rules to catch certification number typos
- Build a custom search that finds coins across multiple data points
My Strapi setup for coin data:
// Strapi coin collection type module.exports = {
kind: 'collectionType',
attributes: {
designation: {
type: 'string',
required: true,
unique: true
},
grade: {
type: 'string',
regex: /^(PCGS|NGC|ANACS)\s+\d{1,2}(\+?)$/
},
auctionReferences: {
collection: 'auction',
via: 'mintedCoins'
},
certNumber: {
type: 'string',
regex: /^[A-Z0-9\/]+$/
}
}
};Sanity.io: For Real-Time Collaboration
When working with other researchers or AI tools, Sanity’s real-time features are golden. I use it to:
- Store AI-processed data from old auction catalogs
- See updates as soon as new auction records come in
- Create specialized input fields for things like pedigree notation
Getting Data In: From Paper to Pixels
Here’s where the real work happens. Turning scattered auction records into structured data took some clever solutions:
1. Scraping Digital Archives
For modern auction sites, I built scrapers to pull:
- Lot details and descriptions
- Certification numbers
- Grading information
- High-quality images
A quick look at my Heritage scraper:
const scrapeHeritageLot = async (lotUrl) => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(lotUrl);
const lotData = await page.evaluate(() => {
return {
lot: document.querySelector('.lot-number').innerText,
description: document.querySelector('.lot-description').innerText,
grade: document.querySelector('.grade').innerText,
certNumber: document.querySelector('.cert-number').innerText,
imageUrl: document.querySelector('.lot-image img').src
};
});
await browser.close();
return lotData;
};
// Then send to CMS
await fetch('https://your-cms.com/api/auctions', {
method: 'POST',
body: JSON.stringify(lotData)
});2. Processing Paper Records with AI
For those musty old catalogs? That’s where AI shines:
- Tesseract.js extracts text from scanned images
- Custom models recognize coin designations and grades
- GPT-style prompts turn messy descriptions into clean JSON
Example prompt I use:
Extract structured data from this auction description: “Lot 1234: 1905-O Dime, PCGS MS-65, Ex: Blay Collection, Previously Auctioned in 1999 Heritage Sale”. Return JSON with fields: designation, grade, cert, provenance, previousSale.
3. Capturing Human Expertise
No algorithm knows everything. I built a custom Strapi field where researchers can:
- Add their provenance insights
- Link to physical catalogs (shoutout to NNP integration)
- Keep private notes for their collections
Frontend That Doesn’t Slow You Down
With all that data in place, I built a frontend that loads fast and works well:
Next.js vs Gatsby: Why I Chose Next
Next.js won for handling large image collections. My setup:
- Next.js powers the main research interface
- Incremental Static Regeneration keeps auction data fresh
- Dynamic routes create individual pages for each coin (by certification number)
- Custom API routes handle complex searches
How I generate coin pages:
// pages/coins/[certNumber].js
export async function getStaticPaths() {
// Get all certification numbers
const certNumbers = await fetch('https://your-cms.com/api/coins?fields=certNumber');
return {
paths: certNumbers.map(cert => ({ params: { certNumber: cert } })),
fallback: 'blocking'
};
}
export async function getStaticProps({ params }) {
const coin = await fetch(`https://your-cms.com/api/coins?certNumber=${params.certNumber}`);
return { props: { coin }, revalidate: 3600 }; // Update hourly
}Search That Actually Works
Finding specific coins means smart search:
- Elasticsearch indexes every auction description
- Custom filters for certification numbers, dates, grading services
- Image similarity search finds matching photos across sites
What I Learned the Hard Way
After months of building, these lessons stood out:
- Design your data model first: Map out how coins connect to auctions, certifications, and owners before importing anything.
- Automate the boring stuff: Scraping and AI extraction saved me weeks of manual work.
- Experts still matter most: No system replaces decades of numismatic knowledge. Make their insights easy to share.
- Speed is king: When you’re showing thousands of high-res images, Jamstack with proper optimization is non-negotiable.
- Stay flexible: The headless approach means I can add new sources and interfaces as needs change.
The Big Picture
This CMS isn’t just about organizing data – it’s about making coin history accessible. Some key takeaways:
- Contentful if you need robust media handling and have budget
- Strapi when you need to customize everything
- Sanity.io for real-time collaboration
- Jamstack + Next.js for speed with large image collections
- AI tools that cut through the manual data entry
The result? A living research tool that connects auction records, certification details, expert knowledge, and collector insights in one place. And while I built this for numismatics, the same approach works for any specialized research area with scattered historical data.
Related Resources
You might also find these related articles helpful:
- How I Built a High-Converting B2B Lead Generation Funnel Using AI and Auction Provenance Data – Let me tell you a secret: I’m a developer, not a marketer. Yet I built a B2B lead generation engine that brings in…
- How AI and Auction Provenance Research Are Powering the Next Gen of Real Estate Software – Real estate is changing fast. New tech is doing more than just digitizing old processes – it’s making property his…
- A Manager’s Blueprint: Onboarding Teams to Research Auction Histories and Provenances Efficiently – Getting your team up to speed on auction history and provenance research? It’s not just about access to data — it’s abou…