Beaver Movers is a moving company in Ottawa. They came to us with a regular website and a regular contact form, and wanted ads on Meta to bring in booked moves. Below is what we built, what the first month of numbers looked like, and the bugs we paid for along the way.

Why a quiz

A moving request has a lot of variables: date, from where, to where, size of the place, stairs, how urgent. A long form with all of that on one screen loses people on a phone. A form that asks only for name and phone gives the dispatcher nothing to work with.

So we split it into 7 short screens, mobile first. Each screen is one question with big tap targets. The last screen asks for contact details, when the person has already invested a minute in the answers.

One question matters more than the others: how urgent the move is and what budget the person has in mind. It goes into a hidden field for manual triage. The visitor never sees it echoed back, and the dispatcher sees it first in the lead card.

Where the lead goes

The quiz posts to a small server-side script, send_lead.php, which:

  1. validates the payload,
  2. sends a card to the dispatcher's Telegram,
  3. fires the Lead event to Meta through the Conversions API with an event_id, so the browser pixel and the server event are counted once and the ad account learns from real submissions. The pixel itself loads only after cookie consent.

The Telegram bot token lives only on the server. Our first version called the Bot API from the browser, which means anyone who opened dev tools could read the token. If you are building something similar, keep every token behind your own endpoint.

The numbers

From the campaign summary on 7 August: $164.23 spent, 16 leads, $10.26 per lead, 9,606 impressions, 135 clicks, CTR 1.41%, CPC $1.22.

From the client's side at the end of July: 7 leads, 3 of them contacted, 2 booked. On 1 August a lead from the quiz turned into a move on the same day.

These are early numbers from a small budget. In September the client told us lead quality had dropped, so the numbers above describe the first month only.

Bugs we paid for

  • Logs were readable over HTTP. The lead log and the CAPI log sat in a web-accessible folder. We closed it with a deny rule in nginx and learned that the rule disappears if someone recreates the vhost. So that check now sits on the list for every server change.
  • In-app browsers. Facebook and Instagram open links in their own browser. There, visualViewport height jumps around when the toolbar hides, and the quiz screens shifted. Pinning the layout to window.innerHeight fixed it.
  • Sticky :hover on touch screens. An answer tile stayed highlighted after the tap, and people thought it was already selected. Hover styles now apply only under @media (hover: hover) and (pointer: fine).
  • Two funnels on one pixel. We ran a second landing page on the same Meta pixel and the attribution mixed. One pixel per funnel, or at least separate custom events.
  • Design tokens. Our first draft used a palette we invented. The client rejected it, fairly. The final version takes colours and fonts from their live site, so the quiz looks like part of it.

What we would reuse

For any service where a request has several variables, we now start with a quiz. One hidden qualifying question goes straight to the person who calls back. Leads travel through our own endpoint to Telegram and the Conversions API, with no tokens in the browser. And before the first ad goes live, we run the quiz inside the Facebook and Instagram in-app browsers on a real phone.

The live quiz is at beaver-movers.mmix.ca, and the case is on our site: https://mmix.biz/portfolio

We are MMIX, a small studio in Ottawa and Kyiv. We build websites, client portals, CRM set-ups and bots like this one for small businesses. If you have a funnel like this in mind, tell us about it in the comments.