Skip to main content
Zenda integrates with Mercado Pago to handle session payments and deposits. As a professional, you can configure whether deposits are required and set deposit amounts for your sessions.

Payment Configuration Overview

Payment settings are part of your professional settings and control:
  • Whether deposits are required for bookings
  • The deposit amount patients must pay
  • Payment confirmation workflow

Payment Fields in Professional Settings

The payment configuration is stored in your ProfessionalSettings:
interface ProfessionalSettings {
  // ... other settings
  
  requires_deposit: boolean;      // Whether deposit is mandatory
  deposit_amount?: number | null; // Deposit amount in currency units
  
  // ... other settings
}
Reference: /workspace/source/schemas/professional_settings.ts:16-17

Configuring Deposit Requirements

Enabling Deposits

Control whether patients must pay a deposit when booking:
Set requires_deposit: true to mandate upfront paymentWhen enabled:
  • Patients must pay before confirming a reservation
  • You must specify a deposit_amount
  • Bookings are marked as pending until payment is confirmed
The validation rules:
@IsBoolean()
requires_deposit: boolean;

@IsOptional()
@IsInt()
@Min(0)
deposit_amount?: number | null;
Reference: /workspace/source/server/src/modules/professional-settings/dto/update-professional-setting.dto.ts:41-47

Setting Deposit Amount

When deposits are enabled, specify the amount:
1

Enable Deposits

Toggle requires_deposit to true in your settings
2

Set Amount

Enter the deposit amount in the currency field (minimum: 0)
3

Validate

Ensure amount is at least 1 if deposits are required
4

Save

Confirm your settings to apply the changes
If you enable deposits without setting a valid amount (at least 1), the save button will be disabled. You must provide a deposit amount greater than 0.

Settings Interface Implementation

The deposit configuration is managed in the settings UI:
const handleRequiresDeposit = (value: boolean) => {
  setIsSaved(false);
  setLocalSettings({ ...localSettings, requires_deposit: value });
};

const handleDepositAmount = (amount: number) => {
  setIsSaved(false);
  setLocalSettings({ ...localSettings, deposit_amount: amount });
};
Reference: /workspace/source/app/core/admin/components/professional-settings/ProfessionalSettings.tsx:68-75

Validation Logic

The form validates deposit settings before allowing save:
const isDepositInvalid = requires_deposit && (!deposit_amount || deposit_amount < 1);

const isConfirmDisabled = isDepositInvalid || isAddressEmpty || isSaved || disabledConfirmSection({
  originalSettings: currentProfessionalSettings,
  newSettings: localSettings
});
Reference: /workspace/source/app/core/admin/components/professional-settings/ProfessionalSettings.tsx:101-106
The save button is automatically disabled if you have requires_deposit: true but deposit_amount is not set or is less than 1.

Payment Integration

Mercado Pago Connection

Zenda uses Mercado Pago as the payment processor. When a patient books a session that requires a deposit:
  1. The reservation is created with status PENDING
  2. Patient is redirected to Mercado Pago for payment
  3. After successful payment, reservation status updates to CONFIRMED
  4. You receive notification of the confirmed booking

Reservation with Payment

When creating a reservation with payment, the system uses:
export class CreateReservationDto {
  @IsObject()
  @ValidateNested()
  @Type(() => Object)
  reservation: Reservation;

  @IsNumber()
  deposit_amount: number;  // The deposit amount from your settings
}
Reference: /workspace/source/server/src/modules/reservations/dto/create-reservation.dto.ts:5-13
The deposit_amount from your professional settings is automatically included in the reservation creation payload when deposits are required.

Payment Workflow

For Reservations with Deposits

1

Patient Selects Time

Patient chooses an available appointment slot
2

Deposit Required

System checks your requires_deposit setting
3

Payment Screen

Patient is shown the deposit amount and payment options
4

Mercado Pago

Patient completes payment through Mercado Pago
5

Confirmation

Upon successful payment, reservation status updates to CONFIRMED

For Reservations without Deposits

If requires_deposit is false:
  1. Patient selects time slot
  2. Reservation is immediately confirmed
  3. No payment processing occurs
  4. Appointment appears in your calendar

Managing Payment Status

View payment status for reservations:
  • Payment confirmed - Deposit was successfully received
  • Payment pending - Awaiting payment completion
  • No payment required - Deposit not configured
Payment status appears in:
  • Dashboard appointment cards
  • Reservation history table
  • Individual reservation details

Payment Status in Reservations

The reservation history displays payment status:
<TableHead className="col-estado">Estado de pago</TableHead>
Reference: /workspace/source/app/core/admin/components/reservations/HistoryReservations.tsx:68

Duration and Deposit Section

The settings UI combines session duration and payment configuration in one section:
<DurationSection
  sessionDurationMinutes={session_duration_minutes}
  onChange={handleDuration}
  requiresDeposit={requires_deposit}
  depositAmount={deposit_amount || 0}
  onChangeRequiresDeposit={handleRequiresDeposit}
  onChangeDepositAmount={handleDepositAmount}
/>
Reference: /workspace/source/app/core/admin/components/professional-settings/ProfessionalSettings.tsx:118-125 This section allows you to configure:
  • Session duration (15-180 minutes)
  • Deposit requirement toggle
  • Deposit amount input

Payment Alerts

The dashboard includes a payment alerts section:
<div className="small-card-admin">
  <h3 className="font-extrabold">Alertas (pagos pendientes)</h3>
  <p className="mt-2 text-[.8rem] opacity-80">No hay pagos pendientes</p>
</div>
Reference: /workspace/source/app/core/admin/components/home/DashboardAdmin.tsx:106-109 This section notifies you of:
  • Pending payments awaiting confirmation
  • Failed payment attempts
  • Payment-related issues requiring attention

Best Practices

Set Appropriate Deposits

Choose deposit amounts that balance commitment and accessibility

Clear Communication

Ensure patients understand deposit requirements before booking

Monitor Pending Payments

Regularly check dashboard alerts for payment issues

Update Settings as Needed

Adjust deposit requirements based on your practice needs

Common Scenarios

Scenario 1: Requiring Deposits

{
  "requires_deposit": true,
  "deposit_amount": 2000
}
Patients must pay 2000 currency units as deposit before confirming.

Scenario 2: No Deposits

{
  "requires_deposit": false,
  "deposit_amount": null
}
Patients can book freely without payment. Useful for established patients or specific practice models.

Scenario 3: Partial Deposits

{
  "requires_deposit": true,
  "deposit_amount": 500
}
Patients pay a smaller deposit (500) to confirm, with remaining balance due at session time.
The deposit amount should be in the smallest currency unit (e.g., cents for USD, centavos for ARS).

Validation Errors

Common validation errors:
ErrorCauseSolution
Deposit invalidrequires_deposit: true but deposit_amount < 1Set deposit amount to at least 1
Settings not savedValidation failedCheck all required fields are valid
Amount too lowdeposit_amount: 0 with deposits enabledIncrease deposit to minimum of 1

State Management

Payment settings are managed through the ProfessionalSettingsStore:
updateProfessionalSettings: async (newSettings: ProfessionalSettings) => {
  const localUrl = serverConfig.professionalSettings.patch({ id: newSettings.user_id });
  try {
    const { data } = await axiosClient.patch(localUrl, newSettings);
    set({ professional_settings: data.data });
    return data.data;
  } catch (error) {
    throw error;
  }
}
Reference: /workspace/source/store/ProfessionalSettingsStore.ts:31-40 Changes to payment settings are:
  1. Validated client-side
  2. Sent to server via PATCH request
  3. Persisted to database
  4. Updated in local state and localStorage

Next Steps

Schedule Management

Configure your working hours and availability

View Reservations

See payment status for all appointments

Build docs developers (and LLMs) love