How a Custom WordPress Development Agency Brought Live Trip Availability to a Colorado Tour Operator
A Denver advertising agency that serves outdoor and tourism brands needed a custom WordPress development agency it could trust with an awkward problem: a tour operator wanted real-time trip availability on its WordPress site, pulled from a third-party reservation system that only offered an iframe widget. Softvole built the integration under the agency’s name.
+52%
more booking-start clicks
-57%
faster mobile LCP on trip pages
-41%
fewer availability phone calls
38
trip pages showing live dates
In this case study
Project overview
The Custom WordPress Development Agency Work Behind Live Availability
What the agency needed from a custom WordPress development agency
The tour operator’s old setup forced visitors through a reservation iframe that loaded slowly, ignored the site’s design, and could not be indexed. Visitors who wanted to know if a date was open had to click into the widget, wait, and often phone the office instead.
Our team built a custom plugin that pulls availability from the reservation provider’s API every 10 minutes, stores it in WordPress, and renders it natively on each trip page. Booking still happens in the provider’s secure checkout. Only the browsing experience moved into WordPress.
Project detail
Information
Agency
Tourism and outdoor ad agency, 22 staff, Denver
End-client
Rafting, hiking, and ski touring operator
Scope
Reservation API integration, trip templates, caching
Short answer: A custom WordPress development agency builds functionality that themes and off-the-shelf plugins cannot handle, such as API integrations, custom data models, and bespoke admin tools. Softvole built a booking availability plugin for a Denver agency’s client that lifted booking starts 52% in matched windows.
The challenge
An Iframe Was Costing Bookings
Adventure trips sell on urgency. A visitor reading about a Gore Canyon rafting day wants to know immediately whether next Saturday has seats. On the old site, that answer lived inside an embedded widget that took four to six seconds to appear on mobile and looked nothing like the rest of the page.
The agency had tried two off-the-shelf booking plugins. Neither supported the operator’s reservation system, and one conflicted with the site’s caching layer.
Data the site could not see
Because availability lived in an iframe, search engines and the site itself had no idea which trips had open dates. The agency could not build ‘trips this weekend’ pages or filters.
Rate limits on the provider API
The reservation provider allowed 600 API requests per hour. Querying it on every page view would have hit the cap within minutes on a busy Saturday.
Peak season deadline
Rafting season opens in late May. The integration had to be live and stable before the operator’s busiest six weeks.
Reading the Reservation API Before Writing Code
We asked for sandbox credentials and the reservation provider’s API documentation before quoting. Two days of testing against the sandbox answered the questions that decide whether an integration is easy or painful.
Item
Details
How to use it
Rate limit
600 requests per hour
Scheduled sync, never live calls on page view
“Changed since” filter
Available on availability endpoint
Incremental syncs use only a few requests
Deep linking into checkout
Supported with trip and date parameters
Visitors skip two steps in the provider flow
Webhooks
Only for completed bookings
Not useful for availability; stay with polling
Price data
Includes seasonal and group pricing
Show “from” price plus per-date price
The rate limit arithmetic is the reason the build stayed simple: 38 trips with incremental syncs every 10 minutes uses roughly 230 requests per hour, under 40% of the allowance. Our guide to API integration in WordPress walks through the same calculation.
The approach
A Native Availability Layer for WordPress
Our principle was simple: WordPress should display availability, the reservation system should own it. That kept payments, waivers, and inventory locked inside the provider while making the browsing experience fast.
Scheduled sync instead of live calls
A server cron job (not WP-Cron alone, which depends on traffic) pulls availability for all 38 trips every 10 minutes and writes it to a custom table. Total API usage sits around 230 requests per hour, well under the cap.
REST API
Server cron
Custom tables
Native trip date calendar
Each trip page renders a lightweight calendar with seats remaining and price per date. Clicking a date opens the provider checkout pre-filled with trip and date, so visitors skip two steps.
Vanilla JS
Deep links
New landing pages from live data
Because availability now lives in WordPress, we built auto-updating pages such as ‘Trips with seats this weekend’ and ‘Family-friendly trips in June’ that the agency now uses in paid campaigns.
Dynamic landing pages
Query filters
Fail-safe behavior
If the API is unreachable, pages show the last successful sync with a timestamp and a ‘confirm availability’ prompt. The site never shows a blank calendar.
Error handling
Redis object cache
Admin tools the operator can use
A settings screen lets office staff hide a trip, add a sold-out banner, or force a resync without calling a developer.
Admin UI
Capabilities
How the Integration Is Built
The plugin has four parts, deliberately kept separate so each can be tested and replaced independently.
Sync service: a server cron job calls the API, compares the “updated” timestamp, and writes changes to a custom table. WordPress’s own WP-Cron depends on site traffic, so it is used only as a fallback.
Data layer: one row per trip per date, with seats, price, and the time of the last successful sync.
Display blocks: a calendar block for trip pages and a query block for dynamic landing pages such as “trips with seats this weekend.”
Admin tools: sync status, manual resync, sold-out banners, and a hide-trip switch for office staff.
Payments, waivers, and inventory stay in the provider. That boundary keeps the client’s PCI scope unchanged and means WordPress never holds customer payment data.
What Did Not Go to Plan
Time zones broke the calendar for one day
The API returned dates in UTC. Late-afternoon trips in Mountain Time appeared on the following day in the first staging build. We caught it during QA by checking every trip that started after 5 p.m., converted dates using the site’s timezone setting, and added an automated test for it.
The provider changed a field name mid-project
In week four, the provider renamed a price field in a minor API release. Because the field mapping lived in one configuration file, the fix took 20 minutes. We now subscribe to the provider’s changelog as part of the client’s care plan.
Who Did What
Role
Responsibility
Agency account director
Client contact, scope approval, campaign planning
Operator’s office manager
Trip data checks, admin tool testing
Softvole lead developer
Sync service, data layer, admin tools
Softvole front-end developer
Calendar block, landing page blocks
Softvole QA
Timezone, failure mode, and load testing
The office manager’s testing mattered more than expected. She spotted two trips with unusual pricing rules that sandbox data never showed.
Results
Faster Trip Pages and More Booking Starts
We compared the 56 days of peak season after launch in 2026 with the same 56 calendar days in 2025, because tour demand is strongly seasonal. A plain before and after comparison would have been misleading.
Trip pages, peak season 2025 vs peak season 2026
Metric
Before
After
Change
Booking-start clicks (56 days)
1,212
1,842
+52%
Trip page sessions (56 days)
31,450
33,980
+8%
Median mobile LCP on trip pages, lab (seconds)
5.1s
2.2s
-57%
Availability phone calls logged by office
388
229
-41%
Booking-start rate
3.9%
5.4%
+1.5 pts
Booking-start clicks (56 days)
Before: 1,212
After: 1,842
Trip page sessions (56 days)
Before: 31,450
After: 33,980
Median mobile LCP on trip pages, lab (seconds)
Before: 5.1s
After: 2.2s
Availability phone calls logged by office
Before: 388
After: 229
Booking-start rate
Before: 3.9%
After: 5.4%
BeforeAfter
How we measured these results
Business figures: Booking starts are clicks that open the provider checkout, tracked as a GA4 event. Phone calls come from the office call log, tagged ‘availability’ by staff. Rate equals booking starts divided by trip page sessions.
Speed: LCP is the median of three Lighthouse mobile lab runs across five representative trip pages. Lab figures, not field data.
Attribution: 2026 snowpack produced stronger river flows than 2025, which may have lifted rafting demand. Trip page sessions rose 8%, so most of the booking gain came from the higher booking-start rate, not traffic alone.
The practical win for the agency: The agency added a recurring paid search campaign built on the new live-availability landing pages, which it now manages on a monthly retainer.
Handoff and What Happened Next
The agency received the full plugin source in Git, a README covering credentials, sync schedule, logs, and rate-limit usage, and an admin guide for the operator’s office team. Because availability now lives as real data on the site, the agency built paid search campaigns on dynamic landing pages, something the iframe made impossible. We added Event structured data to scheduled departures so search engines can read dates directly.
We would test with real production data, read-only, earlier in the project. The sandbox did not include multi-day trips with split pricing, which we only met in week four. We would also write the timezone test on day one; date handling is a known risk in every booking integration, and a test costs minutes. And we would set up changelog alerts for the provider’s API before the build starts, not after the first breaking change.
What Agencies Should Know About Custom Integrations
Sync, do not query
When a third-party API has rate limits, sync on a schedule and cache locally. Your page speed and your API quota will both thank you.
Keep money in the right system
Display data in WordPress, process payments in the provider. It reduces PCI scope and keeps liability where it belongs.
Data unlocks campaigns
Once availability lives in WordPress, your marketing team can build pages and ads around it. That turns a dev project into ongoing agency revenue.
Frequently asked questions
What does a custom WordPress development agency do?
It builds WordPress functionality beyond themes and stock plugins, including custom plugins, API integrations, custom post types, and admin tools. Softvole does this work white label for agencies.
Can WordPress show live data from a booking system?
Yes. The reliable approach is a scheduled sync that stores availability in WordPress and renders it natively, while bookings and payments stay in the provider’s checkout.
How long does a custom WordPress integration take?
This integration took six weeks from discovery to launch. Smaller integrations with a well-documented API often take two to four weeks.
Who owns the custom plugin code?
The agency or its client does. Softvole hands over the full source in Git with documentation, and there are no licensing locks or Softvole branding in the code.
A Raleigh marketing firm wanted to stop selling one-off contractor websites at thin margins and become
Result
A Profitable Subscription Business
We compared the agency’s last six custom contractor builds in 2025 with the first five months of the subscription platform (April to August 2026).
Contractor website production, custom builds vs WaaS platform
Metric
Before
After
Change
Build hours per site
34
9
-74%
Days from signup to launch
31
8
-74%
Sites launched per month
2
9
+350%
Care hours per site per month
1.6
0.4
-75%
Monthly cancellation rate
3.5%
1.4%
-2.1 pts
Build hours per site
Before: 34
After: 9
Days from signup to launch
Before: 31
After: 8
Sites launched per month
Before: 2
After: 9
Care hours per site per month
Before: 1.6
After: 0.4
Monthly cancellation rate
Before: 3.5%
After: 1.4%
BeforeAfter
How we measured these results
Business figures: Build and care hours come from the agency’s and Softvole’s time tracking. The earlier cancellation rate is for the agency’s old hosting plans, which is the closest comparable recurring product.
Speed: Starter designs score a median mobile LCP of 1.6 seconds in lab tests, but speed was not compared before and after.
Attribution: Five months is early for churn data, and spring and summer are busy seasons for contractors. We will revisit churn after a full year.
The practical win for the agency: Subscription revenue now covers the agency’s fixed costs each month, which changes how it hires and how it prices other services.
A Brooklyn design studio had built an architecture firm’s original Squarespace site in 2021. Four years
Result
More Inquiries and Faster Publishing
We compared the 56 days before launch with the 56 days after launch. We also confirmed that late fall is not a seasonal peak for the firm’s inquiries.
Architecture firm site, before and after migration
Metric
Before
After
Change
Project inquiries (56 days)
46
68
+48%
Average portfolio pages viewed per session
2.3
4.1
+78%
Minutes to publish a new project
120
25
-79%
Median mobile LCP on project pages, lab (seconds)
6.2s
2.1s
-66%
Projects published in the period
2
7
+250%
Project inquiries (56 days)
46
68
Average portfolio pages viewed per session
2.3
4.1
Minutes to publish a new project
120
25
Median mobile LCP on project pages, lab (seconds)
6.2s
2.1s
Projects published in the period
2
7
Before After
How we measured these results
Business figures: Inquiries are contact form submissions, excluding vendor solicitations and job applications. Pages per session counts portfolio and project pages only.
Speed: LCP is the median of three Lighthouse mobile lab runs on four project pages. Lab figures only.
Attribution: Five backlogged projects were published right after launch, which added fresh content and likely contributed to engagement. The firm also won a regional design award during the after window.
The practical win for the agency: The studio now offers the same migration and portfolio system to two other architecture clients, delivered through Softvole.
A Seattle content marketing agency serving B2B SaaS companies had 140 open WordPress tickets across nine
Result
Backlog Cleared, Publishing Back on Schedule
We compared Q4 2025, before the engagement, with Q2 2026, the second full quarter with the dedicated developer.
Agency WordPress operations, Q4 2025 vs Q2 2026
Metric
Before
After
Change
Open WordPress tickets (end of period)
140
12
-91%
Median ticket turnaround (business days)
4.8
1.0
-79%
Tickets closed per quarter
96
241
+151%
Missed content publish dates per quarter
17
2
-88%
Pages built by writers without a ticket
0
63
+63
Open WordPress tickets (end of period)
Before: 140
After: 12
Median ticket turnaround (business days)
Before: 4.8
After: 1.0
Tickets closed per quarter
Before: 96
After: 241
Missed content publish dates per quarter
Before: 17
After: 2
Pages built by writers without a ticket
Before: 0
After: 63
BeforeAfter
How we measured these results
Business figures: Ticket data comes from the agency’s Jira board. Missed publish dates were counted from the editorial calendar where a piece moved because of a technical blocker.
Speed: Page speed was not a goal of this engagement, though six of nine sites improved after theme cleanup.
Attribution: Some of the backlog reduction came from closing tickets that were no longer relevant during the audit (21 tickets). We report closed tickets separately to show real throughput.
The practical win for the agency: The agency added a technical SEO offer for its SaaS clients, delivered by the same dedicated developer, without adding headcount.
A Repeatable Workflow
Need reliable WordPress capacity behind your agency?
Bring a client brief, an approved Figma file, or a project your internal team cannot take on right now. We will scope the work, identify dependencies, and tell you what it would take to deliver it under your brand.