Fundraising Site
fundraising.josemadridsalsa.com — the replacement for josemadridsalsafundraising.com, served by its own app (apps/fundraising) and checking out through the BigCommerce fundraising store.
Fundraising Site
The fundraising site is the public home for groups raising money with salsa and for the people buying to support them. It replaces the old BigCommerce Stencil site at josemadridsalsafundraising.com with pages in the josemadridsalsa.com design, while BigCommerce's fundraising store stays the system of record for the catalog, checkout, payment and orders.
| Live host | fundraising.josemadridsalsa.com |
| Later host | fundraising.josemadridsalsa.com (add the domain to the fundraising Vercel project when ready) |
| Code | apps/fundraising/ — site pages in app/(site)/, plus components/fundraising-site/, lib/fundraising-site/ |
| Checkout | BigCommerce fundraising store (BIGCOMMERCE_FUNDRAISING_*), hosted checkout on josemadridsalsafundraising.com |
How the app works
The fundraising site is its own Next.js app, apps/fundraising, deployed as its own
Vercel project. It serves:
- the site's own pages (
app/(site)/): home, shop, groups, cart, blog and the rest below; - every fundraiser page that used to live on the main site:
/fundraising,/fundraisers/...,/fundraise/...,/f/...,/arena/..., the fundraiser portal (/fundraiser-portal/...), fundraiser sign-up (/auth/fundraiser-signup) and the share-shield links (/s/...); - their APIs (
/api/fundraiser/...,/api/fundraisers/...,/api/fundraiser-portal/...,/api/fundraising-site/...,/api/participants/...,/api/fundraiser-signups); - the checkout, order confirmation and sign-in pages it shares with the main site, from
packages/core/routes(see Shared Code Strategy).
The main site redirects (308) its old fundraiser paths to the same path on
NEXT_PUBLIC_FUNDRAISING_SITE_URL (apps/storefront/proxy.ts), and the fundraising app
sends main-site pages that shared components link to (/products, /salsas,
/account, …) back to NEXT_PUBLIC_SITE_URL (apps/fundraising/next.config.mjs).
Staff still manage fundraisers in the main site's admin. Two things stay on the main
site for now: the fundraiser mobile app's API (/api/fundraiser-app, because the app
has the main site's address built in) and the BigCommerce and payment webhooks.
Local development: npm run dev:fundraising serves it on http://localhost:3001.
Pages
| Path | What it is |
|---|---|
/ | Home: pitch, video, popular flavors, start-a-fundraiser call to action |
/shop, /shop/[slug] | The fundraising store's visible products, read live from BigCommerce |
/groups, /groups/[slug] | Groups taking orders right now, with a "Shop for this group" button |
/cart | Cart, group picker, salesperson name, hand-off to checkout (noindex) |
/why-jose-madrid, /start, /sign-up | Program details, 2026 fundraiser-kit downloads, account sign-up form (shared with /auth/fundraiser-signup) plus group inquiry form |
/our-story, /testimonials, /survey, /blog, /contact, /shipping | Content carried over from the old site |
Order-form packs and fliers are static files in
apps/fundraising/public/fundraising/downloads/. Replace a file there to update it.
Signing up
The organizer account form (/sign-up step 1, and /auth/fundraiser-signup) sets up the whole
store before anyone reviews it:
- Salsa package (required). 9, 16 or 25 flavors. The kits are defined once, in
packages/core/lib/fundraising/flavor-kits.ts, which also maps each flavor to itsProduct.slug. The order-form submission page reads the same lists. - Fulfillment (required). Order forms + bulk delivery, or online only. The brochure choice is not asked at sign-up; an admin settles it on the fundraiser.
- Colors (required). Main, secondary and accent, matched to the school, team or business.
They are stored in
Fundraiser.brandColor,secondaryColorandaccentColor(on the sign-up request,teamColoris the main one). These are the same three colors the admin Branding tab edits. The main color accents the public campaign page. - Branding (optional). Logo, cover photo, mission statement and an about-us bio.
Images upload through
fundraiserSignupImage, the one UploadThing route that needs no session (images only, 4MB, 10 uploads per IP per hour). The API accepts image URLs only from UploadThing hosts.
Approving the account at Admin → Fundraisers → Accounts activates the fundraiser and enables
the package's salsas on its store (kit-catalog.server.ts). Salsas an admin has already set up
are left as they are. The Battle Arena signup (/fundraise/signup, approved under Signups)
asks the same questions and stocks its store the same way.
Old josemadridsalsafundraising.com URLs (/start-your-fundraiser/,
/original-mild-salsa/, /cart.php…) redirect permanently to their new paths
(lib/fundraising-site/legacy-redirects.ts), so they keep working once that domain
points here.
Groups and attribution
A sale is credited to a group the same way it always has been: the fundraising store's checkout asks two required questions, Fundraising Group name (a dropdown) and Salesperson (free text), and BigCommerce stores the answers on the order.
The group list is the BigCommerce checkout dropdown. The site reads it live from the store's public form-fields endpoint, so staff keep managing groups where they always have:
- BigCommerce control panel › Settings › Form fields › Address fields › Fundraising Group name › add the group as a new option.
- Within five minutes the group appears on
/groupsand in the cart's dropdown. Remove the option when the fundraiser ends and it disappears from both.
When a buyer checks out, the site creates the BigCommerce cart and tries to pre-fill the group and salesperson answers. If BigCommerce does not accept the pre-fill, the buyer simply picks them again at checkout — both fields are required there, so a sale can never go uncredited because of it.
Orders placed in the fundraising store are copied into this site's order table and credited to a fundraiser record per group — see BigCommerce cutover.
Pricing and shipping
Both are set in the BigCommerce fundraising store, not here: jars are $10, and shipping is a $10 flat rate per order. The cart shows the flat rate as an estimate; BigCommerce charges the real total.
Going live on a domain
- Add the domain to the fundraising Vercel project (Settings › Domains); see the
cutover runbook for setting that project up.
fundraising.josemadridsalsa.comneeds a CNAME tocname.vercel-dns.comin that domain's DNS (already in place). - Make sure
BIGCOMMERCE_FUNDRAISING_STORE_HASH,_ACCESS_TOKEN,_CLIENT_IDand_CLIENT_SECRETare set in Vercel production. - When the canonical host changes, set
NEXT_PUBLIC_FUNDRAISING_SITE_URLto it and redeploy; canonical URLs, the sitemap and robots.txt follow it. - Search Console: add the new host as a property, submit
https://<host>/sitemap.xml, and run URL Inspection on the home page.
Moving josemadridsalsafundraising.com here
Adding the old domain to the fundraising Vercel project turns its URLs into redirects to the new site — but the BigCommerce hosted
checkout lives on that domain today. Before moving it, have BigCommerce move the
fundraising store's checkout to its own subdomain and set
BIGCOMMERCE_FUNDRAISING_STOREFRONT_URL to it, exactly as the main store's
cutover does. Then use Search Console's Change of Address tool.
How is this guide?
Last updated on