PHPackages                             shelfwood/php-pms-clients - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. shelfwood/php-pms-clients

ActiveLibrary[API Development](/categories/api)

shelfwood/php-pms-clients
=========================

PHP clients for various Property Management Systems (PMS) like Mews and Booking Manager.

v5.5.6(1mo ago)01.2k↓66.7%MITPHPPHP ^8.2CI passing

Since May 10Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/j-shelfwood/php-pms-clients)[ Packagist](https://packagist.org/packages/shelfwood/php-pms-clients)[ RSS](/packages/shelfwood-php-pms-clients/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (2)Dependencies (16)Versions (44)Used By (0)

PHP PMS Clients
===============

[](#php-pms-clients)

This repository contains PHP clients for Property Management Systems (PMS).

Supported Property Management Systems
-------------------------------------

[](#supported-property-management-systems)

- [BookingManager](https://www.bookingmanager.com/)
- [Mews](https://www.mews.com/)

Installation
------------

[](#installation)

```
composer require shelfwood/php-pms-clients
```

Laravel Integration
-------------------

[](#laravel-integration)

### Automatic Service Provider Registration

[](#automatic-service-provider-registration)

The package will automatically register its service provider in Laravel applications using auto-discovery.

### Configuration Publishing

[](#configuration-publishing)

Publish the configuration file to customize HTTP client behavior:

```
php artisan vendor:publish --tag=php-pms-config
```

This creates `config/php-pms.php` with the following options:

```
return [
    'http' => [
        'timeout' => env('PHP_PMS_HTTP_TIMEOUT', 30),
        'verify_ssl' => env('PHP_PMS_VERIFY_SSL', true),
        'debug' => env('PHP_PMS_HTTP_DEBUG', false), // Only works in local environment
    ],
    // ... other configuration options
];
```

### Environment Variables

[](#environment-variables)

Add these to your `.env` file:

```
# HTTP Client Configuration
PHP_PMS_HTTP_TIMEOUT=30
PHP_PMS_VERIFY_SSL=true
PHP_PMS_HTTP_DEBUG=false

# BookingManager Configuration
BOOKING_MANAGER_BASE_URL=https://xml.billypds.com
BOOKING_MANAGER_API_KEY=your-api-key-here

# Logging
PHP_PMS_LOGGING=false
PHP_PMS_LOG_CHANNEL=default
```

### Controlling Debug Output

[](#controlling-debug-output)

The verbose HTTP debug output (cURL verbose mode) can be controlled via environment:

- **Production/Staging**: Debug output is always disabled for security
- **Local Environment**: Set `PHP_PMS_HTTP_DEBUG=true` to enable debug output
- **Default**: Debug output is disabled by default

This prevents the verbose cURL output that appears in `art queue:listen` when `APP_DEBUG=true`.

Debugging
---------

[](#debugging)

A CLI tool is included to help debug the BookingManager API integration using a production key. It runs a sequence of non-destructive read calls to verify data is being returned and mapped correctly.

The sequence is:

1. Fetch all properties.
2. Fetch details for a specific property (either the first one found or one you specify).
3. Fetch calendar changes for the past week.
4. Fetch the calendar/availability for that property for the next 30 days.
5. Fetch a sample rate for a future stay at that property.

**Usage:**

Make the script executable:

```
chmod +x bin/debug-bookingmanager
```

Run the script with your API key:

```
./bin/debug-bookingmanager YOUR_API_KEY_HERE
```

Optionally, you can specify a property ID to test:

```
./bin/debug-bookingmanager YOUR_API_KEY_HERE 21663
```

The script will output the parsed XML data and the final mapped PHP object for each step, which is useful for verifying that all data fields are correctly set up in the PMS.

Testing
-------

[](#testing)

The test suite uses [Pest](https://pestphp.com/) and employs a comprehensive **Golden Master** testing approach. For each API endpoint, we validate the entire response object against a canonical "golden" version, ensuring 100% of fields are mapped correctly for both rich and edge-case responses.

The testing strategy includes:

- **Golden Master Validation**: Each endpoint test validates every field in the response against expected data
- **Edge Case Coverage**: Tests for minimal properties, inactive properties, empty responses, and comprehensive data
- **485+ Assertions**: Comprehensive validation covering all response object properties
- **Curated Mock Data**: Real-world XML responses extracted from production data for accurate testing

**Test Structure:**

- `tests/Endpoint/BookingManager/` — Endpoint-level integration tests for BookingManager API
- `tests/Helpers/` — Reusable assertion helpers and test data
- `mocks/bookingmanager/` — Comprehensive mock XML responses including edge cases

**Running Tests:**

```
# Run all tests
vendor/bin/pest

# Run tests for a specific endpoint
vendor/bin/pest --filter="PropertyEndpointTest"

# Discover property variance in mock data
./bin/discover-property-variance
```

Project Structure
-----------------

[](#project-structure)

- `src/` — Library source code, organized by PMS and concern.
- `tests/Endpoint/BookingManager/` — Endpoint-level integration tests for BookingManager API.
- `mocks/` — Mock XML responses for deterministic test scenarios.
- `bin/` — Executable CLI tools for debugging and other tasks.

###  Health Score

48

—

FairBetter than 95% of packages

Maintenance89

Actively maintained with recent releases

Popularity19

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~8 days

Total

42

Last Release

53d ago

Major Versions

v0.2.0 → v2.1.02025-06-16

v2.1.0 → v3.0.02025-06-17

v3.8.0 → v4.0.02025-12-23

v4.0.0 → v5.0.02025-12-24

### Community

Maintainers

![](https://www.gravatar.com/avatar/e09f1c5f884add18861aa69eaae3c669601e867050f35112ca6691a0c1ba6e7a?d=identicon)[j-shelfwood](/maintainers/j-shelfwood)

---

Top Contributors

[![j-shelfwood](https://avatars.githubusercontent.com/u/14902964?v=4)](https://github.com/j-shelfwood "j-shelfwood (88 commits)")

###  Code Quality

TestsPest

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/shelfwood-php-pms-clients/health.svg)

```
[![Health](https://phpackages.com/badges/shelfwood-php-pms-clients/health.svg)](https://phpackages.com/packages/shelfwood-php-pms-clients)
```

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[vluzrmos/slack-api

Wrapper for Slack.com WEB API.

102589.1k3](/packages/vluzrmos-slack-api)[ashallendesign/laravel-exchange-rates

A wrapper package for interacting with the exchangeratesapi.io API.

485677.8k](/packages/ashallendesign-laravel-exchange-rates)[smodav/mpesa

M-Pesa API implementation

16363.7k1](/packages/smodav-mpesa)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)[avalara/avataxclient

Client library for Avalara's AvaTax suite of business tax calculation and processing services. Uses the REST v2 API.

517.9M7](/packages/avalara-avataxclient)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
