Updated May 2025

The BCS Top 100™

Our comprehensive ranking of the top 100 funding providers in the United States, helping you find the perfect match for your financial needs.

Get Our Free Top 10 Business Lenders PDF

Delivered instantly to your inbox. No spam.

Filter Results

Our Ranking Methodology

The BCS Top 100™ represents the top funding providers across multiple lending categories, evaluated using our proprietary methodology that considers over 30 different factors.

Interest Rates
Fee Transparency
Customer Reviews
Approval Speed
Customer Support
Product Security
Digital Experience
Term Flexibility
Advertisement

📊 Free Lender Guide → Enter email

if (window.BCS_LEAD_ENDPOINT) { try { const response = await fetch(window.BCS_LEAD_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(leadPayload) }); if (!response.ok) { throw new Error(`Lead endpoint responded with ${response.status}`); } } catch (error) { queueLead(leadPayload); } } else { queueLead(leadPayload); } showCaptureSuccess(normalized); } const isAdminView = new URLSearchParams(window.location.search).get('admin') === '1'; if (isAdminView && exportLeadsBtn) { exportLeadsBtn.classList.remove('hidden'); exportLeadsBtn.addEventListener('click', downloadQueuedLeadsCsv); } const savedEmail = localStorage.getItem(EMAIL_STORAGE_KEY); if (savedEmail) { showCaptureSuccess(savedEmail); } if (localStorage.getItem(BANNER_DISMISSED_KEY) === 'true' && mobileEmailBanner) { mobileEmailBanner.classList.add('hidden'); } if (topEmailForm) { topEmailForm.addEventListener('submit', async function(e) { e.preventDefault(); if (!topEmailInput || !topEmailInput.checkValidity()) { topEmailInput?.reportValidity(); return; } await submitEmailCapture(topEmailInput.value.trim()); }); } if (mobileEmailForm) { mobileEmailForm.addEventListener('submit', async function(e) { e.preventDefault(); if (!mobileEmailInput || !mobileEmailInput.checkValidity()) { mobileEmailInput?.reportValidity(); return; } await submitEmailCapture(mobileEmailInput.value.trim()); }); } if (mobileDismissBtn && mobileEmailBanner) { mobileDismissBtn.addEventListener('click', function() { mobileEmailBanner.classList.add('hidden'); localStorage.setItem(BANNER_DISMISSED_KEY, 'true'); }); } // Global variables for pagination - declare with window to ensure global scope window.itemsPerPage = 10; let allLenders = []; // Compare state window.compareSelected = new Map(); initializeCompareUI(); // Check URL for page parameter const urlParams = new URLSearchParams(window.location.search); const pageParam = urlParams.get('page'); const parsedPage = pageParam ? parseInt(pageParam, 10) : 1; window.currentPage = Number.isFinite(parsedPage) && parsedPage > 0 ? parsedPage : 1; // Handle browser back/forward button window.addEventListener('popstate', function(event) { if (event.state && event.state.page) { window.currentPage = event.state.page; displayLenders(allLenders, window.currentPage, window.itemsPerPage); renderPagination(Math.ceil(allLenders.length / window.itemsPerPage)); } }); // Initialize browser history if (!pageParam) { history.replaceState({ page: 1 }, '', '?page=1'); } // Use hard-coded lender data as a fallback const fallbackLenders = [ { "id": "chase", "name": "Chase Bank", "category": "Business Loans", "rating": 4.7, "reviews": 3250, "creditMin": 680, "maxFunding": 5000000, "approvalTime": "2-5 days", "features": ["SBA Preferred Lender", "Business Lines of Credit", "Equipment Financing"], "affiliateLink": "", "betterList100": true, "featured": true, "slug": "chase-bank", "website": "https://www.chase.com/business/loans" }, { "id": "bank-of-america", "name": "Bank of America", "category": "Business Loans", "rating": 4.5, "reviews": 2800, "creditMin": 670, "maxFunding": 5000000, "approvalTime": "3-7 days", "features": ["SBA Loans", "Commercial Real Estate Loans", "Term Loans"], "affiliateLink": "", "betterList100": true, "featured": false, "slug": "bank-of-america", "website": "https://www.bankofamerica.com/smallbusiness/business-financing/" }, { "id": "american-express", "name": "American Express", "category": "Credit Cards", "rating": 4.9, "reviews": 4800, "creditMin": 700, "maxFunding": 250000, "approvalTime": "1-2 days", "features": ["Business Platinum Card", "Blue Business Cash Card", "Membership Rewards"], "affiliateLink": "", "betterList100": true, "featured": true, "slug": "american-express", "website": "https://www.americanexpress.com/us/credit-cards/business/business-credit-cards/" } ]; console.log('Fetching lender data from API...'); try { // Try actual API call first // Prefer static JSON on static hosting (Vercel/GitHub Pages) const response = await fetch('/data/lenders.json'); if (response.ok) { allLenders = await response.json(); console.log('Successfully loaded API data:', allLenders); // DEBUGGING: Let's filter for betterList100: true only, as this might be implicit allLenders = allLenders.filter(lender => lender.betterList100 === true); console.log(`After filtering for BCS Top 100, we have ${allLenders.length} lenders`); // Count lenders on page 10 const startIdx = 9 * window.itemsPerPage; // 0-indexed, so page 10 starts at index 90 const endIdx = Math.min(startIdx + window.itemsPerPage, allLenders.length); const page10Lenders = allLenders.slice(startIdx, endIdx); console.log(`Page 10 (indexes ${startIdx}-${endIdx-1}) has ${page10Lenders.length} lenders:`, page10Lenders.map(l => l.name)); } else { throw new Error('API responded with an error'); } } catch (apiError) { console.error('API fetch error:', apiError); allLenders = fallbackLenders; // Use fallback data on error } window.allLenders = allLenders; // Only proceed if we have lenders if (allLenders && allLenders.length > 0) { // Display current page of lenders displayLenders(allLenders, window.currentPage, window.itemsPerPage); // Setup pagination setupPagination(allLenders, window.itemsPerPage); // Setup filters setupFilters(allLenders); } else { // Handle the case where no data was loaded document.getElementById('desktop-lender-list').innerHTML = '
Error loading lender data. Please try again later.
'; document.getElementById('mobile-lender-list').innerHTML = '
Error loading lender data. Please try again later.
'; } }); function displayLenders(lenders, page, itemsPerPage) { const desktopContainer = document.getElementById('desktop-lender-list'); const mobileContainer = document.getElementById('mobile-lender-list'); // Clear the containers desktopContainer.innerHTML = ''; mobileContainer.innerHTML = ''; // Normalize page bounds const totalPages = Math.max(1, Math.ceil(lenders.length / itemsPerPage)); const safePage = Math.min(Math.max(1, Number(page) || 1), totalPages); window.currentPage = safePage; // Calculate start and end indices const startIndex = (safePage - 1) * itemsPerPage; const endIndex = Math.min(startIndex + itemsPerPage, lenders.length); // Get current page lenders const currentLenders = lenders.slice(startIndex, endIndex); // Create and append lender elements currentLenders.forEach((lender, index) => { const rankNumber = startIndex + index + 1; // Create desktop row (table format) const desktopRow = createDesktopLenderRow(lender, rankNumber); desktopContainer.appendChild(desktopRow); // Create mobile card const mobileCard = createMobileLenderCard(lender, rankNumber); mobileContainer.appendChild(mobileCard); // Insert in-feed ads after every 5 items if ((index + 1) % 5 === 0 && index < currentLenders.length - 1) { // Desktop in-feed ad const desktopAdRow = document.createElement('div'); desktopAdRow.className = 'p-4 bg-neutral-50 border-b border-neutral-200'; desktopAdRow.innerHTML = `
Advertisement
`; desktopContainer.appendChild(desktopAdRow); // Mobile in-feed ad const mobileAdCard = document.createElement('div'); mobileAdCard.className = 'bg-neutral-50 rounded-lg p-4'; mobileAdCard.innerHTML = `
Advertisement
`; mobileContainer.appendChild(mobileAdCard); } }); syncCompareCheckboxes(); updateCompareBar(); } function setupPagination(lenders, itemsPerPage) { const paginationContainer = document.getElementById('pagination-container'); paginationContainer.innerHTML = ''; // Calculate total pages const totalPages = Math.ceil(lenders.length / itemsPerPage); // Don't show pagination if only one page if (totalPages <= 1) { return; } // Previous button const prevButton = document.createElement('li'); prevButton.className = 'mx-1'; prevButton.innerHTML = ` `; prevButton.addEventListener('click', function(e) { e.preventDefault(); if (window.currentPage > 1) { window.currentPage--; // Update URL and browser history history.pushState({ page: window.currentPage }, '', `?page=${window.currentPage}`); displayLenders(lenders, window.currentPage, itemsPerPage); renderPagination(totalPages); // Scroll to top of page for better user experience window.scrollTo({ top: 0, behavior: 'smooth' }); } }); paginationContainer.appendChild(prevButton); // Initial render of pagination buttons renderPagination(totalPages); // Next button const nextButton = document.createElement('li'); nextButton.className = 'mx-1'; nextButton.innerHTML = ` `; nextButton.addEventListener('click', function(e) { e.preventDefault(); if (window.currentPage < totalPages) { window.currentPage++; // Update URL and browser history history.pushState({ page: window.currentPage }, '', `?page=${window.currentPage}`); displayLenders(lenders, window.currentPage, itemsPerPage); renderPagination(totalPages); // Scroll to top of page for better user experience window.scrollTo({ top: 0, behavior: 'smooth' }); } }); paginationContainer.appendChild(nextButton); // Function to render the pagination with sliding window function renderPagination(totalPages) { // Remove all existing page buttons const existingButtons = paginationContainer.querySelectorAll('li:not(:first-child):not(:last-child)'); existingButtons.forEach(button => button.remove()); // Show a sliding window of page numbers (maximum 5 at a time) const maxVisiblePages = 5; let startPage = Math.max(1, window.currentPage - Math.floor(maxVisiblePages / 2)); let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1); // Adjust start page if we're near the end if (endPage - startPage + 1 < maxVisiblePages) { startPage = Math.max(1, endPage - maxVisiblePages + 1); } // First page with ellipsis if needed if (startPage > 1) { const firstPageButton = createPageButton(1, lenders); paginationContainer.insertBefore(firstPageButton, paginationContainer.lastChild); if (startPage > 2) { const ellipsisStart = document.createElement('li'); ellipsisStart.className = 'mx-1'; ellipsisStart.innerHTML = ` ... `; paginationContainer.insertBefore(ellipsisStart, paginationContainer.lastChild); } } // Visible page buttons for (let i = startPage; i <= endPage; i++) { const pageButton = createPageButton(i, lenders); paginationContainer.insertBefore(pageButton, paginationContainer.lastChild); } // Last page with ellipsis if needed if (endPage < totalPages) { if (endPage < totalPages - 1) { const ellipsisEnd = document.createElement('li'); ellipsisEnd.className = 'mx-1'; ellipsisEnd.innerHTML = ` ... `; paginationContainer.insertBefore(ellipsisEnd, paginationContainer.lastChild); } const lastPageButton = createPageButton(totalPages, lenders); paginationContainer.insertBefore(lastPageButton, paginationContainer.lastChild); } } // Helper function to create a page button function createPageButton(pageNum, lenders) { const pageButton = document.createElement('li'); pageButton.className = 'mx-1'; pageButton.innerHTML = ` ${pageNum} `; pageButton.addEventListener('click', function(e) { e.preventDefault(); window.currentPage = pageNum; // Update URL and browser history history.pushState({ page: window.currentPage }, '', `?page=${window.currentPage}`); displayLenders(lenders, window.currentPage, itemsPerPage); renderPagination(totalPages); // Scroll to top of page for better user experience window.scrollTo({ top: 0, behavior: 'smooth' }); }); return pageButton; } } function getLenderBadges(lender) { const badges = []; const approvalTime = (lender.approvalTime || '').toString().toLowerCase(); const featuresText = Array.isArray(lender.features) ? lender.features.join(' ').toLowerCase() : ''; const minCreditScore = Number.isFinite(Number(lender.minCreditScore)) ? Number(lender.minCreditScore) : Number.isFinite(Number(lender.creditMin)) ? Number(lender.creditMin) : null; if (approvalTime.includes('24') || approvalTime.includes('same day')) { badges.push({ label: 'Fastest Funding', classes: 'bg-green-100 text-green-700' }); } if (featuresText.includes('startup') || featuresText.includes('new business')) { badges.push({ label: 'Best for Startups', classes: 'bg-purple-100 text-purple-700' }); } if ((minCreditScore !== null && minCreditScore <= 550) || featuresText.includes('bad credit')) { badges.push({ label: 'Best for Bad Credit', classes: 'bg-orange-100 text-orange-700' }); } if (featuresText.includes('no collateral')) { badges.push({ label: 'No Collateral', classes: 'bg-blue-100 text-blue-700' }); } if ((lender.category || '') === 'SBA Loans') { badges.push({ label: 'SBA Approved', classes: 'bg-yellow-100 text-yellow-700' }); } return badges; } function renderBadgePills(lender) { const badges = getLenderBadges(lender); if (!badges.length) return ''; return `
${badges.map(badge => ` ${badge.label} `).join('')}
`; } function createDesktopLenderRow(lender, rank) { const row = document.createElement('div'); row.className = 'p-4 grid grid-cols-12 gap-4 items-center lender-row'; row.setAttribute('data-category', lender.category); // Get two feature items to display const featuresDisplay = lender.features.slice(0, 2).map(feature => `
${feature}
` ).join(''); // Generate stars based on rating const stars = generateStarRating(lender.rating); const badgesHtml = renderBadgePills(lender); row.innerHTML = `
${rank}
${lender.name}
${badgesHtml}
BCS TOP 100™
${lender.category}
${stars}
${lender.rating.toFixed(1)}
${featuresDisplay}
`; return row; } function createMobileLenderCard(lender, rank) { const card = document.createElement('div'); card.className = 'p-4 border border-neutral-200 rounded-lg lender-card'; card.setAttribute('data-category', lender.category); // Generate stars based on rating const stars = generateStarRating(lender.rating); const badgesHtml = renderBadgePills(lender); // Format features as list items const featuresList = lender.features.slice(0, 3).map(feature => `
${feature}
` ).join(''); card.innerHTML = `
${rank}
${lender.name}
${badgesHtml}
BCS TOP 100™ ${lender.category}
${stars}
${featuresList}
Min: ${lender.creditMin}+ credit
${lender.approvalTime}
`; return card; } function generateStarRating(rating) { const fullStars = Math.floor(rating); const hasHalfStar = rating % 1 >= 0.5; const emptyStars = 5 - fullStars - (hasHalfStar ? 1 : 0); let starsHtml = ''; // Add full stars for (let i = 0; i < fullStars; i++) { starsHtml += ''; } // Add half star if needed if (hasHalfStar) { starsHtml += ''; } // Add empty stars for (let i = 0; i < emptyStars; i++) { starsHtml += ''; } return starsHtml; } function initializeCompareUI() { const compareNowBtn = document.getElementById('compare-now'); const clearBtn = document.getElementById('compare-clear'); const closeBtn = document.getElementById('compare-close'); const modalOverlay = document.getElementById('compare-modal-overlay'); document.addEventListener('change', (event) => { if (!event.target.classList.contains('compare-checkbox')) return; const checkbox = event.target; const lenderId = checkbox.dataset.lenderId; const lenderName = checkbox.dataset.lenderName; if (checkbox.checked) { if (window.compareSelected.size >= 3) { checkbox.checked = false; return; } window.compareSelected.set(lenderId, lenderName); } else { window.compareSelected.delete(lenderId); } syncCompareCheckboxes(); updateCompareBar(); }); compareNowBtn?.addEventListener('click', openCompareModal); clearBtn?.addEventListener('click', clearCompareSelection); closeBtn?.addEventListener('click', closeCompareModal); modalOverlay?.addEventListener('click', closeCompareModal); document.addEventListener('keydown', (event) => { if (event.key === 'Escape') closeCompareModal(); }); } function syncCompareCheckboxes() { const selectedIds = new Set(window.compareSelected.keys()); document.querySelectorAll('.compare-checkbox').forEach((checkbox) => { checkbox.checked = selectedIds.has(checkbox.dataset.lenderId); checkbox.disabled = !checkbox.checked && selectedIds.size >= 3; }); } function updateCompareBar() { const compareBar = document.getElementById('compare-bar'); const namesContainer = document.getElementById('compare-selected-names'); const compareNowBtn = document.getElementById('compare-now'); const selectedNames = Array.from(window.compareSelected.values()); const count = selectedNames.length; namesContainer.textContent = selectedNames.join(' • ') || 'No lenders selected'; compareNowBtn.disabled = count < 2; compareNowBtn.classList.toggle('opacity-50', count < 2); compareNowBtn.classList.toggle('cursor-not-allowed', count < 2); if (count >= 2) { compareBar.classList.remove('hidden'); } else { compareBar.classList.add('hidden'); } } async function openCompareModal() { if (window.compareSelected.size < 2) return; const selectedIds = Array.from(window.compareSelected.keys()); const lenders = await getAllTopLenders(); const selectedLenders = lenders.filter((lender) => selectedIds.includes(lender.id)).slice(0, 3); if (selectedLenders.length < 2) return; renderCompareTable(selectedLenders); const modal = document.getElementById('compare-modal'); modal.classList.remove('hidden'); modal.setAttribute('aria-hidden', 'false'); document.body.classList.add('overflow-hidden'); } function closeCompareModal() { const modal = document.getElementById('compare-modal'); modal.classList.add('hidden'); modal.setAttribute('aria-hidden', 'true'); document.body.classList.remove('overflow-hidden'); } function clearCompareSelection() { window.compareSelected.clear(); syncCompareCheckboxes(); updateCompareBar(); closeCompareModal(); } function renderCompareTable(selectedLenders) { const table = document.getElementById('compare-table'); const headCells = selectedLenders.map(l => `${l.name}`).join(''); const rows = [ { label: 'Name', value: (l) => l.name }, { label: 'Category', value: (l) => l.category || '—' }, { label: 'Rating', value: (l) => typeof l.rating === 'number' ? l.rating.toFixed(1) : '—' }, { label: 'Min Credit Score', value: (l) => l.creditMin ? `${l.creditMin}+` : '—' }, { label: 'Approval Time', value: (l) => l.approvalTime || '—' }, { label: 'Top 3 Features', value: (l) => (l.features || []).slice(0, 3).join(', ') || '—' } ]; table.innerHTML = ` Field ${headCells} ${rows.map(row => ` ${row.label} ${selectedLenders.map(l => `${row.value(l)}`).join('')} `).join('')} `; } async function getAllTopLenders() { if (Array.isArray(window.allLenders) && window.allLenders.length) { return window.allLenders; } try { const response = await fetch('/data/lenders.json'); if (!response.ok) throw new Error('Fetch failed'); const lenders = await response.json(); return lenders.filter(lender => lender.betterList100 === true); } catch (error) { return []; } } function normalizeApprovalDays(approvalTime) { const value = String(approvalTime || '').toLowerCase(); if (!value) return null; if (value.includes('same day') || value.includes('same-day') || value.includes('same_day')) return 0; if (value.includes('24-48') || value.includes('24 to 48')) return 2; if (value.includes('24 hour') || value.includes('24hr') || value.includes('24 hr')) return 1; if (value.includes('48 hour') || value.includes('48hr') || value.includes('48 hr')) return 2; const dayRangeMatch = value.match(/(\d+)\s*[-–]\s*(\d+)\s*day/); if (dayRangeMatch) return Number(dayRangeMatch[2]); const hourRangeMatch = value.match(/(\d+)\s*[-–]\s*(\d+)\s*hour/); if (hourRangeMatch) return Math.ceil(Number(hourRangeMatch[2]) / 24); const singleDayMatch = value.match(/(\d+)\s*day/); if (singleDayMatch) return Number(singleDayMatch[1]); return null; } function matchesFundingAmountFilter(lender, selectedFundingAmount) { if (selectedFundingAmount === 'all') return true; const lenderMaxFunding = Number(lender.maxFunding); if (!Number.isFinite(lenderMaxFunding)) return false; switch (selectedFundingAmount) { case 'lte-50000': return lenderMaxFunding <= 50000; case 'lte-100000': return lenderMaxFunding <= 100000; case 'lte-250000': return lenderMaxFunding <= 250000; case 'lte-1000000': return lenderMaxFunding <= 1000000; case 'gt-1000000': return lenderMaxFunding > 1000000; default: return true; } } function matchesFundingSpeedFilter(lender, selectedFundingSpeed) { if (selectedFundingSpeed === 'all') return true; const maxDays = normalizeApprovalDays(lender.approvalTime); if (maxDays === null) return false; switch (selectedFundingSpeed) { case 'same-day': return maxDays === 0; case '24-48h': return maxDays > 0 && maxDays <= 2; case '3-7-days': return maxDays >= 3 && maxDays <= 7; case '7-plus-days': return maxDays > 7; default: return true; } } function setupFilters(allLenders) { const categoryFilter = document.getElementById('category-filter'); const creditScoreFilter = document.getElementById('credit-score-filter'); const fundingAmountFilter = document.getElementById('funding-amount-filter'); const fundingSpeedFilter = document.getElementById('funding-speed-filter'); const sortOrder = document.getElementById('sort-order'); const searchInput = document.querySelector('input[placeholder="Search lenders..."]'); const resetToFirstPageAndFilter = () => { window.currentPage = 1; filterAndSortLenders(allLenders); }; categoryFilter.addEventListener('change', resetToFirstPageAndFilter); creditScoreFilter.addEventListener('change', resetToFirstPageAndFilter); fundingAmountFilter.addEventListener('change', resetToFirstPageAndFilter); fundingSpeedFilter.addEventListener('change', resetToFirstPageAndFilter); sortOrder.addEventListener('change', () => { filterAndSortLenders(allLenders); }); searchInput.addEventListener('input', resetToFirstPageAndFilter); // Initial filtering and sorting filterAndSortLenders(allLenders); } function filterAndSortLenders(allLenders) { const categoryFilter = document.getElementById('category-filter'); const creditScoreFilter = document.getElementById('credit-score-filter'); const fundingAmountFilter = document.getElementById('funding-amount-filter'); const fundingSpeedFilter = document.getElementById('funding-speed-filter'); const sortOrder = document.getElementById('sort-order'); const searchInput = document.querySelector('input[placeholder="Search lenders..."]'); const selectedCategory = categoryFilter.value; const selectedCreditScore = creditScoreFilter.value; const selectedFundingAmount = fundingAmountFilter.value; const selectedFundingSpeed = fundingSpeedFilter.value; const selectedSortOption = sortOrder.value; const searchQuery = searchInput.value.toLowerCase(); // Apply all filters with AND behavior let filteredLenders = [...allLenders].filter((lender) => { const lenderCategory = lender.category || ''; const lenderName = lender.name || ''; const lenderCreditMin = Number.isFinite(Number(lender.creditMin)) ? Number(lender.creditMin) : null; const categoryMatches = selectedCategory === 'all' || lenderCategory === selectedCategory; const creditScoreMatches = selectedCreditScore === 'all' || (lenderCreditMin !== null && lenderCreditMin >= Number(selectedCreditScore)); const fundingAmountMatches = matchesFundingAmountFilter(lender, selectedFundingAmount); const fundingSpeedMatches = matchesFundingSpeedFilter(lender, selectedFundingSpeed); const searchMatches = !searchQuery || lenderName.toLowerCase().includes(searchQuery) || lenderCategory.toLowerCase().includes(searchQuery); return categoryMatches && creditScoreMatches && fundingAmountMatches && fundingSpeedMatches && searchMatches; }); // Keep existing sort behavior intact switch (selectedSortOption) { case 'rating': filteredLenders.sort((a, b) => b.rating - a.rating); break; case 'az': filteredLenders.sort((a, b) => a.name.localeCompare(b.name)); break; case 'za': filteredLenders.sort((a, b) => b.name.localeCompare(a.name)); break; case 'rank': default: // Already in rank order from the API (we assume) break; } // Step 4: Update pagination and display current page setupPagination(filteredLenders, window.itemsPerPage); displayLenders(filteredLenders, window.currentPage, window.itemsPerPage); }