Skip to main content
RapidDev - Software Development Agency
flutterflow-tutorials

How to Build a Charity or Crowdfunding Platform with FlutterFlow

Build a crowdfunding platform with a campaigns collection storing goal amounts, raised totals, and backer counts. Display campaigns in a GridView with search and category filters. Each campaign page shows a hero image, description, LinearPercentIndicator progress bar, and a Donate button. The donation flow uses preset amount buttons plus a custom amount field, redirecting to Stripe Checkout. A Cloud Function webhook increments raisedAmount and backerCount atomically on successful payment. Campaign creators use a multi-step form to publish new campaigns.

What you'll learn

  • How to design a Firestore data model for crowdfunding campaigns and donations
  • How to build a campaign discovery page with search and category filtering
  • How to implement a donation flow with Stripe Checkout and webhook-based goal tracking
  • How to create a multi-step campaign creation form
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner7 min read30-40 minFlutterFlow Free+March 2026RapidDev Engineering Team
TL;DR

Build a crowdfunding platform with a campaigns collection storing goal amounts, raised totals, and backer counts. Display campaigns in a GridView with search and category filters. Each campaign page shows a hero image, description, LinearPercentIndicator progress bar, and a Donate button. The donation flow uses preset amount buttons plus a custom amount field, redirecting to Stripe Checkout. A Cloud Function webhook increments raisedAmount and backerCount atomically on successful payment. Campaign creators use a multi-step form to publish new campaigns.

Building a Crowdfunding Platform in FlutterFlow

Crowdfunding platforms let users create campaigns with funding goals and accept donations from backers. This tutorial covers the full platform: campaign discovery with filtering, individual campaign pages with progress tracking, Stripe-powered donations, and a multi-step campaign creation flow. Everything is built using the FlutterFlow visual builder with Firestore as the backend.

Prerequisites

  • A FlutterFlow project with Firestore and Firebase Authentication configured
  • A Stripe account with API keys stored in Cloud Function environment variables
  • Basic familiarity with FlutterFlow Backend Queries and Action Flows
  • The LinearPercentIndicator widget available in your project

Step-by-step guide

1

Set up the Firestore data model for campaigns and donations

Create a campaigns collection with fields: title (String), description (String), imageUrl (String), goalAmount (Number), raisedAmount (Number, default 0), backerCount (Integer, default 0), endDate (Timestamp), createdBy (String, userId), category (String), status (String: 'active', 'funded', 'closed'). Create a donations collection with: campaignId (String), userId (String), amount (Number), timestamp (Timestamp), isAnonymous (Boolean). Add a Firestore index on campaigns for category + status + raisedAmount for efficient discovery queries.

Expected result: Firestore has campaigns and donations collections ready for the crowdfunding platform.

2

Build the campaign discovery page with search and filtering

Create a DiscoverPage with a Column layout. At the top, add a TextField with a search icon prefix for searching campaigns by title. Below it, add a Row of ChoiceChips for categories (Education, Health, Technology, Community, Creative, Emergency). Add a GridView with a Backend Query on campaigns where status == 'active', filtered by the selected category ChoiceChip. Each grid cell is a CampaignCard Component showing: Image (thumbnailUrl), title Text, LinearPercentIndicator (raisedAmount/goalAmount), raisedAmount Text, and days remaining calculated from endDate.

Expected result: A discovery page showing active campaigns in a grid with category filtering and search.

3

Create the campaign detail page with progress and backer information

Create a CampaignDetailPage with Route Parameter campaignId. Use a SingleChildScrollView containing a Column. Add: hero Image (full width), title Text (headlineMedium), Row with creator avatar CircleImage and name, LinearPercentIndicator (large, showing percentage funded), Row of three stat Containers (raisedAmount, backerCount, daysLeft), description Text (multiline), and a prominent Donate Button at the bottom fixed with a Container. Show a 'Goal Reached' banner Container with Conditional Visibility when raisedAmount >= goalAmount.

Expected result: A detailed campaign page showing all campaign information with a prominent donate button.

4

Implement the donation flow with preset amounts and Stripe Checkout

On Donate Button tap, open a DonateSheet Bottom Sheet Component. Display a Row of four preset amount Containers ($10, $25, $50, $100) that set a Page State selectedAmount on tap. Below, add a TextField for custom amounts with a number keyboard. Add an isAnonymous Switch. The Donate Button in the sheet calls a Cloud Function createDonationCheckout passing campaignId, amount, userId, and isAnonymous. The function creates a Stripe Checkout Session (mode: 'payment') and returns the URL. Use Launch URL to open it. A webhook Cloud Function on checkout.session.completed creates the donation document and atomically increments the campaign raisedAmount and backerCount.

onDonationComplete.js
1// Cloud Function: onDonationComplete (Stripe webhook)
2const admin = require('firebase-admin');
3const db = admin.firestore();
4
5exports.onDonationComplete = async (event) => {
6 const session = event.data.object;
7 const { campaignId, userId, isAnonymous } = session.metadata;
8 const amount = session.amount_total / 100;
9
10 const batch = db.batch();
11 batch.create(db.collection('donations').doc(), {
12 campaignId, userId, amount,
13 isAnonymous: isAnonymous === 'true',
14 timestamp: admin.firestore.FieldValue.serverTimestamp(),
15 });
16 batch.update(db.collection('campaigns').doc(campaignId), {
17 raisedAmount: admin.firestore.FieldValue.increment(amount),
18 backerCount: admin.firestore.FieldValue.increment(1),
19 });
20 await batch.commit();
21};

Expected result: Users can select a preset or custom donation amount. Stripe processes the payment and the campaign progress updates automatically.

5

Build the multi-step campaign creation form

Create a CreateCampaignPage with a PageView (swipe disabled) acting as a step wizard. Step 1: title TextField and description TextField (multiline). Step 2: image upload via FlutterFlowUploadButton to Firebase Storage. Step 3: goalAmount TextField (number), endDate DateTimePicker, category DropDown. Step 4: review all entered data with an Edit button per section. Store all values in Page State variables. On Publish Button tap: Create Document in campaigns with all fields plus createdBy: currentUser.uid and status: 'active'. Navigate to the new campaign detail page. Show step indicators as a Row of numbered Containers at the top with the active step highlighted.

Expected result: A polished multi-step form lets users create and publish crowdfunding campaigns.

Complete working example

FlutterFlow Crowdfunding Setup
1FIRESTORE DATA MODEL:
2 campaigns/{campaignId}
3 title: String
4 description: String
5 imageUrl: String
6 goalAmount: Number
7 raisedAmount: Number (default 0)
8 backerCount: Integer (default 0)
9 endDate: Timestamp
10 createdBy: String (userId)
11 category: String
12 status: "active" | "funded" | "closed"
13
14 donations/{donationId}
15 campaignId: String
16 userId: String
17 amount: Number
18 timestamp: Timestamp
19 isAnonymous: Boolean
20
21DISCOVER PAGE:
22 Column
23 TextField (search, prefix: search icon)
24 ChoiceChips (categories)
25 GridView
26 Backend Query: campaigns, status == 'active', filtered by category
27 CampaignCard Component
28 Image (thumbnailUrl)
29 Text (title)
30 LinearPercentIndicator (raised/goal)
31 Text ("$X raised of $Y")
32
33CAMPAIGN DETAIL PAGE:
34 Route Parameter: campaignId
35 SingleChildScrollView > Column
36 Image (hero, full width)
37 Text (title, headlineMedium)
38 Row (creator avatar + name)
39 LinearPercentIndicator (large)
40 Row of 3 stat Containers
41 raisedAmount
42 backerCount
43 daysLeft
44 Text (description)
45 Button ("Donate Now")
46
47DONATE BOTTOM SHEET:
48 Column
49 Text ("Support this campaign")
50 Row (preset: $10, $25, $50, $100 Containers)
51 TextField (custom amount, number keyboard)
52 Row (Switch + "Donate anonymously")
53 Button ("Donate $X")
54 On Tap:
55 1. API Call: createDonationCheckout
56 2. Launch URL: response.url
57
58WEBHOOK checkout.session.completed:
59 1. Create donation document
60 2. Increment campaign raisedAmount + backerCount

Common mistakes when building a Charity or Crowdfunding Platform with FlutterFlow

Why it's a problem: Not handling the case when the funding goal is reached

How to avoid: Add a Conditional Action or Conditional Visibility: when raisedAmount >= goalAmount, show a 'Goal Reached' banner and optionally change the Donate button text to 'Bonus Support' or disable it.

Why it's a problem: Incrementing raisedAmount on the client side instead of in a webhook

How to avoid: Only update raisedAmount and backerCount inside the Stripe webhook Cloud Function after confirmed payment.

Why it's a problem: No validation on the campaign creation form steps

How to avoid: Validate each step before allowing progression: check required fields, minimum goal amount, valid end date in the future, and uploaded image.

Best practices

  • Use FieldValue.increment() in Cloud Functions for atomic updates to raisedAmount and backerCount
  • Only update campaign totals in Stripe webhook handlers, never optimistically on the client
  • Show percentage funded and days remaining on every campaign card for quick scanning
  • Validate each step of the campaign creation form before allowing the user to proceed
  • Include preset donation amounts for quick selection alongside a custom amount option
  • Add social sharing buttons on campaign pages to increase visibility
  • Implement a campaign end date check that automatically closes expired campaigns via scheduled Cloud Function

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

I want to build a crowdfunding platform in FlutterFlow. Show me the Firestore data model for campaigns and donations, a campaign discovery page with category filtering, a campaign detail page with progress bar, a donation flow with Stripe Checkout, and a multi-step campaign creation form.

FlutterFlow Prompt

Create a campaign page with a large hero image at the top, a progress bar showing funding percentage, three stat boxes in a row, a description area, and a prominent donate button at the bottom.

Frequently asked questions

Can I add recurring donations instead of one-time payments?

Yes. Change the Stripe Checkout Session mode from 'payment' to 'subscription' and create a Stripe Price with a recurring interval. Track recurring backers separately in the donations collection with a recurringId field.

How do I handle campaign refunds if the goal is not reached?

Implement an 'all-or-nothing' model by adding a scheduled Cloud Function that checks expired campaigns. If raisedAmount is less than goalAmount at endDate, trigger Stripe refunds for all donations and set campaign status to 'closed'.

Can campaign creators update their campaigns after publishing?

Yes. Add an Edit button on the campaign detail page that is conditionally visible when createdBy equals currentUser.uid. Navigate to the creation form pre-filled with existing campaign data using Route Parameters.

How do I show a list of backers on the campaign page?

Query the donations collection filtered by campaignId and ordered by timestamp descending. Display each backer in a ListView showing their name (or 'Anonymous' if isAnonymous is true), amount, and donation date.

Can I add campaign categories with subcategories?

Yes. Create a categories collection with parentId field for hierarchy. Use a DropDown for the top-level category and a second dependent DropDown filtered by parentId for the subcategory.

Can RapidDev help build a complete crowdfunding platform?

Yes. RapidDev can implement the full platform including Stripe Connect for payouts to campaign creators, tax receipt generation, social sharing, email notifications, and all-or-nothing funding logic.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.