Install & activate
Dog Walking Business is a standard WordPress plugin — no build step, no Composer required for production.
- Download the plugin ZIP from the checkout email or your Freemius account.
- WordPress admin → Plugins → Add New → Upload Plugin. Select the ZIP and activate.
- On first activation the plugin creates its database tables (customers, pets, appointments, invoices, subscriptions, transactions, and more) and a
dwb_customeruser role.
First-run checklist
- Create your services — Dog Walking → Services → Add. Name, duration, base rate, additional-pet rate.
- Create a "My Account" page — add a page containing
[dwb_my_account]. Then go to Settings → Dog Walking → My Account page and select it. - Create a booking page — add a page containing
[dwb_booking_form]. - Connect Stripe — Settings → Payments → paste publishable + secret keys, add webhook secret (instructions below).
- Configure email notifications — Settings → Emails → pick which notifications are on, edit templates as needed.
- (Optional) Connect Google Calendar — Integrations → Google Calendar → Connect.
Shortcodes
| Shortcode | What it renders |
|---|---|
[dwb_booking_form] | Full public booking flow — service picker, date/time, pets, customer fields, Stripe Checkout handoff. |
[dog_walking_pricing] | Pricing table derived from your active services. |
[dwb_my_account] | Customer portal (requires login as a dwb_customer user). Upcoming, invoices, pets, profile. |
[dwb_contact_form] | Rate-limited contact form. Entries land in the admin Contact Entries list. |
Services
A service is what a customer books — a 30-minute walk, a full day of daycare, an overnight pet-sit. Each service has:
- Name + service type (walk, daycare, overnight, etc.) for grouping.
- Duration (the default time blocked on your calendar).
- Base rate — the price for one pet.
- Additional-pet rate — added for each pet beyond the first.
- Active toggle — hide obsolete services without losing their history.
Pricing model
By default the price for a booking is:
total = base_rate + (additional_pet_rate × (pet_count - 1))
Custom rates can override the base rate and/or additional-pet rate on a per-customer, per-service basis. Set these from the customer's detail page.
Customers & pets
Customers are stored in a dedicated table with name, email, phone, address, and optional house access note (key codes, lockbox, alarm PIN — the stuff you need to remember). Each customer has zero or more pets; each pet tracks species, breed, age, weight, temperament, medical needs, and special instructions.
Appointments
An appointment is a scheduled service for one customer, one service, one or more pets, on a specific date and time. Statuses: Pending (awaiting approval) → Scheduled → Completed → Cancelled.
Auto-approval policy (Settings → Bookings):
- None — you approve every booking manually.
- Existing customers only — returning customers are auto-confirmed; new customers wait for review.
- All — fully self-serve.
Recurring appointments
For weekly / biweekly / monthly regulars, create a recurring series. The plugin generates individual appointments that can be edited or cancelled one at a time without breaking the parent schedule. Use with a Stripe Subscription (below) for completely hands-off billing.
Payment methods
Four payment methods are supported, and each one can be independently enabled and re-ordered on the booking form / invoice page:
| Method | Type | How it works |
|---|---|---|
| Credit / debit card | Automated (Stripe) | Stripe Checkout charges the card; the webhook auto-marks the invoice paid. |
| Venmo | Manual | Customer taps your Venmo username; pays via the Venmo app; admin marks invoice paid when funds arrive. |
| Zelle | Manual | Customer sees your Zelle contact (email / phone) + instructions; sends via their bank; admin confirms. |
| PayPal | Manual | Customer sees your PayPal username + instructions; sends via PayPal; admin confirms. |
The order methods appear to the customer is controlled by Settings → Payments → Method order. Drag to reorder.
Stripe setup
- From your Stripe dashboard, grab the publishable and secret API keys. Paste them into Settings → Payments → Stripe. Toggle test / live as needed.
- Create a webhook endpoint pointing at
https://yoursite.com/wp-json/dwb/v1/stripe-webhook. - Select these events:
checkout.session.completed,payment_intent.succeeded,payment_intent.payment_failed,charge.refunded,customer.subscription.*,invoice.paid,invoice.payment_failed. - Copy the webhook signing secret into Settings.
Venmo, Zelle & PayPal
For each manual method you enable, you'll configure:
- Username / contact — the handle or email customers send payment to.
- Instructions — free-form text shown alongside the username (e.g. "Include invoice number in the payment note.").
When a customer picks a manual method, the invoice status flips to Pending and you'll see the payment instructions the customer was shown. When the funds land, open the invoice and click Mark Paid — the transaction is logged and the customer receives a receipt email.
?txn=pay deep-link, so tapping the method on mobile opens the Venmo app pre-filled.Invoices
Every paid appointment creates an invoice. From the Invoices list you can send a payment link by email (Stripe Checkout), mark manually-paid, void, or consolidate multiple unbilled appointments for a single customer into one invoice.
| Status | Meaning |
|---|---|
| Draft | Not yet sent to customer. |
| Sent | Payment link has been emailed. |
| Pending | Customer clicked a manual method; awaiting bank transfer / cash. |
| Paid | Settled. Transaction row exists. |
| Overdue | Past due date, unpaid. |
| Void | Cancelled invoice. |
Subscriptions (recurring billing)
Attach a Stripe subscription to a recurring-appointment series to auto-bill your regulars. The plugin creates the Stripe price server-side and sends the customer a Checkout link to save their card and authorize ongoing billing.
When a subscription renews, Stripe fires invoice.paid; the plugin records the payment in the transactions ledger and keeps the subscription marked active.
Refunds
From any paid appointment or invoice, click Refund. You can refund the full amount or a partial amount; Stripe is called synchronously and the transaction status is updated to refunded or partially_refunded. The customer receives a refund email automatically.
The customer portal
Every customer with a linked WordPress user (role dwb_customer) can sign in and see:
- Upcoming appointments, with pet names and service.
- Past appointments and any outstanding invoices.
- Invoice detail with line items and a pay-now button.
- Editable profile (name, email, phone, address, house-access note).
- Editable pet profiles (breed, age, weight, temperament, medical needs).
Google Calendar sync
One-way sync from Dog Walking Business → Google Calendar. OAuth connect from Integrations → Google Calendar, pick the calendar, and every appointment you create (or that customers book) appears on your Google Calendar with the pet name, service, address, and key code in the event description.
Email notifications
| Trigger | Email sent to |
|---|---|
| New booking | Admin (new-booking alert) |
| Booking approved | Customer |
| Payment link sent | Customer |
| Payment received | Customer (receipt) |
| Appointment reminder | Customer (24h before) |
| Subscription renewed | Customer |
| Subscription payment failed | Admin + customer |
Every template is editable and supports merge tags like {customer_name}, {pet_names}, {appointment_date}, {service_name}, {total_amount}, {payment_link}, {my_account_url}.
Roles & permissions
| Role | Can do |
|---|---|
| Administrator | Everything — settings, integrations, all customers & appointments. |
| Shop Manager (Editor) | All customer & appointment operations, no plugin settings. |
| dwb_customer | Read/write their own profile, pets, appointments, invoices only. |
Hooks
Fires when an appointment moves from pending → scheduled.
Fires after a successful Stripe payment. Params: $appointment_id, $amount.
Fires when a Stripe subscription is canceled.
Fires on invoice.payment_failed.
Return true when your site sits behind a trusted reverse proxy that sets X-Forwarded-For. Default false.
REST endpoints
| Route | Purpose |
|---|---|
POST /dwb/v1/stripe-webhook | Stripe event receiver (signature-verified). |
Most frontend mutations go through admin-ajax with rate limiting (contact form, returning-customer lookup) and nonce/capability checks on everything that touches a customer record.
Template overrides
Copy an email template into your theme to customize it without losing changes on plugin update:
your-theme/
└── dog-walking-biz/
└── emails/
├── booking-confirmation.php
├── payment-link.php
├── payment-receipt.php
└── appointment-reminder.php