CFP Raffle — Lottery & Raffle Back-Office
Campaign setup, ticketing, banking and a multi-client export engine for charity raffles and lotteries

Running charity raffles at scale means enforcing UK gambling limits, allocating tickets, capturing entries from scanned forms, banking the takings weekly, handling Gift Aid — and then sending each charity client their data in a completely different file format. The export problem alone had quietly become unmaintainable.
- • Manage raffle campaigns with UK gambling ticket limits enforced in the data model
- • Allocate sequential and bulk ticket numbers to supporters reliably
- • Capture entries from scanned response forms with OCR and human QA
We built CFP Raffle on Django, sharing the Insyte processing core, with raffle-specific campaign and ticketing logic, weekly banking consignments, and a declarative export engine that turns one dataset into any client’s file format without new code per client.
- • Modelled campaigns with configurable per-supporter ticket caps (default £60) for compliance
- • Allocated sequential and non-sequential ticket numbers per supporter
- • Captured entries via Claude-powered OCR of scanned forms, then human QA
A closer look
Inside the build
Real screens from CFP Lottery & Raffles's raffle management platform.


Project Overview
Charity raffles look simple from the outside and are anything but underneath: gambling-compliance limits, ticket allocation, entries arriving on paper, weekly banking, Gift Aid, and — the quiet killer — every charity client wanting their data exported in a different file format. CFP Raffle is the back-office we built for CFP Lottery & Raffles to run all of it from one system.
It shares a processing core with CFP Insyte and adds the raffle-specific logic: campaigns, ticketing, weekly consignments and a multi-client export engine.
The Strategic Challenge
- Compliance in the model. UK gambling rules cap how much a supporter can spend; that limit had to be enforced by the data model, not a sticky note.
- Entries on paper. Response forms arrive scanned and must be captured accurately, then checked.
- Weekly money. Takings needed grouping into banking consignments by payment type and reconciling, week after week.
- The export problem. Each charity wanted a bespoke file set — Pilgrims an 8-file feed, KRUK a 6-file one, RBL a universal format. Hand-building these had become unmaintainable.
How We Built It
Campaigns that enforce the rules
Campaigns carry timelines, draw dates and configurable per-supporter ticket caps (default £60), so compliance is automatic. Tickets allocate sequentially or in bulk.
OCR, then a human
Scanned forms are extracted with Claude vision OCR and then verified through the same human QA discipline as Insyte — accuracy first, because these are real entries and real money.
Banking, weekly
Each week’s takings group into consignments by payment type and reconcile with status tracking and issue flags — cheques, cash and vouchers included.
Exports as configuration, not code
The heart of the build is a declarative export engine: columns, transforms (date formats, boolean maps, address merges) and row rules are configured per client, so one dataset becomes any charity’s exact file format with no new code branch. New client, new template — not a new release.
Results & Impact
CFP Raffle runs a raffle end to end — ticketing with compliance caps, OCR + QA capture, weekly banking reconciliation, and a declarative export engine that serves many charities from one system. Gift Aid, HMRC-rate tracking, 2FA, audit logging and GDPR erasure are built into the shared core.
Technology
Django 5.2 with HTMX/Alpine, Anthropic Claude OCR, PostgreSQL 18 with per-client scoping, Celery + Redis for async exports, Cloudflare R2 storage, containerised on Coolify.
Running a bureau or high-volume operation? We build operational platforms that turn fire-fights into configuration — see software development and the related CFP Insyte case study. Talk to us.
Key Features
Campaign & Ticket Management
Create raffle, superdraw and lottery campaigns with timelines, draw dates and per-supporter ticket caps enforced for compliance.
- UK gambling limits in the model
- Sequential & bulk allocation
- Draw-date and timeline tracking
Scanned-Form OCR & QA
Capture entries from scanned response forms with Claude OCR, then verify each one through a human QA review.
- No manual entry to begin
- Every record human-verified
- Audit trail on approvals
Weekly Banking
Group each week’s takings into banking consignments by payment type and reconcile them with status tracking.
- Cheque, cash and voucher handling
- Per-week consignments
- Reconciliation issue flags
Multi-Client Export Engine
A declarative template system turns one dataset into any charity client’s exact file format — without writing new code per client.
- Pilgrims, KRUK, RBL and more
- Column transforms and row rules
- Scheduled or on-demand
Gift Aid & Compliance
Capture Gift Aid declarations, track the HMRC rate, and support GDPR erasure — with 2FA and audit logging throughout.
- Correct Gift Aid reclaim
- Auditable HMRC-rate changes
- GDPR donor erasure
"The export work used to be a constant fire-fight — every charity wanted their data a different way. CFP Raffle turned that into configuration instead of code, and combined with the OCR and weekly banking, a raffle now runs through one system from the first ticket to the final client file."
Related Projects
CFP Lottery & Raffles
We built Insyte for CFP Lottery & Raffles: a Django platform that ingests scanned donation forms, extracts them with Document AI, routes them through human QA, processes payments, reconciles banking and generates thank-you letters — with a read-only portal for the charities it serves.
Ofyse
We designed and built Ofyse, a multi-tenant SaaS platform that replaces the spreadsheet stack coworking operators rely on — unifying bookings, member CRM, recurring billing with regional tax, and multi-gateway payments behind one fast, modern workspace.
With Thanks
We built the With Thanks portal: a charity platform that automatically produces personalised thank-you videos for donors, delivers them by email, and measures opens, clicks, plays and watch-time — with a Blackbaud CRM sync that turns new gifts into thank-yous on autopilot.
Ready to Transform Your Business?
Let's discuss how we can help you achieve similar results