ImageImageImageImage

Funraise is an all-in-one
nonprofit fundraising platform.

Built by nonprofiteers.
Image

For more than a decade, we’ve been building the perfect fundraising platform based on feedback from thousands of nonprofits—delivering donation forms, donor management, and everything in between. Open the door to a world of difference.

Image
Donation Forms

Raise more funds with smart pop-up donation forms

Image
Image
“We've seen an increase in our online donor conversion rate which is exciting … The popup donate forms are genius!”
Dave E
VP of Marketing
Image
Fundraising Websites

Hit your goals with brilliant fundraising websites

Image
Image
“As far as our donation page and first campaign site, we saw an appreciable increase in donations”
Kasai R
Communications & Development Coordinator
Image
Peer-to-Peer Fundraising

Empower your people with peer-to-peer fundraising

Image
Image
“This changed the game for us … Our P2P fundraisers were a huge success!”
Adriana M
Sponsorship & Marketing Manager
Image
Donor Management

Build personal, long-term relationships with donors

Image
Image
Funraise is such a user-friendly interface. Each member of our team can easily track donor information, pull reports, and keep track of our progress.
Abbie R
Founder, Executive Director
Image
Wealth Screening

Uncover the hidden potential within your donor base

Image
Image
“Funraise has allowed us to generate more income, especially with our annual campaign and our sustaining member campaign.”
Lynn P
President/Chair
Image
Fundraising Intelligence

Discover trends with custom reports
& dashboards

Image
Image
"Funraise has not only helped us raise so much more money, but they've also helped relieve us of administration work with their automation, tracking, and report functionality."
Ashley J
Founder, Executive Director
Image
Emails

Send the right email to the right donor at the right time

Image
Image
“This is the most thought-through fundraising tool we've ever used in our 8 years of existence!”
Hugh H
President
A complete nonprofit platform

Nonprofit organizations using Funraise grow
online giving 73% annually on average.

Image
Seamless Donor Management
Build more valuable donor relationships with a nonprofit CRM purpose-built to simplify your donor management processes.
Image
More Giving Channels
Reach more donors with modern giving channels: pop-up donation forms, recurring giving, peer-to-peer, text-to-give, and more.
Image
Donor Communication
Send SMS text messages and automated emails to reach the right donors at the right time.
Transfer icon.
Reports & Dashboards
Make smart fundraising decisions with easy access to visual donor dashboards and custom reports.
Online fundraising

Boost revenue with customizable giving tools

Accept donations on your website and build branded fundraising campaigns to deliver engaging donation experiences and impressive results.
Image
Donor management

Track every donor journey with intuitive donor profiles

Manage every donor and donation with user-friendly data management and reporting tools.
Image
Fundraising Intelligence

A new era of fundraising intelligence is here

From on-demand donation reports to AI forecasting, access nonprofit reports and fundraising insights like you never thought possible.
Image
Integrations

Power up and connect your favorite tools

Customize your fundraising with a suite of seamless integrations.
Various nonprofit fundraising integrations floating in circles.
Fund your mission

Year after year, organizations using Funraise grow and outperform industry standards.

Trusted by nonprofit leaders

From ease-of-use to revenue results, nonprofiteers love Funraise

ImageImageImageImageImageImage
Image
Ready?

Get started today

Heck, forget today—get started in 10 minutes. Your cause can’t wait (and it shouldn't have to!); tap into core fundraising tools now.
Donation form with fundraising progress bar floating and example donations.
tag */ (function() { 'use strict'; // Support both formats: {current.year} and {current_year} const YEAR_PLACEHOLDERS = ['{current.year}', '{current_year}']; /** * Get current year */ function getCurrentYear() { return new Date().getFullYear().toString(); } /** * Check if text contains any year placeholder */ function containsYearPlaceholder(text) { if (!text) return false; return YEAR_PLACEHOLDERS.some(placeholder => text.includes(placeholder)); } /** * Replace all year placeholders in text */ function replaceYearPlaceholders(text) { if (!text) return text; const year = getCurrentYear(); let result = text; YEAR_PLACEHOLDERS.forEach(placeholder => { try { result = result.replaceAll(placeholder, year); } catch (e) { // Fallback for older browsers result = result.split(placeholder).join(year); } }); return result; } /** * Check if element should be skipped (React components, scripts, etc.) */ function shouldSkipElement(element) { if (!element || !element.parentNode) { return true; } // Skip script, style, and noscript tags const tagName = element.tagName?.toLowerCase(); if (tagName === 'script' || tagName === 'style' || tagName === 'noscript') { return true; } // Skip React components (elements with data-initialized or data-reactroot) if (element.hasAttribute && ( element.hasAttribute('data-initialized') || element.hasAttribute('data-reactroot') || element.closest('[data-initialized]') || element.closest('[data-reactroot]') )) { return true; } // Skip if element is inside a React root let parent = element.parentNode; while (parent && parent !== document.body) { if (parent.hasAttribute && ( parent.hasAttribute('data-initialized') || parent.hasAttribute('data-reactroot') )) { return true; } parent = parent.parentNode; } return false; } /** * Safely replace {current.year} in text nodes using TreeWalker * Enhanced to handle rich text fields in Webflow blog posts */ function replaceYearInTextNodes(rootElement) { if (!rootElement) { return; } const year = getCurrentYear(); // Use a more aggressive TreeWalker that processes all text nodes const walker = document.createTreeWalker( rootElement, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, { acceptNode: function(node) { // For text nodes if (node.nodeType === Node.TEXT_NODE) { // Skip if node is inside a skipped element if (shouldSkipElement(node.parentElement)) { return NodeFilter.FILTER_REJECT; } // Only process nodes that contain any placeholder if (containsYearPlaceholder(node.textContent)) { return NodeFilter.FILTER_ACCEPT; } return NodeFilter.FILTER_REJECT; } // For element nodes, continue traversing if (node.nodeType === Node.ELEMENT_NODE) { // Skip if it's a skipped element if (shouldSkipElement(node)) { return NodeFilter.FILTER_REJECT; } // Continue traversing children return NodeFilter.FILTER_ACCEPT; } return NodeFilter.FILTER_REJECT; } }, false ); const textNodes = []; let node; // Collect all matching text nodes first while (node = walker.nextNode()) { if (node.nodeType === Node.TEXT_NODE && containsYearPlaceholder(node.textContent)) { textNodes.push(node); } } // Replace in collected nodes textNodes.forEach(textNode => { if (containsYearPlaceholder(textNode.textContent)) { textNode.textContent = replaceYearPlaceholders(textNode.textContent); } }); } /** * Find and process Webflow rich text fields specifically */ function processRichTextFields() { // Webflow rich text fields may have these classes or attributes const richTextSelectors = [ '.w-richtext', '.rich-text', '.funraise-rich-content', '.blog-content', '.blog-content-box', '[data-wf-field]', '.w-dyn-list', '.w-dyn-item', '[id*="toc-content"]', '[class*="richtext"]', '[class*="rich-content"]' ]; richTextSelectors.forEach(selector => { try { const elements = document.querySelectorAll(selector); elements.forEach(element => { if (!shouldSkipElement(element)) { replaceYearInTextNodes(element); } }); } catch (e) { // Skip invalid selectors } }); } /** * Debounce function to limit how often replacement runs */ function debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } /** * Initialize year replacement */ function initYearReplacement() { // Replace on initial page load replaceYearInTextNodes(document.body); // Process Webflow rich text fields specifically processRichTextFields(); // Set up MutationObserver for dynamically added content const observer = new MutationObserver(debounce((mutations) => { let shouldProcess = false; mutations.forEach((mutation) => { if (mutation.type === 'childList') { mutation.addedNodes.forEach((node) => { // Only process element nodes if (node.nodeType === Node.ELEMENT_NODE) { // Skip if it's a React component if (!shouldSkipElement(node)) { replaceYearInTextNodes(node); shouldProcess = true; } } else if (node.nodeType === Node.TEXT_NODE) { // Handle text nodes that are added directly if (!shouldSkipElement(node.parentElement)) { if (containsYearPlaceholder(node.textContent)) { node.textContent = replaceYearPlaceholders(node.textContent); shouldProcess = true; } } } }); } else if (mutation.type === 'characterData') { // Handle text content changes (important for rich text) if (mutation.target.nodeType === Node.TEXT_NODE) { if (!shouldSkipElement(mutation.target.parentElement)) { if (containsYearPlaceholder(mutation.target.textContent)) { mutation.target.textContent = replaceYearPlaceholders(mutation.target.textContent); shouldProcess = true; } } } } }); // If we processed mutations, also check rich text fields if (shouldProcess) { processRichTextFields(); } }, 100)); // Start observing with more aggressive settings for rich text observer.observe(document.body, { childList: true, subtree: true, characterData: true, attributes: false }); } /** * Run replacement with multiple attempts for late-loading content */ function runWithRetries() { initYearReplacement(); } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', runWithRetries); } else { // DOM already loaded runWithRetries(); } // Multiple retries for late-loading content (especially rich text in blog posts) setTimeout(runWithRetries, 300); setTimeout(runWithRetries, 500); setTimeout(runWithRetries, 1000); setTimeout(runWithRetries, 2000); setTimeout(runWithRetries, 3000); setTimeout(runWithRetries, 5000); // Also listen for Webflow's custom events if available if (typeof window !== 'undefined') { window.addEventListener('load', runWithRetries); // Some Webflow CMS content loads after window.load setTimeout(runWithRetries, 4000); setTimeout(runWithRetries, 6000); setTimeout(runWithRetries, 8000); } // Additional check for blog posts - they can load very late if (typeof window !== 'undefined' && window.location.pathname.includes('/blog/')) { setTimeout(runWithRetries, 10000); setTimeout(runWithRetries, 15000); } })();