Work/ListingBridges
LB ListingBridgesa Stark Create plugin · v1.7.6

The rental listing platform AppFolio never built — running inside WordPress.

A deeply engineered WordPress plugin that syncs AppFolio listings, auto-generates AI content, manages showing bookings across multiple agents, runs a full REST API, and ships an Ad Manager — all in one system built from scratch.

What we built
Custom WordPress plugin system
Current version
1.7.6active development
Powers
buckeyenw.comlive
Category
Property management · rental housing
WordPress Admin · ListingBridges
Dashboard
Listings
Showings
Open Houses
Ad Manager
Settings
Tools
Active Listings
12 Available 3 Coming Soon 2 Pending
1420 Sylvania Ave — 2BR/1BA$895 / mo
Available Now · AI ✓ · Showing slots open
804 Monroe St — 3BR/2BA$1,150 / mo
Available Aug 1 · AI ✓ · YouTube tour ✓
Pending Showings
Jordan M. — 1420 Sylvania Ave
Saturday, Jun 14 at 11:00 AM
ConfirmDecline
Priya K. — 804 Monroe St
Sunday, Jun 15 at 2:00 PM
ConfirmDecline
// why this exists

AppFolio is the back office. But property managers still need a website that actually works for renters.

AppFolio is great at what it does — applications, payments, maintenance requests, owner reporting. What it doesn't give you is a branded, SEO-friendly, fully featured rental listing experience that lives on your own domain, ranks in Google, and lets potential renters interact with your inventory the way a 2025 website should.

The gap no off-the-shelf plugin fills.

🔗

No native WordPress sync

AppFolio has no official WordPress plugin. Every integration in the market is either a hosted iFrame or a manual data entry process. Neither is SEO-friendly or customizable.

🔍

AppFolio listings don't rank

Listings hosted on AppFolio's servers live on AppFolio's domain. All the search equity from traffic, clicks, and content goes to them — not you.

📅

Showing scheduling is disconnected

Property managers were manually coordinating showing requests over email and phone — with no centralized booking, no calendar, and no conflict detection.

✍️

Listing copy is whatever AppFolio gives you

AppFolio syncs raw property data — terse titles, blank description fields, no SEO metadata. The content that actually converts visitors was never there.

📣

No advertising workflow

Running ad campaigns against your own inventory meant manually tracking which listings were active, which had gone off-market, and which were worth promoting this week.

🔧

No REST API for future tools

Building a companion app, a custom search experience, or any future tooling meant starting from scratch with zero structured data to pull from.

// what listingbridges does

Six capability clusters. One plugin.

Every module built to work independently and as a system — modular architecture, no monolithic file, each responsibility in its own class.

01

AppFolio sync engine

Pulls live listing data from AppFolio on a cron schedule and keeps your WordPress inventory in sync — automatically.

core

Listing index scraper

Fetches the AppFolio /listings index, extracts all detail URLs, and queues each one for full parsing — respecting rate limits and a configurable max-items ceiling.

core

Detail page parser

Extracts address, rent, beds, baths, sqft, deposit, available date, pet policy, utilities, amenities, appliances, parking, laundry, fees, photos, and the full property description — from real DOM, not a feed.

core

WordPress CPT upsert

Each listing becomes a native WordPress custom post type (lb_listing) — indexable by search engines, manageable in the WP admin, and available to any plugin or theme that can query posts.

media

Featured image sync

Downloads and attaches the primary listing photo to the WordPress media library, so listings have real featured images rather than external references that break when AppFolio changes a URL.

media

YouTube video tour detection

Auto-detects YouTube tour videos embedded in the AppFolio gallery and extracts the video ID, URL, and timestamp. Per-listing admin override lets managers set a different video — manual always wins over scraped.

state

Status lifecycle

Tracks listing state across available, coming_soon, pending, rented, and off_market — with visibility controls (public / unlisted) per listing. State changes trigger notifications and Ad Manager alerts automatically.

02

Frontend display system

A full shortcode library and Elementor-compatible output that renders listings anywhere on any WordPress page or theme.

shortcode

[lb_listings]

Full listing grid with live AJAX filtering — search, min/max rent, beds, baths, pets, side of town. Handles 100+ listings without a page reload. Degrades gracefully with no-JS fallback.

shortcode

[lb_gallery]

Responsive photo carousel for each listing's full image set — lightbox-ready, keyboard navigable, mobile-swipe compatible.

shortcode

[lb_map]

Embedded map for each listing address — configurable provider, no API key needed for the default embed mode.

shortcode

10 data shortcodes

[lb_summary], [lb_description], [lb_rental_terms], [lb_pet_policy], [lb_amenities], [lb_utilities], [lb_appliances], [lb_open_houses], [lb_video], [lb_cta] — every data field independently addressable.

display

Hero sliders

Carousel and hero-banner shortcodes pull featured listings with optional "side of town" filtering via a ZIP-code reverse-lookup helper — so a page can show only West Toledo rentals automatically.

display

Auto-SEO injection

Per-listing title tags, meta descriptions, and OpenGraph data are written automatically from AI-generated or scraped content — every listing page is search-engine-ready with zero manual entry.

03

AI content engine

Generates SEO-optimized headings, descriptions, and meta descriptions for every listing using OpenAI, Google Gemini, or Grok — automatically, on a 5-minute cron.

ai

Multi-provider support

OpenAI, Google Gemini, and Grok (xAI) are all supported behind a single interface. Switching providers is a settings change — no code change needed.

ai

Hash-based change detection

Builds a hash of the source fields that feed the AI prompt. If the listing data hasn't changed since last generation, AI is skipped — no wasted API calls on stale listings.

ai

Failure parking

After 3 consecutive generation failures, a listing is parked — it won't consume cron ticks or API quota until an admin resets it manually. One bad listing can't exhaust the entire budget.

tools

Manual "Run AI Now" button

A dashboard button triggers a bounded catch-up batch (up to 15 listings or 20 seconds) using the same generator the cron uses — so a newly configured site can backfill immediately.

tools

Key persistence safeguard

Blank API key fields on save preserve the stored key rather than erasing it. Accidental key loss is structurally impossible — you must type a new value to change a key.

tools

Generated fields

AI produces a clean page heading, a full property description written in natural language, and an SEO meta description — each stored in separate meta fields and independently addressable.

04

Showing booking engine

A complete showing-management system built into WordPress — scheduling, conflict detection, multi-agent availability, email workflows, and shareable calendars.

scheduling

Multi-agent availability

Multiple showing agents each get their own 7-day availability grid. Available times are combined as a union — a slot is offered if any agent covers it. Different people can show on different days with no overlap conflicts.

scheduling

Conflict detection

Booked slots are blocked from the visitor calendar in real time. Conflict detection works correctly across non-UTC timezones — a bug that broke every other implementation has been fixed at the cache schema level.

scheduling

Counter-proposal flow

If a requested slot doesn't work, the property manager can propose an alternative time directly from the admin — the visitor receives a new confirmation request rather than a flat decline.

email

Full email workflow

Templated, configurable emails cover every event: request received, confirmed, declined, counter-proposal, reminders (configurable intervals), cancellation, and property-removed notices. Em-dash renders correctly in all mail clients.

calendar

Shareable ICS calendar

Every confirmed showing generates an ICS file the visitor can add to Google Calendar, Apple Calendar, or Outlook — from a link in the confirmation email, no account required.

open houses

Open house manager

Separate open house scheduling, RSVP flow, and daily digest email to the property manager — parsed directly from AppFolio listing data when available, manually manageable per-listing otherwise.

05

Public REST API

A clean, versioned REST API at /wp-json/lb/v1/ — designed for AJAX-powered filtering on large inventories and external integrations.

api

Listing collection endpoint

GET /lb/v1/listings with full filter support: search (address AND title), min/max rent, beds, baths, pets, availability state, side of town. Search actually searches addresses — the core WP search bug is patched.

api

Dynamic filters endpoint

GET /lb/v1/listings/filters returns the available filter options from the live inventory — so dropdowns always reflect what's actually in stock, not hardcoded values.

api

Single listing endpoint

GET /lb/v1/listings/{id} returns the full data payload for a single listing — everything the plugin stores, in one clean JSON response. Ready for property inspection tools, mobile apps, or partner integrations.

api

Showing slots REST API

Separate showing endpoints handle available slot queries and booking submissions — the same AJAX engine the frontend uses, exposed as proper REST routes for any consumer.

api

Sharing widget

Generates shareable links and email-share flows per listing with a real IP-based rate limiter (correctly resolves the real client IP behind Cloudflare and nginx reverse proxies).

api

Export / import

Full plugin settings and listing data can be exported to a manifest.json and re-imported — with server-side validation that rejects PHP serialized payloads in imported meta. Safe for complete site migrations.

06

Ad Manager companion plugin

A separate plugin (ListingBridges Ad Manager) that connects listing inventory to ad campaigns — with automatic off-market alerting and structured export.

companion

Curated ad selection

Property managers select and order specific listings for promotion — assigning stable ad numbers that persist through data sync cycles, so campaign creative and targeting stay paired to the right property.

companion

Off-market monitoring

A cron job monitors every listing in the active ad pool. When a listing goes off-market in AppFolio (and syncs to WP), the Ad Manager automatically flags it and sends an alert — before ad spend is wasted on a property that can't be rented.

companion

Structured export

Export the current ad selection as a structured data file — ready for ad platform import or the marketing team's workflow, without manual data entry or spreadsheet maintenance.

companion

ZIP-based targeting

Side-of-town classification by ZIP code powers "area targeting" for ad campaigns — ads for West Toledo rentals only get served to West Toledo geographic targets, automatically.

companion

Test email delivery

Built-in test email trigger confirms the full notification pipeline is working before a real off-market event happens — not after the campaign has already spent a week promoting a rented unit.

companion

DB sync on load

Every admin page load syncs the Ad Manager's listing table with the current ListingBridges inventory — keeps the ad pool accurate with zero manual reconciliation.

// the full data pipeline

From AppFolio to a ranked, bookable, AI-described listing page — automatically.

AppFolio
live rental inventory
Sync engine
index + detail parser · 15-min cron
WordPress CPT
lb_listing · native post type
AI content
heading · description · meta · 5-min cron
Listing page
SEO-ready · indexed · bookable
AppFolio scraperCPT upsertImage syncYouTube detection AI content (OpenAI / Gemini / Grok) Auto SEO metadata REST APIShowing bookingAd Manager
// ai content engine

Listings that blank out of AppFolio get described by AI — automatically.

AppFolio doesn't write your listing copy. It sends a title and a data dump. ListingBridges turns that into a full, unique, SEO-optimized property description — on every sync, without a human in the loop.

OpenAIGoogle GeminiGrok · xAIhash-based change detectionfailure parking · 3-strike
How it works
Listing syncs from AppFolio
raw title + data fields, empty description
Source hash check
if data hasn't changed, AI is skipped entirely
AI prompt with full context
address · rent · beds/baths · amenities · pet policy · tone rules
Three fields written
page heading · full description · SEO meta description
Before → After
RAW FROM APPFOLIO
Unit 2B · 1420 Sylvania Ave NW, Toledo OH 43612 · 2 bed / 1 bath
↓  ListingBridges AI, 5-minute cron
GENERATED LISTING
Spacious 2-Bedroom in Central Toledo — Laundry In-Unit, Pet-Friendly
This well-maintained 2-bedroom, 1-bathroom home on Sylvania Ave puts you minutes from downtown Toledo and the Westgate district. In-unit washer/dryer hookups, off-street parking, and an updated kitchen make this one easy to call home. Cats and small dogs welcome.
2BR / 1BApets welcomein-unit laundryToledo OH
01No wasted API calls — hash comparison skips generation if the listing data hasn't changed since last run.
02Poison listing protection — 3 consecutive failures parks the listing; one bad record can't drain the API budget.
03Key protection — blank save fields can't erase stored keys; accidental loss is structurally impossible.
04Instant backfill — "Run AI Now" button catches up a fresh install in seconds instead of waiting on cron.
// showing booking engine

A complete showing system that replaces the phone tag.

From the moment a renter clicks "Schedule a Showing" to the confirmed calendar invite in their inbox — fully automated, conflict-free, and manageable from the WordPress admin.

Visitor
Selects from available slots — calculated in real time from the combined availability of all showing agents, with confirmed bookings already blocked.
System
Sends a pending request email to the property manager with one-click Confirm and Decline links — no login required to respond.
Manager
Clicks Confirm — visitor receives a confirmed email with an ICS file they can add to any calendar. Or clicks Decline and proposes a counter-time.
Reminders
Configurable automated reminders go out to the visitor before the showing. Cancellation and property-removed notices handle last-minute changes.
Admin
All showings — pending, confirmed, declined — live in the WordPress admin dashboard with full history per listing.
👥

Multi-agent availability

Each agent gets their own 7-day schedule. The system offers a slot if any agent is free — automatically unified, deduplicated, and sorted.

🕐

Travel buffer + one-per-day rules

Configurable buffer between showings, and optional one-showing-per-visitor-per-day enforcement — no double-booking by the same person.

🌍

Timezone-correct conflicts

Conflict detection works correctly in every timezone — a v1.7.2 fix that patched a UTC comparison bug that broke every other property plugin outside UTC.

📅

ICS calendar export

Every confirmation generates a standard .ics file. One click adds the showing to Google Calendar, Apple Calendar, or Outlook — no account needed.

🏠

Open house manager

Separate from showings — parsed from AppFolio data automatically, with a per-property admin override, RSVP flow, and a daily digest email to the manager.

// public rest api

A clean API layer for everything built on top.

The same data that powers the frontend is available over a versioned REST API — ready for AJAX filtering, mobile apps, property tools, or partner integrations.

Endpoints at /wp-json/lb/v1/

GET/listingsFull listing collection — filter by search, rent range, beds, baths, pets, state, side of town. Search correctly matches against address meta (patched WP bug).
GET/listings/filtersReturns available filter options from live inventory — dropdown values always reflect what's actually in stock.
GET/listings/{id}Full data payload for a single listing — all scraped fields, AI content, state, photos, video, and meta in one JSON response.
GET/showings/slotsAvailable showing slots for a specific listing — real-time, conflict-aware, timezone-correct.
POST/showings/bookSubmit a showing request — validates the slot, creates the lb_showing CPT record, fires the pending notification workflow.

Built for VeriProper integration. Buckeye Northwest Realty's application pipeline connects to ListingBridges over this API — real-time property availability feeds directly into the property inspection and tenant management workflow.

// ad manager

Stop running ads for listings that just got rented.

A companion plugin that connects live inventory state to your ad campaigns — automatically.

ListingBridges Ad Manager

companion plugin · v0.2.1
workflow

Curated ad pool

Select specific listings for promotion and assign them stable ad numbers. The numbers persist through every AppFolio sync — so your campaign creative stays paired to the right property even as inventory changes around it.

automation

Off-market alerting

A cron job watches every listing in the active ad pool. The moment a listing goes off-market in AppFolio and syncs into WordPress, the Ad Manager flags it and sends an alert — before ad spend continues on a property that can't be rented.

targeting

ZIP-based area targeting

Side-of-town classification by ZIP code powers geographic ad targeting. Ads for North Toledo properties can be automatically filtered to only appear in the ad set targeting that part of the city.

export

Structured export

Export the current ad selection as structured data — ready for ad platform import, spreadsheet review, or the creative team's workflow. No manual data entry, no copy-pasting from AppFolio.

// who this is built for

Any property manager on AppFolio who needs a real website.

🏢

Residential property management

The primary use case. Any company managing a portfolio of rental homes or apartments on AppFolio can sync their entire inventory to a branded WordPress site — with bookable showings, AI content, and ad tooling — in one install.

🏘️

Regional rental housing companies

Built for the 50–500 unit operator who is too large for manual updates and too specialized for a generic listing site. ListingBridges gives them enterprise-grade listing management at plugin cost.

🏙️

Mixed-use & commercial managers

The data model handles commercial and mixed-use listings as naturally as residential — the same sync engine, shortcodes, and showing system work for any property type AppFolio manages.

📱

Companies building companion apps

The REST API is purpose-built for external tooling. If you're building a property inspection app, a tenant portal, or a mobile companion — ListingBridges is the data layer you plug into, not a CMS you fight against.

🔌

Agencies building for PM clients

ListingBridges is white-label friendly. Agencies managing AppFolio clients on WordPress can deploy this as a standard part of their stack — each client gets a fully managed, branded listing experience without custom development per site.

🚀

AppFolio alternatives in transition

The sync engine isn't AppFolio-exclusive at the architecture level. The scraper, CPT system, AI layer, and showing engine are all platform-agnostic. Other property management platforms are an adapter away.

// by the numbers

What's inside the plugin.

6
major capability clusters
14
frontend shortcodes
3
AI providers supported
v1.7.6
active dev · shipped every sprint

Managing rentals on AppFolio and need a website that actually works?

ListingBridges is a real product built for real property managers. Let's talk about your inventory and what it would take to get it running.

ListingBridges — designed and built by Stark Create.