Marketing agency Full-stack Next.js Auth, roles, scoring

The inbound pile, sorted before your first call.

Raw company names go in. A ranked call list comes out, hottest first, each with a reason and the role to ask for.

The score is checked in code, not taken from the model. Every part is an integer 0 to 25, and the total is summed server-side.

1

Raw leads arrive

A company name, sometimes a website. Nothing else.

2

Read and enriched

The real site is fetched and summarized. No URL means a labeled sample.

3

Scored on a rubric

Fit, urgency, budget, reach. Four parts, each 0 to 25.

4

Ranked, hottest first

A call list with the reason and who to ask for.

The model never gets the final word

Off-schema output is rejected and asked to correct. The total is summed from the parts.

The problem

Two hundred inbound leads and no idea who to call first.

Forms, referrals and list buys pile up in a spreadsheet. A rep scrolls it top to bottom and burns the morning on leads that were never going to buy.

The good ones sit three screens down, unread. By the time anyone reaches them, they have already booked with someone faster.

This build reads each lead, scores it against a fixed rubric, and ranks the pile, so the first call of the day is the best one on the list.

  • Sorted hottest first. One click turns the pile into a ranked call list.
  • Their real site, read. Title, meta and copy pulled live, shown next to what the model made of it.
  • Scores checked in code. Each part is validated and the total is recomputed, never trusted from the model.
How it's built

A real full-stack app, not a mockup.

The parts a buyer cannot see from the screenshots, and why they matter.

Signed sessions and roles

A one-click login mints a signed JWT. Middleware gates every page, and the manager role is enforced by the token, not just the UI.

Swappable data layer

Reads go through a LeadRepository interface. The demo reads a seed file; production swaps in Postgres and nothing else in the app moves.

SSRF-safe fetch

User URLs are resolved and checked before fetch. Private, loopback and link-local addresses are blocked, and every redirect hop is re-checked.

Hard schema validation

The model returns JSON. Each dimension must be an integer 0 to 25, the total is summed in code, and off-schema output triggers one honest retry.

Try it live

Prioritize the pile, then open the top pick.

Click Prioritize and watch eight new leads score and fly into rank. Open the top pick to see what was read from its site. Simulated data, real engineering.

This runs the same engine I would build for you. Add your own lead with a real URL and watch the live model run.

Want this running on your inbound?

Tell me where your leads land and what a good customer looks like. I will reply with the fastest honest way to score and rank them.