(function () { 'use strict'; const CONFIG = { scriptId: 'dynamic-specials-schema', debounceMs: 400, maxItems: 100 }; const MAKES = [ 'Acura','Alfa Romeo','Audi','BMW','Buick','Cadillac','Chevrolet', 'Chrysler','Dodge','FIAT','Ford','Genesis','GMC','Honda','Hyundai', 'INFINITI','Jaguar','Jeep','Kia','Land Rover','Lexus','Lincoln', 'Maserati','Mazda','Mercedes-Benz','MINI','Mitsubishi','Nissan', 'Porsche','Ram','Subaru','Tesla','Toyota','Volkswagen','Volvo' ]; function text(el) { return String( el ? (el.innerText || el.textContent || '') : '' ) .replace(/\u00a0/g, ' ') .replace(/\s+/g, ' ') .trim(); } function absUrl(url) { if (!url) return undefined; try { return new URL(url, location.href).href; } catch (e) { return undefined; } } function num(value) { if (value === undefined || value === null || value === '') { return undefined; } const match = String(value) .replace(/,/g, '') .match(/-?\d+(?:\.\d+)?/); if (!match) return undefined; const n = Number(match[0]); return Number.isFinite(n) ? Math.abs(n) : undefined; } function clean(obj) { if (!obj || typeof obj !== 'object') return obj; if (Array.isArray(obj)) { for (let i = obj.length - 1; i >= 0; i--) { const v = obj[i]; if (v === undefined || v === null || v === '') { obj.splice(i, 1); continue; } if (typeof v === 'object') { clean(v); if ( (Array.isArray(v) && !v.length) || (!Array.isArray(v) && !Object.keys(v).length) ) { obj.splice(i, 1); } } } return obj; } Object.keys(obj).forEach(function (key) { const v = obj[key]; if (v === undefined || v === null || v === '') { delete obj[key]; return; } if (typeof v === 'object') { clean(v); if ( (Array.isArray(v) && !v.length) || (!Array.isArray(v) && !Object.keys(v).length) ) { delete obj[key]; } } }); return obj; } function property(name, value, unitText) { if (value === undefined || value === null || value === '') { return undefined; } return clean({ '@type': 'PropertyValue', name: name, value: value, unitText: unitText }); } function extractVin(str) { const match = String(str || '').match( /\b(?:VIN\s*[:#-]?\s*)?([A-HJ-NPR-Z0-9]{17})\b/i ); return match ? match[1].toUpperCase() : undefined; } function extractStock(str) { const match = String(str || '').match( /\b(?:Stock|Stk)(?:\s*(?:#|Number|No\.?))?\s*[:#-]?\s*([A-Z0-9-]+)/i ); return match ? match[1] : undefined; } function extractOfferId(str) { const match = String(str || '').match( /\bOffer\s*(?:ID|Number)\s*[:#-]?\s*([A-Z0-9_-]+)/i ); return match ? match[1] : undefined; } function extractYear(str) { const match = String(str || '').match(/\b(20[0-4]\d)\b/); return match ? Number(match[1]) : undefined; } function extractMake(str) { str = String(str || ''); for (const make of MAKES) { const re = new RegExp( '\\b' + make.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '\\b', 'i' ); if (re.test(str)) { return make; } } return undefined; } function moneyAfter(str, labels) { for (const label of labels) { const re = new RegExp( label + '\\s*(?:price)?\\s*[:\\-]?\\s*\\$?\\s*([\\d,]+(?:\\.\\d{1,2})?)', 'i' ); const match = String(str || '').match(re); if (match) { return num(match[1]); } } return undefined; } function extractMsrp(str) { return moneyAfter(str, [ 'MSRP', 'List Price', 'Sticker Price', "Manufacturer'?s Suggested Retail Price" ]); } function extractSalePrice(str) { return moneyAfter(str, [ 'Sale Price', 'Special Price', 'Internet Price', 'Dealer Price', 'Our Price', 'Your Price', 'Selling Price', 'Final Price' ]); } function extractDiscount(str) { let value = moneyAfter(str, [ 'Off MSRP', 'Dealer Discount', 'Dealer Savings', 'Rairdon Discount', 'Savings', 'Discount' ]); if (Number.isFinite(value)) { return value; } const match = String(str || '').match( /\$([\d,]+(?:\.\d{1,2})?)\s*(?:off|below)\s*(?:of\s*)?MSRP/i ); return match ? num(match[1]) : undefined; } function extractApr(str) { let match = String(str || '').match( /(\d+(?:\.\d+)?)\s*%\s*APR/i ); if (!match) { match = String(str || '').match( /APR[^\d]{0,20}(\d+(?:\.\d+)?)\s*%/i ); } return match ? num(match[1]) : undefined; } function extractMonthlyPayment(str, type) { const source = String(str || ''); const re = type === 'lease' ? /(?:lease)[\s\S]{0,100}?\$([\d,]+(?:\.\d{1,2})?)\s*(?:\/|per\s*)?(?:mo|month)/i : /(?:finance|financing)[\s\S]{0,100}?\$([\d,]+(?:\.\d{1,2})?)\s*(?:\/|per\s*)?(?:mo|month)/i; const match = source.match(re); return match ? num(match[1]) : undefined; } function extractTerm(str, type) { const source = String(str || ''); const re = type === 'lease' ? /lease[\s\S]{0,100}?(\d{1,3})\s*(?:months?|mos?\.?)/i : /(?:finance|financing)[\s\S]{0,100}?(\d{1,3})\s*(?:months?|mos?\.?)/i; const match = source.match(re); return match ? num(match[1]) : undefined; } function extractDueAtSigning(str) { const match = String(str || '').match( /\$([\d,]+(?:\.\d{1,2})?)\s*(?:due at signing|due at lease signing)/i ); return match ? num(match[1]) : undefined; } function extractExpiration(str) { const source = String(str || ''); const patterns = [ /(?:expires?|expiration|valid through|ends?)\s*[:\-]?\s*(\d{1,2}\/\d{1,2}\/20\d{2})/i, /(?:expires?|expiration|valid through|ends?)\s*[:\-]?\s*([A-Za-z]+\s+\d{1,2},?\s+20\d{2})/i, /(?:expires?|expiration|valid through|ends?)\s*[:\-]?\s*(20\d{2}-\d{1,2}-\d{1,2})/i ]; for (const re of patterns) { const match = source.match(re); if (!match) continue; const date = new Date(match[1]); if (Number.isNaN(date.getTime())) continue; return [ date.getFullYear(), String(date.getMonth() + 1).padStart(2, '0'), String(date.getDate()).padStart(2, '0') ].join('-'); } return undefined; } function extractRebates(str) { const output = []; const source = String(str || ''); const re = /([A-Za-z0-9][A-Za-z0-9 '&\/()-]{2,80}?(?:Rebate|Bonus Cash|Consumer Cash|Cash Allowance|Incentive))\s*[:\-]?\s*\$([\d,]+(?:\.\d{1,2})?)/gi; let match; while ((match = re.exec(source)) !== null) { const name = match[1].trim(); const amount = num(match[2]); if ( name && Number.isFinite(amount) && !output.some(function (r) { return r.name.toLowerCase() === name.toLowerCase(); }) ) { output.push({ name: name, amount: amount }); } } return output; } function bestHeading(card) { const headings = card.querySelectorAll( 'h1,h2,h3,h4,[class*="title"],[class*="name"]' ); for (const heading of headings) { const value = text(heading); if ( value.length >= 5 && value.length <= 150 && ( /\b20\d{2}\b/.test(value) || extractMake(value) ) ) { return value; } } return undefined; } function bestImage(card) { const images = Array.from(card.querySelectorAll('img')); const candidates = images .map(function (img) { return { url: absUrl( img.currentSrc || img.src || img.getAttribute('data-src') || img.getAttribute('data-lazy-src') ), size: (img.naturalWidth || img.width || 0) * (img.naturalHeight || img.height || 0) }; }) .filter(function (item) { return ( item.url && !/logo|icon|pixel|spinner/i.test(item.url) ); }) .sort(function (a, b) { return b.size - a.size; }); return candidates.length ? candidates[0].url : undefined; } function bestUrl(card) { const links = Array.from(card.querySelectorAll('a[href]')); for (const link of links) { const label = text(link); if ( /vehicle details|view details|see details|view vehicle/i.test(label) ) { return absUrl(link.getAttribute('href')); } } for (const link of links) { const href = absUrl(link.getAttribute('href')); if ( href && /\/(?:new|used|inventory|vehicle)[^?#]*\//i.test(href) ) { return href; } } return undefined; } function getDealer() { const scripts = document.querySelectorAll( 'script[type="application/ld+json"]' ); for (const script of scripts) { if (script.id === CONFIG.scriptId) continue; try { let data = JSON.parse(script.textContent); let items = []; if (Array.isArray(data)) { items = data; } else if (Array.isArray(data['@graph'])) { items = data['@graph']; } else { items = [data]; } const dealer = items.find(function (item) { const type = item && item['@type']; return ( type === 'AutoDealer' || type === 'AutomotiveBusiness' || type === 'LocalBusiness' ); }); if (dealer) { return clean({ '@type': dealer['@type'] || 'AutoDealer', '@id': dealer['@id'], name: dealer.name, url: dealer.url || location.origin + '/', telephone: dealer.telephone, address: dealer.address }); } } catch (e) {} } const ogSite = document.querySelector( 'meta[property="og:site_name"]' ); return { '@type': 'AutoDealer', name: ogSite?.content || document.title.split('|')[0].trim(), url: location.origin + '/' }; } function scoreCard(el) { const value = text(el); if ( value.length < 40 || value.length > 10000 ) { return 0; } let score = 0; if (extractVin(value)) score += 6; if (extractStock(value)) score += 1; if (extractYear(value)) score += 1; if (extractMake(value)) score += 1; if (/\bMSRP\b/i.test(value)) score += 2; if ( /sale price|special price|internet price|our price/i.test(value) ) { score += 2; } if ( /\blease\b|\bAPR\b|\bfinance\b/i.test(value) ) { score += 2; } if ( /rebate|bonus cash|discount|off MSRP|savings/i.test(value) ) { score += 2; } if (el.querySelector('img')) score += 1; if (el.querySelector('a[href]')) score += 1; return score; } function findCards() { const selectors = [ 'article', '[class*="special"]', '[class*="offer"]', '[class*="vehicle"]', '[class*="card"]', '[class*="result"]', '[class*="listing"]', '[data-vin]', '[data-vehicle]' ].join(','); const all = Array.from( document.querySelectorAll(selectors) ); const candidates = all .map(function (el) { return { el: el, score: scoreCard(el) }; }) .filter(function (item) { return item.score >= 5; }); return candidates .filter(function (item) { return !candidates.some(function (other) { return ( other !== item && item.el.contains(other.el) && other.score >= item.score - 1 ); }); }) .map(function (item) { return item.el; }) .slice(0, CONFIG.maxItems); } function parseCard(card) { const value = text(card); const name = bestHeading(card); const vin = card.dataset.vin || card.dataset.offerVin || extractVin(value); const stock = card.dataset.stock || card.dataset.stockNumber || extractStock(value); const offerId = card.dataset.offerId || extractOfferId(value); const year = Number(card.dataset.year) || extractYear(name || value); const make = card.dataset.make || card.dataset.offerMake || extractMake(name || value); const model = card.dataset.model || card.dataset.offerModel || undefined; const trim = card.dataset.trim || card.dataset.offerTrim || undefined; let msrp = num( card.dataset.msrp || card.dataset.offerMsrp ) || extractMsrp(value); let salePrice = num( card.dataset.salePrice || card.dataset.price || card.dataset.offerSalePrice ) || extractSalePrice(value); let offMsrp = num( card.dataset.offMsrp || card.dataset.offerOffMsrp ) || extractDiscount(value); if ( !Number.isFinite(offMsrp) && Number.isFinite(msrp) && Number.isFinite(salePrice) && msrp > salePrice ) { offMsrp = msrp - salePrice; } return { name: name, vin: vin, stock: stock, offerId: offerId, year: year, make: make, model: model, trim: trim, msrp: msrp, salePrice: salePrice, offMsrp: offMsrp, apr: extractApr(value), financePayment: extractMonthlyPayment(value, 'finance'), financeTerm: extractTerm(value, 'finance'), leasePayment: extractMonthlyPayment(value, 'lease'), leaseTerm: extractTerm(value, 'lease'), leaseDue: extractDueAtSigning(value), rebates: extractRebates(value), expiration: extractExpiration(value), image: bestImage(card), url: bestUrl(card), description: value }; } function buildVehicle(data, dealer) { const properties = [ property('Offer ID', data.offerId), property('Stock Number', data.stock), property('MSRP', data.msrp, 'USD'), property('Sale Price', data.salePrice, 'USD'), property('Amount Off MSRP', data.offMsrp, 'USD'), property('Finance APR', data.apr, 'Percent'), property( 'Finance Monthly Payment', data.financePayment, 'USD per month' ), property( 'Finance Term', data.financeTerm, 'Months' ), property( 'Lease Monthly Payment', data.leasePayment, 'USD per month' ), property( 'Lease Term', data.leaseTerm, 'Months' ), property( 'Lease Due At Signing', data.leaseDue, 'USD' ) ].filter(Boolean); data.rebates.forEach(function (rebate) { properties.push( property( rebate.name, rebate.amount, 'USD' ) ); }); let offer; if (Number.isFinite(data.salePrice)) { offer = clean({ '@type': 'Offer', price: data.salePrice, priceCurrency: 'USD', priceValidUntil: data.expiration, availability: 'https://schema.org/InStock', itemCondition: 'https://schema.org/NewCondition', url: data.url || location.href, seller: dealer }); } return clean({ '@type': 'Vehicle', '@id': data.vin ? ( (data.url || location.href.split('#')[0]) + '#vehicle-' + encodeURIComponent(data.vin) ) : undefined, name: data.name, url: data.url || location.href, image: data.image, vehicleIdentificationNumber: data.vin, sku: data.stock, modelDate: data.year, manufacturer: data.make ? { '@type': 'Organization', name: data.make } : undefined, brand: data.make ? { '@type': 'Brand', name: data.make } : undefined, model: data.model, vehicleConfiguration: data.trim, itemCondition: 'https://schema.org/NewCondition', offers: offer, additionalProperty: properties }); } function buildSchema() { const dealer = getDealer(); const cards = findCards(); const parsed = cards .map(parseCard) .filter(function (data) { return ( data.vin || ( data.year && data.make && data.name ) ); }); const seen = new Set(); const vehicles = parsed .filter(function (data) { const key = data.offerId ? 'offer:' + data.offerId : data.vin ? 'vin:' + data.vin : data.name; if (seen.has(key)) { return false; } seen.add(key); return true; }) .map(function (data) { return buildVehicle(data, dealer); }); if (!vehicles.length) { return null; } const listId = location.origin + location.pathname + '#vehicle-specials'; return { '@context': 'https://schema.org', '@graph': [ { '@type': 'CollectionPage', '@id': location.origin + location.pathname + '#webpage', url: location.href.split('#')[0], name: document.title, mainEntity: { '@id': listId } }, { '@type': 'ItemList', '@id': listId, name: 'Current Vehicle Specials', numberOfItems: vehicles.length, itemListElement: vehicles.map(function (vehicle, index) { return { '@type': 'ListItem', position: index + 1, url: vehicle.url, item: vehicle }; }) } ] }; } function updateSchema() { const schema = buildSchema(); if (!schema) return; let script = document.getElementById(CONFIG.scriptId); if (!script) { script = document.createElement('script'); script.id = CONFIG.scriptId; script.type = 'application/ld+json'; document.head.appendChild(script); } const json = JSON.stringify(schema); if (script.textContent !== json) { script.textContent = json; } } let timer; function refresh() { clearTimeout(timer); timer = setTimeout( updateSchema, CONFIG.debounceMs ); } function boot() { refresh(); const observer = new MutationObserver(function (mutations) { const changed = mutations.some(function (mutation) { return ( !mutation.target.closest || !mutation.target.closest( '#' + CONFIG.scriptId ) ); }); if (changed) { refresh(); } }); observer.observe( document.documentElement, { childList: true, subtree: true, characterData: true } ); window.__REFRESH_SPECIALS_SCHEMA__ = updateSchema; window.__GET_SPECIALS_SCHEMA__ = buildSchema; } if (document.readyState === 'loading') { document.addEventListener( 'DOMContentLoaded', boot ); } else { boot(); } })();

Find Your Vehicle

Hyundai Santa Fe driving down street

Rairdon's Hyundai of Bellingham

With a large inventory of new, used and certified pre-owned Hyundai models, an exceptional service department with state-of-the-art facilities, and a team of caring automotive professionals dedicated to you, Rairdon's Hyundai of Bellingham is here to service all of your Hyundai needs.

New
Inventory

view vehicles

Get
Pre-Approved

apply for credit

Schedule
Test Drive

make an appointment
Woman reading a book while sitting in the driver's side seat in a park vehicle

Find Your Ideal Hyundai

The perfect car or SUV is waiting for you at Rairdon's Hyundai of Bellingham.

Search Inventory
Close up of person adjusting a brake caliper

free brake inspection

We’ll inspect your brake pads, rotors, master cylinder, calipers and wheel cylinders, check your brake fluid level and parking brake, and even road test your Hyundai, all at no charge.

schedule appointment

customer reviews


Rairdon's Hyundai of Bellingham

Welcome to Rairdon's Hyundai of Bellingham Culture of Care

From the first contact, you deserve the utmost quality of customer care. Whether you are scheduling a service appointment, buying a vehicle, meeting with our finance team, or picking up an auto part, every point of communication should be better than the last. Here, you are treated better than any other dealership in Blaine. It goes beyond a concept, it is a way of life, one we call culture of care and it is our business model.

Rairdon’s Hyundai of Bellingham culture of care goes beyond our new Hyundai inventory and used vehicles. It extends to our service department, parts department, and auto detail center too.

It Is About The People That Work Here

Our exceptional team at Rairdon's Hyundai of Bellingham are your neighbors, friends, and family members. Your kids likely go to school with our kids. We sit at parent-teacher nights together, make cupcakes and cookies, and other baked goods for charities or volunteer events. Being connected is a huge part, and we want to build upon it within the community we serve.

From the Apostle Islands to Burlington and beyond, we take pride in knowing that our customer service is top quality, including automotive parts and accessories. Count on us to supply, install, and deliver whatever you need.

Count on us to provide the best car experience, whether you buy or lease a vehicle, visit for an oil change or tire rotation, get auto parts, and more. Our knowledgeable team members work together to perform any routine maintenance. Even our do-it-yourself customers get assistance with helpful DIY car advice from our team of Hyundai experts.

Therefore, you can also trust that our entire team will serve you with our culture of care.

Culture of Care Connection From Every Department

Count on excellent service from your first visit, our showroom floor, to your long-term service appointments and every connection in-between.

Count on a great selection of new Hyundai inventory to used cars, trucks, and SUVs for you to find the vehicle that best suits your lifestyle. Don’t hesitate to let us know by phone or contact us online. We are very responsive and will return a reply in a timely manner. Your time is valued here and the team is happy to assist in pairing you with the vehicle that you need and want.

At Rairdon's Hyundai of Bellingham, the car buying experience has been simplified and feels seamless. From the time you see the vehicle to the minute you take ownership, you have a partner through the sales experience.

If you have any questions, our sales team is on-hand to explain what is happening and next steps. After all, our goal is for you to become a satisfied long-term customer.

Once you have chosen the Hyundai that is right for you or one of our many used car, trucks, and SUV selections, we want to remain in your life. Our service department will help you maintain a healthy vehicle that will last you years to come. Our Hyundai offers are regularly updated so you save with new vehicle specials to service specials and more.

If your vehicle is in need of car repairs or replacements, you can trust that our service and parts department uses genuine manufacturer parts that fit your car precisely. Rest assured your vehicle warranty will not be voided due to non-Hyundai parts. Are you looking to customize your car, truck, or SUV? Our parts department has access to thousands of authentic Hyundai parts and accessories to personalize your vehicle.

Some Hyundai accessories include carpet savers and mats, car/SUV/truck covers, truck bed liners and toolboxes, off-road suspension and underbody protection kits, and more. Name it, and your Hyundai will be customized to your liking.

You’ll Feel the Rairdon Difference

When you hear about our culture of care, it goes beyond talking, it is a lifestyle. Here at Rairdon’s Hyundai in Bellingham, the way you think of dealerships has changed and along with the car buying experience. Your voice matters here and what you have to say is important.

As a part of your community, serving Burlington, our team knows all things Hyundai plus a variety of other brands’ vehicles too. On top of knowledge, efforts are always being made to be active within our community on various causes and events that matter to you.

It all comes down to our team – each and every one of us is committed to providing you with the best customer service and care no matter our role at the dealership!

If you are looking for a Hyundai Dealership near you that puts forth action behind their words then Rairdon's Hyundai of Bellingham is your Hyundai dealer of choice.

Welcome to Rairdon's Hyundai of Bellingham! Please call us, visit us, or contact us online to have us begin an unbeatable car experience today. We are here to help you with our culture of care! How best can you be served today?

Get Directions

1801 Iowa St, Bellingham, WA, 98229
Rairdon's Hyundai of Bellingham 48.7569555, -122.4504882.