Case study · Membership platform

I rebuilt a member directory people can actually search

A national trade association had a members-only directory made of four dropdowns and a long list of names. If you already knew who you were looking for, it worked. If you didn't, it had nothing to offer you. I replaced it with one WordPress plugin: a search page for members, four public directories, and a view that shows what the membership actually looks like. It reads straight from the association's membership system, so nobody has to keep a spreadsheet in step with it.

Open the live demo The real software, filled with invented companies and people. Sign in with admin / admin.

Client
National trade association
My role
Design and build, start to finish
Built with
WordPress plugin · PHP · plain JavaScript
Data
Membership system exports, over XML
Size
About 800 organizations, 18,000 people

1 / 5

The member hub: a search box, headline counts, four discovery shortcuts, membership-type filters and the company directory, all on one screen. A public directory of operator members with filters for industry, state, city and size, above a grid of company cards. The insights view: new members by year as a bar chart, membership mix and geographic concentration as ranked bars. A company profile in a dialog, showing address, phone, store counts, membership year and the people affiliated with that company. The members-only sign-in panel, asking for a username and password.

Everything on one screen

Search, the headline numbers, four ways in, and the directory itself. A member sees all of it without scrolling, and the list of companies starts right where the screen ends.

How I built it

    533automated tests, on the server and in a browser
    12 msserver time for a full first page
    150×faster than the query it replaced
    0build steps, dependencies or outside calls
    3 hbetween refreshes, never during a page load

    The day I learned the most

    Two weeks in, the directory came back empty. Every count at zero. The export had worked. The parsing had worked. Then every single record was quietly thrown away. Two causes, neither of them visible: a header row was being read as data, and the column names came back in a different case than my code expected. The real fix wasn't the two lines that repaired it. It was putting rows received next to records built on the admin screen, so that "nothing arrived" and "everything was discarded" could never look the same again.

    Every company and every person in these screens is invented. The client's name and real records are not here.