Documentation & help
Everything you need to understand and operate DiscountOneCard — for members, families, business partners, affiliate leaders, and admins.
What is DiscountOneCard?
DiscountOneCard is a digital local-discount membership that replaces the old-school paper fundraising card. A network of local businesses offer real discounts; members buy a yearly card; a portion of every sale flows to a school, booster club, church, or nonprofit of the buyer's choice. Members show an animated, screenshot-resistant verification screen at checkout.
- Memberships last 365 days from the day they're activated — no stale "2026 card" stock.
- Offers can be unlimited (use every time), one-time (one use ever), or recurring (e.g. once a month).
- The verification card is live-animated and includes the member's name, so screenshots don't work.
- Family plans cover up to 4 people — priced at 3× the individual rate.
- One card, every participating business — your card works across the whole DiscountOneCard network.
Roles & accounts
Your account's role determines what you can do.
| Role | Who | Can do |
|---|---|---|
| Member | Cardholders | Browse the directory, redeem, show card, manage family, gift memberships, self-serve account. |
| Family leader | Members on a family plan | Everything a member does, plus invite up to 3 others and manage seats. |
| Business owner | Partner businesses | Edit their own listing, create/update/hide offers, see redemption counts and "cards activated from your QR" stats. |
| Affiliate leader | Cause reps (e.g. football coach) | See stats and revenue attributed to their affiliate code, manage their seller roster, record cash sales, view their leaderboard. |
| Org admin | Admin for one organization | Manage users, businesses, offers, memberships, affiliate codes, sales, district rollup, audit log — for their org only. |
A "seller" is a label managed by the affiliate leader so a kid can be credited on the leaderboard without needing an account. They never log in. We store first name + last initial by default for COPPA-friendliness — see Sellers & kid privacy.
The $25 model
Card price is $25 for one year. The split is the same for every sale:
| Bucket | Default | Notes |
|---|---|---|
| Platform fee | $5 per card | Covers hosting, email, payment processing, and support. |
| Org payable | $20 per card | The school/org receives this. Further split below. |
| Cause / team share | (% of $20) | Each affiliate code has a share % 0–100. e.g. softball at 50% → $10 to softball, $10 to school general. |
| Org general | (remainder of $20) | What's left of the $20 after the cause share. |
Adjusting a code's share % updates the displayed attribution retroactively.
Where the money goes
For online sales (Stripe, when wired): DOC collects, holds, and pays out the org's portion on a schedule. For cash sales: the org collects directly from the buyer, keeps everything except the $5 platform fee per card, which they remit to DOC periodically. The Sales tab in admin shows a running "cash owed to DOC" total for unremitted cash sales — see Sales tab.
Signing up as a member
- Open
/signup(or scan a QR flyer at any partner business). - Enter name, email, password (10+ chars).
- Pick the organization you want to support (Palmetto High School, Sarasota Booster Club, etc.) from the dropdown.
- Pick a cause/team from the second dropdown (loads codes for that org). e.g. "Girls Softball Team".
- Optional: credit a student seller from the next dropdown — they get leaderboard credit.
- Verify your email and you're done.
The signup page recognizes ?biz=<id> from a flyer QR code and shows "📍 This card is being activated from {Business}'s flyer." That attribution is recorded so the business owner sees their flyer's impact.
A membership runs 365 days from activation (or 30 if you picked monthly billing). Cancel anytime — annual cancellations end immediately and aren't pro-rated.
Browsing the directory
The home page (Offers) groups every deal by the business offering it. Your card works at every participating business in the network — not just businesses tied to the org you signed up under.
You can also browse the directory before signing up at /directory — no login required. Offer details are visible; redemption requires an active card.
Each offer shows a badge:
- Unlimited — use as many times as you want.
- One-time — one use, forever (e.g. "free welcome dessert").
- Every week/month/quarter/year — one use per period.
Map & location
Switch between List and Map view at the top of the offers page. The map shows every business with a pin, using OpenStreetMap data (CARTO tiles). Tap Use my location to grant temporary GPS access — you'll see a blue dot for yourself, pins for nearby businesses, and the list re-sorts by distance. Location is only used in your browser; never sent to our server.
Redeeming an offer
- Open the offer you want to use.
- Tap Redeem now, then Confirm & show my card.
- Show the animated verification screen to the business. You have 10 minutes.
- The business sees your name, org, live clock, and a QR code. They verify and apply the discount.
For one-time offers, tapping Confirm uses it permanently. For recurring offers (e.g. monthly), it locks until the next period. If you redeemed by mistake, ask an admin to reset it.
Your verification card
Tap My Card for a 2-minute live card useful when a business just wants to confirm membership. After redeeming an offer it runs for 10 minutes. The card includes:
- Member name in large type and the org's crest
- A live clock down to the millisecond
- An animated gradient background, floating rings, countdown bar
- A QR code a business can scan to see a time-limited verification page
Family plans
A family plan covers up to 4 people under one leader, priced at 3× the individual rate ("buy 3, get 1 free"). Everyone gets their own login and animated card. To start one, sign in and go to Family → Continue to upgrade; your individual membership converts to family. Invite by email; invitations expire in 7 days. Seats use a 90-day cooldown on swaps so seats can't be churned.
Gift memberships
On the Account page, members can send a gift to anyone with just an email. The flow:
- Member fills the gift form (recipient email + optional message).
- The org admin is notified that a gift is awaiting payment.
- Once payment is received, the admin clicks Activate and the recipient gets a claim email with a code.
- Recipient signs in (creating an account if needed), enters the code at /gift, and receives an active membership.
Managing your account
On the Account page: update name/phone, change password (logs out other devices), resend verification, see remaining days, gift a membership, and cancel (immediate). Passkeys can be registered for password-free sign-in on supported browsers.
Your business listing
When an org admin invites you (or links your account to a business), you'll see My Business after signing in. Fill in:
- Name, description, categories (comma-separated, e.g.
pizza, dining, family) - Website, phone, contact email
- Address — there's a Locate from address button that geocodes via Nominatim and fills lat/lon
- Logo and hero image (uploads supported, ~1MB)
- Hours (per-day editor)
- Photos and locations (multi-location businesses supported via the Locations panel)
Changes go live immediately and are audit-logged.
Creating offers
- In My Business, click Add offer.
- Pick a type: Unlimited, One-time, or Recurring (with period + anchor — calendar boundary or signup date).
- Write clear terms: "Dine-in only", "One per visit", "Exclusions apply".
- Save. Members see it instantly.
- Use the Edit / Hide / Delete buttons next to any offer to change it later.
Printable QR flyers
On My Business, hit Open flyer ↗ to view a print-ready letter-size flyer with your business name and a 300×300 QR code. Tape it to your counter or window. Customers who scan it land on the signup page with your business pre-tagged as the origin — when they pick whichever org they want to support, your business gets credit on their cards activated from your QR stat.
Activations & redemptions
Two stats on your dashboard:
- Cards activated from your QR — total + last 30 days. Counts every membership where your flyer's QR was the origin.
- Redemptions per offer — only one-time and recurring offers are tracked (unlimited offers are too numerous to count meaningfully).
Your /affiliate dashboard
Sign in and go to My Cause. For each affiliate code you lead, you'll see:
- Active member count, total signups, and dollars attributed to your cause (post-platform-fee)
- The seller leaderboard for that code — top kids by sales count
- Your seller roster — add, deactivate, or reactivate sellers
- A "Record a cash sale" form scoped to your code
Managing your seller roster
Sellers are how you give credit to specific kids on the leaderboard without requiring them to have a DiscountOneCard account. The flow:
- Add a seller: first name (required), last name display (initial only by default — privacy-safer; switch to full last name only when there's a name collision in your roster).
- Tick the per-seller affirmation: "I affirm this seller is 13 or older and the org has authority to list them by name." Required to save (this is your COPPA backstop — see kid privacy).
- Save. The seller now appears in the Crediting a student? dropdown on the public signup page (for online sales) and in your cash-sale form.
- Deactivate when a kid leaves the team. Deactivation is soft — historical sales credit stays.
Recording cash sales
When a kid hands you cash for a card:
- On My Cause, click New sale in the "Record a cash sale" panel.
- Enter the buyer's email and (optionally) name. If they don't have a DiscountOneCard account yet, we create a placeholder; they'll set their password when they verify their email.
- Pick the seller (kid) from the dropdown — that's who gets leaderboard credit.
- Confirm the amount (defaults to $25). Submit.
What happens next:
- If the buyer already has an active membership in your org, the $25 extends it by a year — no duplicate. Otherwise a new annual membership is created.
- The sale is recorded with the right cause/general split based on your share %.
- Your seller appears (or moves up) in the leaderboard.
- The $5 platform fee adds to the org admin's "cash owed to DOC" total, which they remit periodically.
Seller leaderboard
The leaderboard at the top of your My Cause page ranks every active seller in your roster by sales count, then by dollars contributed to your cause. Toggle between 30-day, 1-year, and all-time periods. Visibility is restricted to the org admin and you (the leader of that code). General members of the org can't see it — kid privacy.
Inviting business owners
On Admin → Organization → Businesses, edit a business and use the Invite as owner button next to the owner-email field. Three branches:
- New email: creates a business_owner account with a temp password, emails them a "Manage your listing" sign-in link.
- Existing user in your org (member role): promotes to business_owner.
- User exists in a different org: rejected (no cross-org poaching).
Inviting affiliate leaders
Same flow on Admin → Affiliates: every code row has an Invite leader button. When you create a new code with a leader email that doesn't exist as a user yet, the system auto-creates the affiliate_leader account and emails them. The org admin sees the temp password in a confirmation alert as a fallback (also emailed to the new leader).
Affiliate codes & money split
Affiliate codes direct a portion of a member's fee to a specific cause. On Admin → Org → Affiliates, add a code with:
- A short lowercase identifier (
softball,band) - Display name and description
- Optional leader email — if the user doesn't exist yet, they'll be created and emailed
- A share percent (0–100) — how much of the org's $20 share goes to the cause; the rest goes to the org's general fund
Members enter the code at signup and attribution flows automatically. Changing the share % is retroactive on displayed totals.
Sales tab (cash & remit)
On Admin → Org → Sales:
- Record a cash sale — the same flow as affiliate leaders, but you can pick any code in the org.
- Seller roster manager — pick an affiliate code and manage its sellers (add, deactivate, reactivate). You can manage any code; affiliate leaders can only manage their own.
- Recent card sales — every sale (online + cash) with buyer, seller, code, payment method, amount, DOC fee, and remit status.
- Cash owed to DOC pill at the top — the running total of unremitted cash-sale platform fees. When you've sent DOC the cash, hit Mark remitted on each row (or batch later).
Managing members
On Admin → Organization → Users:
- Add user — creates a user directly with a temp password emailed to them. Members get an auto-created annual membership.
- Reset password — fresh temp password; revokes all of their existing sessions.
- Activate / Deactivate — toggle whether a user can sign in.
- Delete — soft-deletes the user; they no longer show in the user list. Historical records (memberships, sales) are preserved.
Managing businesses & offers
On the Businesses tab, add a business with name, owner email (or invite later), description, address (with Locate from address for lat/lon), categories. Click Edit on any business row to update fields, or click Offers to add/edit/hide/delete offers inline. Each row has a Flyer ↗ link to open the printable QR flyer. Featured placement controls (date + priority) live on the business edit panel.
District org rollup
If your org is a district, you'll see a Rollup tab that aggregates totals across all child orgs — gross revenue, platform fees, cause shares, org-general shares, and business counts. Click into any child org to drill in.
Audit log
Admin → Audit log shows every admin action — user edits, password resets, business changes, membership comps, redemption resets, deletions, affiliate-code changes, gift activations, card-sale creates, seller roster changes, and remits. Use it to investigate discrepancies and spot anomalies.
Cookies & analytics
We use a small first-party session cookie for signed-in users — that's strictly necessary and exempt from consent. We also use Google Analytics 4 with Consent Mode v2 to understand site usage. No analytics cookies are set until a visitor clicks Accept on the cookie banner. Reject permanently disables analytics on that browser. Clearing site data re-shows the banner. Full details are on the Privacy page.
Sellers & kid privacy
The seller-roster feature lets affiliate leaders credit kids on a leaderboard without creating user accounts for them. To minimize COPPA exposure:
- Default display is first name + last initial ("Lily B."). Affiliate leaders can switch to full last name only when needed for disambiguation.
- No email, photo, or contact info is stored on a Seller row.
- Per-row attestation: the affiliate leader checks "I affirm this seller is 13+ and the organization has authority to list them by name" before save. Recorded with timestamp and actor.
- Visibility of the leaderboard is restricted to the org admin and that code's affiliate leader. General org members never see the seller list.
Accessibility
We aim for WCAG 2.1 AA. Notable practices:
- Semantic landmark structure and a skip-to-main-content link on every page.
- Generous tap targets and reduced-motion support for animated elements like the live-clock card.
- Spanish version of the marketing home at /es/.
- Form fields are properly labelled; icon-only buttons carry accessible names.
- Color is never the sole carrier of meaning — status pills always pair color with a text label.
- Full keyboard navigation through nav, drawers, and forms with visible focus rings.
Security
- HTTPS everywhere — browsers refuse plain HTTP.
- Passwords are salted and hashed using a memory-hard algorithm — we never store plaintext.
- Session tokens are hashed server-side so a database leak can't be replayed.
- All input is validated and parameterized — no SQL injection vectors.
- Rate limits on signup, login, password reset, and lead submissions.
- CSRF protection on every state-changing request.
- Bot protection on public forms via Cloudflare Turnstile.
- Strict Content Security Policy locked down to trusted domains.
- Audit trail — every admin action that changes someone else's data records who, when, and what.
- Anti-sharing signal — if a card is used from two distant networks in a short window, we flag it and nudge the member toward a family plan.