Artemis now offers Participate Energy Prepaid Lease.
Learn more →
Designs

Everything included.
No add-ons.
No hidden fees.

With Artemis, every feature is included by default, because speed and accuracy shouldn’t cost extra.

Get a  demo
100
designs/month
$7.13
per design
1 Year
2 Years
15% savings
with prepaid discount
All plans include
Unlimited Revisions
Financing Integrations
Unlimited Users
CRM Integrations
Unlimited Contract Signing (via Docusign)
Includes Presenter Mode
Manual Design & Tree Editing
Battery Sizing & Modeling
Customer Facing Embed Tool
Flexible Pricing
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Trusted by the best installers

Installers, lenders, and operators choose Artemis for unmatched speed, accuracy, and reliability – at a fractionof the cost.

4.9

226 reviews
220
6
0
0
0
// Initialize Lenis const lenis = new Lenis({ lerp: 0.1, }); // Listen for the scroll event and log the event data lenis.on(‘scroll’, (e) => { console.log(e); }); // Use requestAnimationFrame to continuously update the scroll function raf(time) { lenis.raf(time); requestAnimationFrame(raf); } requestAnimationFrame(raf); gsap.registerPlugin(ScrollTrigger); const splitTypes = document.querySelectorAll(‘.scroll-highlight’); splitTypes.forEach((char, i) => { const text = new SplitType(char, { types: [‘chars’, ‘words’] }); gsap.from(text.chars, { scrollTrigger: { trigger: char, start: ‘top 50%’, end: ‘top 10%’, scrub: 1, }, opacity: 0.2, stagger: 0.1, }); }); new WordPlay({ className: “h-2”, // the text element mode: “letter”, // choose between letter or word offset: 20, // offset if revealed by scroll speed: 0.7, delay: 0.015, // stagger delay }); .skip-link { position: absolute; top: -100px; left: 0; background: #000; color: white; padding: 10px 15px; z-index: 1000; text-decoration: none; } .skip-link:focus { top: 10px; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } document.addEventListener(“DOMContentLoaded”, function () { const page = document.querySelector(“.page-container”); if (!page) { console.log(“No .page-container found”); return; } document.addEventListener(“click”, function (event) { const t1 = event.target.closest(“.link-trigger-1”); const t2 = event.target.closest(“.link-trigger-2”); // Click inside link-trigger-1 if (t1) { console.log(“Clicked link-trigger-1 → overflow: clip”); page.style.overflow = “clip”; // if this does nothing in your browser, use “hidden” } // Click inside link-trigger-2 if (t2) { console.log(“Clicked link-trigger-2 → overflow: visible”); page.style.overflow = “visible”; // or “auto”/”hidden” depending on what you want } }); }); (function() { // Configuration var config = { autoplayDelay: 2300, // Time between auto-advances (ms) transitionSpeed: 600 // Slide transition duration (ms) }; // State var isTransitioning = false; var autoplayInterval = null; var track = null; var slides = []; var slideWidth = 0; var currentOffset = 0; var leftBuffer = 2; // Initialize function init() { track = document.getElementById(‘reviewBadgeTrack’); if (!track) return; track.style.visibility = ‘hidden’; slides = Array.from(track.querySelectorAll(‘.review-badge-carousel__slide’)); if (slides.length === 0) { track.style.visibility = ‘visible’; return; } calculateDimensions(); for (var i = 0; i < leftBuffer; i++) { var lastSlide = slides.pop(); slides.unshift(lastSlide); track.insertBefore(lastSlide, track.firstChild); } centerCurrentSlide(false); updateActiveStates(); requestAnimationFrame(function() { track.style.visibility = 'visible'; startAutoplay(); }); window.addEventListener('resize', handleResize); track.addEventListener('click', handleSlideClick); track.parentElement.addEventListener('mouseenter', stopAutoplay); track.parentElement.addEventListener('mouseleave', startAutoplay); } function calculateDimensions() { if (slides.length === 0) return; var firstSlide = slides[0]; var style = getComputedStyle(firstSlide); var width = firstSlide.offsetWidth; var marginLeft = parseFloat(style.marginLeft); var marginRight = parseFloat(style.marginRight); slideWidth = width + marginLeft + marginRight; } function centerCurrentSlide(animate) { var viewportCenter = window.innerWidth / 2; var slideCenter = slideWidth / 2; currentOffset = viewportCenter – slideCenter – (leftBuffer * slideWidth); if (animate) { isTransitioning = true; track.style.transition = 'transform ' + config.transitionSpeed + 'ms ease'; } else { track.style.transition = 'none'; track.offsetHeight; // Force reflow } track.style.transform = 'translateX(' + currentOffset + 'px)'; } function updateActiveStates() { slides.forEach(function(slide, i) { var isVisible = i <= (leftBuffer + 2); if (i === leftBuffer) { slide.classList.add('active'); } else { slide.classList.remove('active'); } slide.style.visibility = isVisible ? 'visible' : 'hidden'; }); } function nextSlide() { if (isTransitioning || slides.length === 0) return; isTransitioning = true; currentOffset -= slideWidth; track.style.transition = 'transform ' + config.transitionSpeed + 'ms ease'; track.style.transform = 'translateX(' + currentOffset + 'px)'; setTimeout(handleTransitionEnd, config.transitionSpeed); } function handleTransitionEnd() { var firstSlide = slides.shift(); slides.push(firstSlide); track.appendChild(firstSlide); currentOffset += slideWidth; track.style.transition = 'none'; track.offsetHeight; // Force reflow track.style.transform = 'translateX(' + currentOffset + 'px)'; updateActiveStates(); isTransitioning = false; } function prevSlide() { if (isTransitioning || slides.length === 0) return; isTransitioning = true; var lastSlide = slides.pop(); slides.unshift(lastSlide); track.insertBefore(lastSlide, track.firstChild); currentOffset -= slideWidth; track.style.transition = 'none'; track.offsetHeight; // Force reflow track.style.transform = 'translateX(' + currentOffset + 'px)'; updateActiveStates(); currentOffset += slideWidth; requestAnimationFrame(function() { track.style.transition = 'transform ' + config.transitionSpeed + 'ms ease'; track.style.transform = 'translateX(' + currentOffset + 'px)'; setTimeout(function() { isTransitioning = false; }, config.transitionSpeed); }); } function startAutoplay() { stopAutoplay(); autoplayInterval = setInterval(nextSlide, config.autoplayDelay); } function stopAutoplay() { if (autoplayInterval) { clearInterval(autoplayInterval); autoplayInterval = null; } } function handleSlideClick(e) { var slide = e.target.closest('.review-badge-carousel__slide'); if (!slide || isTransitioning) return; var clickedIndex = slides.indexOf(slide); if (clickedIndex === leftBuffer) return; if (clickedIndex === leftBuffer + 1) { nextSlide(); } else if (clickedIndex === leftBuffer – 1) { prevSlide(); } } var resizeTimeout; function handleResize() { clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function() { calculateDimensions(); centerCurrentSlide(false); }, 100); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); function getUrlParams() { const params = new URLSearchParams(window.location.search); let utmParams = {}; const list = [‘utm_source’, ‘utm_medium’, ‘utm_campaign’, ‘utm_term’, ‘utm_content’]; list.forEach(param => { if (params.has(param)) { const val = params.get(param); utmParams[param] = val; document.cookie = `${param}=${val}; path=/;`; } }); return utmParams; } function getUtmFromCookies() { const cookies = document.cookie.split(‘; ‘).reduce((acc, cookie) => { const [key, value] = cookie.split(‘=’); acc[key] = value; return acc; }, {}); let utmParams = {}; const list = [‘utm_source’, ‘utm_medium’, ‘utm_campaign’, ‘utm_term’, ‘utm_content’]; list.forEach(param => { if (cookies[param]) { utmParams[param] = cookies[param]; } }); return utmParams; } function fillUtmFields() { let utmData = getUrlParams(); if (Object.keys(utmData).length === 0) { utmData = getUtmFromCookies(); } Object.keys(utmData).forEach(key => { const input = document.querySelector(`input[name=”${key}”]`); if (input) { input.value = utmData[key]; } }); } document.addEventListener(“DOMContentLoaded”, fillUtmFields); (function() { const sliderToQuantity = { 1: 100, 2: 150, 3: 200, 4: 300, 5: 400, 6: 700, 7: 1000, 8: 1500, 9: 2000, 10: 3000, 11: 4000, 12: 5000 }; const pricingData = { 1: { // 1 year 100: 15.00, 150: 14.50, 200: 14.00, 300: 13.00, 400: 12.00, 700: 10.50, 1000: 9.50, 1500: 9.25, 2000: 9.00, 3000: 8.50, 4000: 8.00, 5000: 7.50 }, 2: { // 2 years 100: 14.00, 150: 13.50, 200: 13.00, 300: 12.00, 400: 11.00, 700: 9.50, 1000: 8.50, 1500: 8.25, 2000: 8.00, 3000: 7.50, 4000: 7.00, 5000: 6.50 } }; let selectedYear = 1; function getPrice(sliderPosition, years) { const quantity = sliderToQuantity[sliderPosition]; return pricingData[years][quantity]; } function updatePrice() { const slider = document.getElementById(‘proposals-slider’) || document.getElementById(‘daily-hour-slider-hours-range’) || document.querySelector(‘input[type=”range”]’); if (!slider) return; const sliderPosition = parseInt(slider.value); const quantity = sliderToQuantity[sliderPosition]; const price = getPrice(sliderPosition, selectedYear); const priceDisplay = document.getElementById(‘price-display’) || document.getElementById(‘daily-hour-slider-hours-value’) || document.querySelector(‘.text-block-27’); if (priceDisplay) { priceDisplay.textContent = ‘$’ + price.toFixed(2); } const proposalCount = document.querySelector(‘.big-number’); if (proposalCount) { proposalCount.textContent = quantity; } } function handleYearToggle(yearValue) { selectedYear = yearValue; const oneYearBtn = document.querySelector(‘.div-block-163._1’); const twoYearBtn = document.querySelector(‘.div-block-163._2’); if (oneYearBtn && twoYearBtn) { if (yearValue === 1) { oneYearBtn.style.backgroundColor = ‘rgb(149, 141, 131)’; oneYearBtn.style.color = ‘rgb(253, 253, 247)’; twoYearBtn.style.backgroundColor = ”; twoYearBtn.style.color = ”; } else { twoYearBtn.style.backgroundColor = ‘rgb(149, 141, 131)’; twoYearBtn.style.color = ‘rgb(253, 253, 247)’; oneYearBtn.style.backgroundColor = ”; oneYearBtn.style.color = ”; } } updatePrice(); } function init() { const slider = document.getElementById(‘proposals-slider’) || document.getElementById(‘daily-hour-slider-hours-range’) || document.querySelector(‘input[type=”range”]’); if (!slider) { setTimeout(init, 500); return; } slider.addEventListener(‘input’, updatePrice); slider.addEventListener(‘change’, updatePrice); const oneYearBtn = document.querySelector(‘.div-block-163._1’); const twoYearBtn = document.querySelector(‘.div-block-163._2’); if (oneYearBtn) { oneYearBtn.style.cursor = ‘pointer’; oneYearBtn.addEventListener(‘click’, () => handleYearToggle(1)); oneYearBtn.style.backgroundColor = ‘rgb(149, 141, 131)’; oneYearBtn.style.color = ‘rgb(253, 253, 247)’; twoYearBtn.style.backgroundColor = ”; twoYearBtn.style.color = ”; } if (twoYearBtn) { twoYearBtn.style.cursor = ‘pointer’; twoYearBtn.addEventListener(‘click’, () => handleYearToggle(2)); } updatePrice(); } if (document.readyState === ‘loading’) { document.addEventListener(‘DOMContentLoaded’, init); } else { init(); } })();