Skip to content
OpenStable9 min read

Building in a market that runs on Facebook groups

How we went into horse owners’ Facebook groups with a scraper and an admin board, and what I couldn’t measure.

  • Growth
  • Marketplaces
  • Research

If you keep a horse in the UK and need a new yard, you post in a Facebook group. “Does anyone know of livery near Guildford?” Then you read the comments. Some help. Many name yards with no space, because the people replying can’t know who has room this week. In our research, owners contacted 10 to 20 yards to find two or three with a space.

Yard owners use the same groups from the other side. A yard owner with a space writes a post, gets a handful of comments, and watches it sink. Our yard research says those posts “go stale immediately, and get buried.”

That’s the market we built OpenStable for. Livery and the services around it run on a workaround: a social network standing in for a marketplace. I think that makes it a good place to build, as long as you go into the groups instead of trying to pull people out of them.

Why a workaround is a good sign

2,791
posts pulled from the groups and read

Before writing any code, you can learn three things from the groups.

The demand is real, and you can read it. Each “looking for livery in Surrey” post is an owner with a horse and a date they need to move by. We pulled 2,791 posts and read them.

Your users have written the brief. Owners ask who has space near me, now. Yard owners ask who wants my space. We built the first version around those two questions: live availability, search by area, and a direct message to the yard.

You can see where the workaround fails. The people replying can’t tell you whether a space is still free. You can’t filter a group by distance or livery type, and a post drops out of sight once newer ones arrive. We built a feature against each of those.

The catch is that the groups cost nothing and owners already belong to them. “Facebook remains dominant” was in our risk list from the first planning document. I didn’t expect a better website somewhere else to pull owners out of the groups, so we decided to reply inside them, at the moment someone asked a question OpenStable could answer.

Finding the posts

112 → 302
Facebook groups tracked, from 28 April to September

On 28 April we loaded 112 Facebook groups we already belonged to into our admin. The next day I wired in Apify’s Facebook groups scraper, a paid service that reads a group’s recent posts. We stored each post with its group, author and text.

At first I scraped one group at a time, with a button. In August I added a nightly sweep and grew the list to 241 groups. To keep costs down, the sweep asked only for posts newer than the last run and checked a monthly budget before each call: 6,000 posts, about £24 a month.

Our Apify account ran out first. From 8 August Apify refused calls with “Monthly usage hard limit exceeded”, and the sweep kept failing for weeks. On 22 September I removed the sweep, along with a second job that refreshed group sizes. Since then nothing calls Apify unless I press a button, and a test fails the build if anyone schedules a scrape again.

With scraping back in my hands, I needed to know which groups were worth the money. So I built a scrape planner. It ranks each group (302 by then) on five things:

Market
Is there a yard near this group with a space, or owners asking with no yard to send them to?
Kind
A livery group is worth more than a general horsey chat group, and an off-topic group is worth nothing.
Record
How many past posts from this group turned out to be leads.
Volume
How much a run is likely to return.
Staleness
Days since the last scrape.

It writes each reason out in words, groups the top 30 into a batch, and prices that batch against what’s left of the month’s Apify credit. If Apify doesn’t answer, the planner shows “not known” in place of a figure.

Telling a lead from noise

Post type right, on posts it hadn’t seen in training

Small trained model86.5%
86.5% right
Keyword rules73.5%
73.5% right
421M-parameter model13.6%
13.6% right
Figure 1 · 1,360 posts I relabelled by hand into nine types. The untrained model said “other” once; “other” is most of the posts.

More than two thirds of the 2,791 posts had nothing we could act on.

My first filter was a set of keyword rules. In September I found them reading yard adverts as owners looking for a yard, which meant we risked replying to a yard owner as if they needed somewhere for their horse.

I relabelled 1,360 posts by hand into nine types, such as looking for livery, offering livery, looking for a share, offering a service and other. Then I trained a small model on them: a logistic regression, a standard statistical classifier, reading word and character patterns, with the keyword rules’ verdict as one more input. On posts it hadn’t seen in training, it got the type right 86.5% of the time. The keyword rules managed 73.5%. A 421-million-parameter model given the labels and no training managed 13.6%, because it said other once in 1,360 posts, and other is most of them.

The small model runs as posts arrive and costs nothing per call. For the three rarest types, where it had 13 to 17 examples to learn from, we ask a hosted model as well.

The board

Figure 2 · The Outreach Board, rebuilt from OpenStable’s own code. Counties, counts, posts and yard names are synthetic. A red dot (Devon) means owners are asking and no yard has space: a recruitment job, so no comment.

Classified posts land on the Outreach Board in /admin. The rows are counties. The columns are what people want: a yard with space, someone seeking livery, someone seeking a farrier or physio, someone offering a service, someone looking for work, and loan or share.

My brief described the operator as “Alex, the only operator, on desktop, every few days, 20 spare minutes.” So the board works one county at a time, from the keyboard. I open a busy county and see one reply written for that county and that kind of post, filled with live counts and the names of yards with space. The posts sit underneath, freshest first. O opens the post on Facebook, C copies the reply, P marks it posted, D dismisses it, and J and K move between posts.

I set three rules for it.

Only a posted reply counts. At first, copying a reply marked the post as contacted, which counted replies I’d copied and never posted. Now a post counts once I mark it posted.

Don’t send someone to an empty page. If a county has owners asking and no yard showing space, the board doesn’t draft a reply. It flags the county as a recruitment job, because that county needs yards first, and a reply would point the owner at an empty search.

Respect the group’s rules. I tag each group by how it treats links. Where links are fine, the reply carries one. Where links must go in a comment, the draft splits in two. Where links are banned, there’s no draft, and I write by hand.

The replies are in my voice, because I posted them:

Alex Crowley

Hiya - have a look on the OpenStable site or app, 4 yards in Surrey have livery space showing right now. It’s free to search and message the yard directly 🙂

A reply in a Facebook group · the Surrey template; the real one fills in the live count

A second page, the Posting Desk, handles posts we start ourselves: a county roundup of yards with space, or one yard’s listing. It works through groups in turn, includes only yards that updated their space in the last 30 days, and puts a 14-day cooldown on a group after each post so we don’t wear out our welcome.

What it did, and what I can’t tell you

349
posts with a reply marked as posted, by late September
0
enquiries traced to a group post, as of 19 September

By late September the board showed 349 posts with a reply marked as posted. OpenStable passed a thousand accounts that month.

I can’t tell you how much of that growth came from the groups. Every link we posted carried tracking tags. Enquiries kept those tags from April, and as of 19 September none had come from a group post. We only began saving the tags against new accounts on 21 September. Replies in groups that ban links carried no link at all, so they could never show up. Someone who read a reply, closed Facebook and searched for OpenStable a week later looks the same as someone who found us on Google.

I think the groups mattered, since that’s where owners were asking. I have no number to show for it, and I’d rather say so than put an unsupported figure in the title.

What I’d keep, and what I’d do first next time

I’d make the same bet. The groups showed me where owners gather, what they ask for, and where Facebook fails them. The scraping cost about £24 a month.

I’d change the order. I built the scraper, then the sweep, then the classifier, then the board, and only then started saving where each sign-up came from. Next time the tracking goes in before the first reply, and the first weekly report asks what last week’s replies produced, even if the answer is nothing.

A measured zero is something I could have acted on.