# Phase Handover — 14.7 Beauty Business Marketing & Loyalty Integration

## Metadata

| Field | Value |
| --- | --- |
| Phase ID | `beauty-business-14-7` |
| Title | Marketing & Loyalty Integration |
| Status | Complete |
| Service(s) | `beauty_business` |
| Version | 0.14.7.0 |
| Date | 2026-07-26 |
| Commercial product | Torbat Beauty |

## Module completion summary

Phases **14.0–14.7** are complete. Beauty Business is an independent platform (not merged with Healthcare).

| Phase | Delivered |
| --- | --- |
| 14.0 | Foundation: orgs, branches, roles, config, audit, outbox |
| 14.1 | Booking: schedules, appointments lifecycle, waiting list |
| 14.2 | Salon: treatment rooms, stations, branch policies |
| 14.3 | Catalog: service categories, beauty services |
| 14.4 | Customers: profiles with CRM refs, preferences, visit history shells |
| 14.5 | Packages: package definitions, membership plans |
| 14.6 | Staff: staff profiles, commission rules |
| 14.7 | Marketing: campaign refs, Loyalty/Communication integration configs, dispatch |

## Reusable components

| Component | Location | Reuse notes |
| --- | --- | --- |
| TenantBaseRepository | `app/repositories/base.py` | All beauty repos |
| TransactionalEventPublisher | `app/events/publisher.py` | Outbox events |
| Provider Protocols | `app/providers/contracts.py` | CRM, Loyalty, Communication, Accounting, Delivery, Experience |
| Provider mocks | `app/providers/mocks.py` | Local integration dispatch |
| BusinessFormat enum | `app/models/types.py` | salon, barbershop, clinic, laser, skin_care, hair_treatment, spa |

## Public APIs (14.7 additions)

| Method | Path | Permission | Notes |
| --- | --- | --- | --- |
| * | `/api/v1/marketing-campaigns` | `beauty_business.marketing.*` | Campaign ref shells |
| * | `/api/v1/loyalty-integrations` | `beauty_business.integrations.*` | Earn mapping config |
| * | `/api/v1/communication-integrations` | `beauty_business.integrations.*` | Template mapping |
| POST | `/api/v1/integration-dispatches` | `beauty_business.integrations.*` | Mock dispatch to providers |

## Frontend

| Route | Purpose |
| --- | --- |
| `/beauty` | Dashboard + health/capabilities |
| `/beauty/organizations`, `/beauty/branches` | Foundation |
| `/beauty/appointments` | Booking |
| `/beauty/catalog/*` | Service catalog |
| `/beauty/customers` | Customer management |
| `/beauty/staff/*` | Staff & commissions |
| `/beauty/marketing/*` | Campaigns & integrations |

BFF: `/api/beauty-business/*` → port **8011**.

## Events

| Event type | When |
| --- | --- |
| `beauty_business.marketing.campaign_ref.created` | Campaign ref registered |
| `beauty_business.integration.loyalty_config.updated` | Loyalty mapping changed |
| `beauty_business.integration.communication_config.updated` | Communication mapping changed |
| `beauty_business.integration.dispatched` | Integration dispatch executed |

## Known limitations

- Mock-only provider calls for Loyalty/Communication/Accounting/CRM/Delivery/Experience
- Secondary catalog/package entities without dedicated list APIs
- No dedicated mobile stylist / customer apps
- Healthcare module remains separate (`healthcare_db`, port 8010, `/healthcare`)

## Migration notes

| Item | Detail |
| --- | --- |
| Alembic revisions | `0001_initial` … `0008_phase_147_marketing` |
| Database | `beauty_business_db` |
| Compose | `beauty-business-service` port **8011** |
| Tests | 30 passing (`pytest -q`) |

## Validation

- Backend: 30/30 tests green
- Frontend: `npm run build` exit 0
- Tenant isolation: enforced via `X-Tenant-ID`
- Permissions: `beauty_business.*` tree

## Next steps (post-14.7 — not registered phases)

- Retail POS-lite for beauty products
- Advanced analytics dashboards
- Live provider SDK wiring
- Dedicated CRUD for secondary entities

## Related documents

- [Beauty Business Roadmap](../beauty-business-roadmap.md)
- [Service Snapshot](../service-snapshots/beauty-business.yaml)
- [Phase area README](../phases/BeautyBusiness/README.md)
