What does this PR do?

Adds LawPay payment integration for Cal.com, enabling legal professionals to accept payments through their LawPay/AffiniPay merchant accounts.

  • Fixes #11340
  • /claim #11340

Implementation Details

This PR follows the existing PayPal payment app pattern and implements:

  • OAuth 2.0 flow for connecting LawPay merchant accounts
  • PaymentService implementing IAbstractPaymentService interface
  • API endpoints: add, callback (OAuth), webhook
  • UI components: EventTypeAppCard and Settings for price configuration
  • LawPay API client for charges, refunds, and void transactions

Files Added (18 files)

packages/app-store/lawpay/
├── config.json, package.json, index.ts, zod.ts
├── api/ (add.ts, callback.ts, webhook.ts)
├── lib/ (LawPay.ts, PaymentService.ts, PaymentService.test.ts)
├── components/ (EventTypeAppCardInterface.tsx, EventTypeAppSettingsInterface.tsx)
├── pages/setup/_getStaticProps.tsx
└── static/icon.svg

Mandatory Tasks (DO NOT REMOVE)

  • I have self-reviewed the code (A decent size PR without self-review might be rejected).
  • I have updated the developer docs in /docs if this PR makes changes that would require a documentation change. N/A - App store apps are self-documented.
  • I confirm automated tests are in place that prove my fix is effective or that my feature works.

How should this be tested?

Environment Variables

Add to .env or Admin Settings:

LAWPAY_CLIENT_ID=your_client_id
LAWPAY_CLIENT_SECRET=your_client_secret

Test Steps

  1. Run yarn app-store:build to generate app metadata
  2. Go to Apps → Search “LawPay” → Click Install
  3. Complete OAuth flow with LawPay sandbox account
  4. Go to Event Types → Select an event → Enable LawPay payment
  5. Set price (e.g., $50 USD)
  6. Open booking page and verify payment option appears
  7. Complete a test booking with payment

Test Credentials

Use LawPay Sandbox for testing:

  • Test card: 4242424242424242
  • Any future expiry, any CVV

Checklist

  • I have read the contributing guide
  • My code follows the style guidelines of this project
  • I have commented my code, particularly in hard-to-understand areas
  • I have checked if my changes generate no new warnings
  • My PR is appropriately sized (18 files, ~760 lines)

Claim

Total prize pool $50
Total paid $0
Status Pending
Submitted January 28, 2026
Last updated January 28, 2026

Contributors

AN

andresctirado

@andresctirado

100%

Sponsors

CA

Cal.com, Inc.

@cal

$50