Zero platform fees

Ticketing that doesn't take a cut

CommunityTix gives clubs, charities and community groups their own ticketing and membership site — RSVP events, paid tickets, Pay What You Can pricing and a members' list — for one fixed price. No per-ticket commission, ever.

Where your money actually goes

Most ticketing platforms take a slice before you ever see it. CommunityTix doesn't — here's the whole path a ticket payment takes.

A buyer checks out

They pick a ticket or Pay What You Can amount and pay securely by card, via PayPal.

Funds land in your PayPal

Payment settles straight into your organisation's own PayPal account — never CommunityTix's.

You keep 100%

CommunityTix charges one fixed subscription price — never a per-ticket cut.

A typical fee-taking ticketing platform skims a percentage plus a booking fee off every single ticket, whether you sell 20 or 2,000. CommunityTix charges the same low fixed price whatever you sell — so the more successful your event, the more you keep.

Everything in one place

Run the whole event, not just the ticket

One site for selling tickets, managing members and telling your community what's coming up next.

Events & ticketing

Free RSVP events or paid ticket events with secure PayPal checkout. Multiple ticket types, capacity limits and automatic confirmation emails.

Pay What You Can

Offer flexible pricing with a suggested amount, so anyone can come to your event regardless of budget.

Member management

Online sign-up with an admin approval step, committee roles, and the ability to suspend or reactivate members.

See every feature
Built for

Whoever runs your community's calendar

Clubs & societies

Membership renewals, committee elections and social nights, all in one members' list.

Charities & non-profits

Pay What You Can fundraisers alongside full-price ticketed galas.

Cultural associations

Recurring festivals and workshops with a branded site of your own.

Community centres

Classes, hires and open days, with capacity limits so nothing overbooks.

Find your organisation

Up and running in three steps

1

Sign up in seconds

Create your account, choose your subdomain, and start a 30-day free trial — no credit card required.

2

Add your events

Create events with ticket types, Pay What You Can pricing or free RSVPs. Upload a flyer and set a capacity.

3

Sell tickets & grow

Share your event link, take payment via PayPal, track orders and build your membership over time.

Notes on running better community events

The CommunityTix blog covers event planning, pricing and running a small organisation well.

Event planning Pricing & PWYC Membership growth Running volunteers
Read the blog

Start your free trial today

30 days, full access, no credit card required. Cancel any time.

', …), // where dollar-quote and dollar-amp are special replace tokens; and it lives in a // JS template literal that eats backslash escapes. So keep this block free of the // dollar sign and of backslash escapes: exact-match CTA texts (no regex end-anchor) // plus a space-only collapse regex. var cnxCtaTexts = ['book a demo','request a demo','get a demo','book demo','schedule a demo','talk to sales','talk to us','talk to the team','get in touch','contact us','contact sales','contact the team','contact']; function cnxIsContactCta(el){ if (el.id && el.id.indexOf('cnx-') === 0) return false; if (el.hasAttribute && el.hasAttribute('data-cnx-contact')) return true; var raw = ((el.getAttribute && el.getAttribute('href')) || '').toLowerCase(); var hh = raw.split('?')[0].split('#')[0]; if (raw === '#contact' || hh === '/contact' || hh === 'contact' || hh === 'contact.html' || (hh.length >= 8 && hh.lastIndexOf('/contact') === hh.length - 8) || (hh.length >= 13 && hh.lastIndexOf('/contact.html') === hh.length - 13)) return true; var t = (el.textContent || '').replace(/ +/g, ' ').trim().toLowerCase(); if (t.length > 24) return false; for (var k = 0; k < cnxCtaTexts.length; k++) { if (t === cnxCtaTexts[k]) return true; } return false; } document.addEventListener('click', function (e) { var el = e.target; while (el && el !== document) { if (el.tagName === 'A' || el.tagName === 'BUTTON') break; el = el.parentNode; } if (!el || el === document) return; if (cnxIsContactCta(el)) { e.preventDefault(); e.stopPropagation(); openModal(); } }, true); if (closeBtn) closeBtn.addEventListener('click', closeModal); if (scrim) scrim.addEventListener('click', function(e){ if(e.target === scrim) closeModal(); }); if (form) form.addEventListener('submit', function(e){ e.preventDefault(); var note = document.getElementById('cnx-note'), err = document.getElementById('cnx-err'), btn = document.getElementById('cnx-submit'); note.style.display='none'; err.style.display='none'; if (form.website_url && form.website_url.value){ note.style.display='block'; return; } // honeypot var payload = { name: form.name.value, email: form.email.value, company: form.company.value, phone: form.phone.value, message: form.message.value, subscribe_newsletter: form.subscribe_newsletter && form.subscribe_newsletter.checked, turnstile_token: form.turnstile_token ? form.turnstile_token.value : '', _token_ts: tsEl ? tsEl.value : tokenTs() }; if (!payload.name || !payload.email || !payload.company || !payload.phone || !payload.message){ err.textContent='Please fill in all required fields.'; err.style.display='block'; return; } if (payload.phone.replace(/[^0-9]/g, '').length < 7){ err.textContent='Please enter a valid phone number.'; err.style.display='block'; return; } btn.disabled = true; btn.textContent = 'Sending…'; post(payload).then(function(d){ if (d && d.success){ form.style.display='none'; note.style.display='block'; } else { err.textContent = (d && d.message) || 'Something went wrong — please try again.'; err.style.display='block'; btn.disabled=false; btn.textContent='Send message'; } }).catch(function(){ err.textContent='Network error — please try again.'; err.style.display='block'; btn.disabled=false; btn.textContent='Send message'; }); }); // --- Progressive enhancement: wire a site's OWN contact form to the CRM --- // Targets forms that look like contact forms (have an email field AND a // textarea/message field), aren't ours, and aren't opted out. Field mapping is // heuristic; company falls back to the entered name so the CRM never rejects. function pick(f, res){ for (var i=0;i