Ulric
Book a call

Eugene, Oregon · one person, whole builds

Insights

IDX by Ulric: what the three tiers actually include

IDX by Ulric: what the three tiers actually include

IDX by Ulric is the studio's third product line, after Frida and Pippin, and it is the only one whose sales page is governed by somebody else's rulebook. Its page prints three prices: $299, $599 and $999 a month. The prices are the least interesting thing on it. Almost every sentence around them is shaped by a license agreement that can switch a client's feed off, which is not a constraint most product pages carry.

The product is the MLS engine I built for a Portland brokerage, turned into something I can sell more than once. The engineering behind it is already written up: the feed itself, the statewide map, and the morning a photo pipeline failed silently. This post is about the page in front of all that, which turned out to have its own constraints.

The top of the IDX by Ulric page: a large headline reading IDX., a paragraph describing a licensed IDX feed, a search people finish and the pages that get found, running under your own license in your own database, from $299 a month, and two buttons, Ask about pricing and See it running. To the right, a drawn browser window showing a grid of listing cards with a filter column.
The top of the page. The price floor is in the second sentence, and so is the sentence the license requires: your own license, your own database.

What do the three tiers actually include?

Feed is the licensed feed and the pages built on it. Platform adds the parts that turn an anonymous visitor into a name you can call. Full adds the follow-up and the market pages. Every line below is quoted from the live page as it read on 4 September 2026, and the same three numbers appear in the page's Service schema, because a price in the markup that disagrees with the price on the page is a bug with a search engine attached.

Feed, $299 a month, the feed, synced through the day. Property search with filters and a map. City, ZIP and price hub pages. The compliance engine. The monthly report your board requires, filed for you. Purge on request, with a receipt.

Platform, $599 a month, adds visitor accounts and email confirmation, saved homes and saved searches, showing requests routed to you, and lead capture with spam screening.

Full, $999 a month, adds the assistant, CRM sync (Follow Up Boss today), follow-up sequences with a per-lead email log, and neighborhood and ZIP market pages.

The pricing section of the page, headed Three ways in: three cards reading Feed $299 a month, Platform $599 a month and Full $999 a month, each with its inclusion list, and three lines underneath saying that Feed assumes a site I built you, that board dues and data fees are paid to your board, and that setup is quoted per board.
No most-popular badge and no struck-through anchor price. What separates the cards is the content of the lists.

Three things are in no tier, and they are printed under the cards rather than left for the invoice. Your board dues and data fees are paid by you to your board, never to me. The site itself is a separate engagement, because Feed assumes a site I built you. Setup is quoted per board, because the paperwork differs per board.

Why is the compliance engine in the cheapest tier?

Because I would owe that work from the first synced row whether anyone paid for it or not. My first tier sketch had it as an upgrade, which is the obvious commercial move and the wrong one, and I corrected it while the spec was still a draft.

A matrix of fourteen inclusion rows against the three tiers, Feed at $299 a month, Platform at $599 and Full at $999. The first six rows are marked in all three columns, the next four in Platform and Full only, the last four in Full only. Three rows are marked in terracotta: the compliance engine, the monthly report filed for you, and purge on request with a receipt. A footer names what is in no tier at all: board dues and data fees, the site itself, and setup, which is quoted per board.

Two of those obligations are contractual rather than nice to have. The data has to refresh inside the window the rules set, and a service provider report goes to the board in the first week of every month. I wrote about that spreadsheet in the feed post: it was the part of the build I had budgeted nothing for. If I run a client's feed, both are mine to do. Putting either behind a $599 badge would mean the $299 tier was a tier I am not permitted to operate, which is a strange thing to advertise.

The purge sits beside them for the same reason. When an agreement ends, the rows, the files, the derivatives and the sync cursor come out, and the client gets a receipt of the counts. That is an obligation in the license, not a courtesy I am extending, and the page says so in those words.

What are the three pinned scrubs demonstrating?

The catalogue, the mechanism, and the payoff, in that order. Only two of the three have parts. A pinned stage is a tall wrapper whose inner element sticks to the viewport while you scroll past it, so the page holds still and its contents advance. Reading the markup on 4 September 2026: the hero is height:250vh with zero panels, "How it works" is 580vh with four, and "What it is worth" is 460vh with three.

The hero is the odd one. It carries no panels at all, so nothing takes turns; it just gets a progress number and drives one illustration from a catalogue of cards, through the filters narrowing, to the pages each cut of the market becomes. That is the argument of the whole product in one object, before a word of copy.

The four-part stage is the mechanism: the feed arrives, the rules are enforced, the search ends somewhere, and every cut of the territory becomes a page. The three-part stage is the payoff: sixty-nine doors instead of one, a visitor who becomes a name, and the fact that the license, the database, the code and the content stay the client's, including on the way out. Each part assembles itself as you travel through it, which is what the data-at marks do.

Part two of the pinned stage on the IDX by Ulric page, held mid-scroll: a heading reading Compliance, written down as code, four marks ticked beside it, and a dark mock listing page labelled compliant showing a brokerage badge above the fold, an estimate switched off at the seller's request, and a footer line reading refreshed 14 minutes ago, report filed.
Part two of four, caught at the point where its marks have finished arriving. The mock is drawn, not a real listing: every figure in the illustrations is invented furniture.

The engine underneath is fifty-one lines in core/assets/motion.js, shared by both themes on this site and inherited by every client fork. The whole of the selection is arithmetic on one rectangle:

var r = st.getBoundingClientRect(), span = r.height - vh;
var t = Math.min(1, Math.max(0, -r.top / span));
st.style.setProperty('--t', t.toFixed(4));
var n = panels.length,
    idx   = Math.min(n - 1, Math.floor(t * n)),
    local = Math.min(1, Math.max(0, t * n - idx));

span is the reason those inline heights exist. A stage that is not taller than the viewport has no travel, so span lands at zero or below and there is nothing to divide by. That case is caught before the division: the stage sets its progress to 1, every panel gets shown at once, and the section reads as an ordinary stack. The same branch runs under reduced motion and below the pin breakpoint. It is the honest test for this kind of effect, and the one that has bitten me before: turn the motion off, and every word must still be on the page.

There is one more thing the stages do, which is to keep the illustrations obviously illustrations. The counts in the mock browser chrome, the ticks, the bars: all drawn. The single element that could be mistaken for market data, the rising curve in the third stage's first part, carries a line under it in mono at eleven pixels:

Shape, not a forecast. No number here is measured, and none comes from any MLS.

What does a license agreement do to a sales page?

It removes the sentences everybody else in the category writes, and removes them permanently rather than as a matter of taste. Under the rules that govern this feed there is one feed and one database per participant, and a vendor operates on the participant's behalf. So there is no central Ulric listing database, there will not be one, and no sentence on the page may suggest otherwise.

The sentence the category writesWhat my page says instead
Get listings from our platformThe feed runs under your own license, in your own database, on a site you own outright
AI-powered search across your MLSIt reads what somebody typed and turns it into a search. That is the entire job
Certified by your MLSBuilt to the RMLS Rules and Regulations, and reviewed by RMLS before go-live
Works with any MLS in the countryThe reader is built on the RESO Web API standard, so it is not written against one board. Any other board is its own agreement and its own review

The second row is the one people push back on, because an assistant that answers questions about homes sounds like an assistant trained on homes. It is not. Listing rows are rendered by the application, never sent to a model, and never added to a retrieval index. The model sees the question and never the listings. I built it that way before the copy existed, which is the only order that works: you cannot write your way out of an architecture.

The fourth row cost me a paragraph I wanted. The honest FAQ answer on the page is that I have to read your board's agreement first, and that this is a conversation rather than a support ticket. Every board has its own statuses, its own disclaimer wording and its own review, and I have been through exactly one of those reviews.

One absence is worth naming. There is no comparison against competitor pricing anywhere on the page, and none here. I did gather the benchmarks while I was setting the numbers, and every one of them came from an aggregator blog or a competitor's own comparison page. None traced to a primary source, so none of it ships. It informed where I sit and it stays in the spec file.

Where does it run today?

On one site, and the page says so plainly: it runs a Portland brokerage today, not a prototype. That is Rose Real Estate, whose engagement started as a brand and a custom CMS and grew into the licensed feed, the hub pages, the accounts and the assistant. The IDX build is its own case study, and it is the proof the product page points at twice, from the hero and from the section above the pricing.

The live map on the client's site, showing clustered counts and average prices across Oregon. A strip above the fold reads the brokerage-of-record attribution beside the firm's badge, and a panel in the lower left reads: Based on information from the RMLS. Data updated 2026-09-04 19:30 UTC, above credits to OpenStreetMap contributors and OpenFreeMap.
The licensed display, uncropped: the brokerage attribution above the fold and the source line stay in frame, because a crop that removes them removes the thing they promise. Based on information from the RMLS for the period ending 4 September 2026 at 19:30 UTC.

That is the pattern for this kind of client rather than a seven-day launch story: get the site live, then add the parts that need paperwork. The feed went to production at the end of August 2026, after RMLS approved the display. Nothing about a licensed feed is finished on launch day.

What a rename missed for five days

The product was called Wren until 29 August 2026, and the rename to IDX by Ulric was supposed to be one migration. It walked the settings keys, the table names, the product name and the case study title. It did not touch three free-text columns.

So for five days /products showed a tile titled IDX by Ulric, above a paragraph that began "Wren reads your board's RESO Web API feed", above a link that said "Meet Wren". Nothing was broken. Everything rendered. The page simply disagreed with itself, and I only found it by reading my own site as a visitor would.

The second migration fixed the three columns and then swept the whole database rather than the columns I remembered, which is a query that writes the other queries:

SELECT CONCAT('SELECT COUNT(*) FROM `', table_name, '` WHERE `',
              column_name, '` LIKE ''%Wren%'';')
FROM information_schema.columns
WHERE table_schema = DATABASE()
  AND data_type IN ('char','varchar','tinytext','text','mediumtext','longtext');

Zero rows now. The general rule I took out of it: a rename migration that walks settings keys and table names will always miss the free text, because free text is where the marketing lives and marketing is not a schema. Sweep every character column in every table before you call a rename done, and read the public page afterwards with your own eyes.

The one thing still unsettled is smaller and mine to close. Screen captures of a licensed display, used in my own marketing, sit in a gap the rules do not address directly: the rule about advertising a specific property is answered by the IDX programme itself, and the rule about a server holding the database is about a server, not a picture of one. I read it, I decided the captures are fine as long as nothing is cropped away, and the confirmation question is one line I have not yet added to my next email to the board's distribution desk. The rules are pinned in the product memory, where every build reads them before it touches a listing.

Common questions

What does IDX by Ulric cost?

Three tiers, read off the product page on 4 September 2026. Feed is $299 a month: the licensed feed, property search with filters and a map, city, ZIP and price hub pages, the compliance engine, the monthly report filed for you, and purge on request with a receipt. Platform is $599 and adds visitor accounts, saved homes and searches, showing requests and lead capture. Full is $999 and adds the assistant, CRM sync, follow-up sequences with a per-lead email log, and the market pages.

Is the compliance work an upgrade?

No, it is in the cheapest tier. The refresh cadence and the monthly report to the board are obligations under the license agreement from the first synced row, so putting either behind an upgrade would mean advertising a base tier I am not permitted to operate.

Whose MLS license does the feed run under?

The client's. There is one feed and one database per participant, and I operate it as their service provider. There is no central Ulric listing database and there will not be one.

Does it work with any MLS?

The reader is built on the RESO Web API standard, so it is not written against one board, and RMLS in Portland is proven and running today. Any other board is a connection, a rules profile for its statuses and disclaimer wording, and its own review before go-live, so the honest answer is that I have to read your board's agreement first.

What is not included at any tier?

Your board dues and data fees, which you pay to your board rather than to me. The site itself, if you do not have one, because that is a separate engagement. Setup, which is quoted per board, because the paperwork differs per board.

Related

← All insights