invy/WHATSAPP_FIX_SUMMARY.md

6.2 KiB

WhatsApp Template Payload Fix - Complete Summary

Problem Resolved

Error: (#132000) Number of parameters does not match the expected number of params

This error occurred because:

  1. Wrong payload structure - Parameters weren't inside the required "components" array
  2. Missing fallbacks - Empty/null parameters were being sent
  3. No validation - Parameters weren't validated before sending to Meta

What Was Fixed

1. Payload Structure (Critical Fix)

BEFORE (Wrong):

{
  "template": {
    "name": "wedding_invitation",
    "language": {"code": "he"},
    "parameters": {      // ❌ Wrong placement
      "body": [...]
    }
  }
}

AFTER (Correct - Meta API v20.0):

{
  "template": {
    "name": "wedding_invitation",
    "language": {"code": "he"},
    "components": [{     // ✅ Correct structure
      "type": "body",
      "parameters": [
        {"type": "text", "text": "דביר"},
        {"type": "text", "text": "שרה"},
        ...
      ]
    }]
  }
}

2. Parameter Mapping (Strict 7-Parameter Order)

Your template has 7 variables that MUST be sent in this EXACT order:

Placeholder Field Example Fallback
{{1}} Guest name "דביר" "חבר"
{{2}} Groom name "דביר" "החתן"
{{3}} Bride name "שרה" "הכלה"
{{4}} Hall/Venue "אולם בן-גוריון" "האולם"
{{5}} Event date "15/06" "—"
{{6}} Event time "18:30" "—"
{{7}} RSVP link "https://invy.../guest" Built from FRONTEND_URL

3. Added Parameter Validation

New function: validate_template_params(params, expected_count=7)

Validates:

  • ✓ Exactly 7 parameters required
  • ✓ No empty strings or None values
  • ✓ All parameters are strings
  • ✓ Raises readable error if invalid

Example error handling:

# If only 5 parameters sent:
WhatsAppError("Parameter count mismatch: got 5, expected 7. Parameters: [...]")

# If a parameter is empty:
WhatsAppError("Parameter #2 is empty or None. All 7 parameters must have values.")

4. Safe Fallback Values

The system ALWAYS sends 7 parameters - never omits one. If a field is missing:

param_1_contact_name = (guest_name or "").strip() or "חבר"
param_2_groom_name = (partner1_name or "").strip() or "החתן"
param_3_bride_name = (partner2_name or "").strip() or "הכלה"
param_4_hall_name = (venue or "").strip() or "האולם"
param_5_event_date = (event_date or "").strip() or "—"
param_6_event_time = (event_time or "").strip() or "—"
param_7_guest_link = (guest_link or "").strip() or f"{FRONTEND_URL}/guest?event_id=..."

5. Debug Logging (Temporary)

Before sending to Meta API, logs show:

[WhatsApp] Sending template 'wedding_invitation' Language: he, 
To: +972541234567, 
Params (7): ['דביר', 'דביר', 'שרה', 'אולם בן-גוריון', '15/06', '18:30', 'https://invy...guest']

On success:

[WhatsApp] Message sent successfully! ID: wamid.xxxxx

On error:

[WhatsApp] API Error (400): (#132000) Number of parameters does not match...

Files Changed

backend/whatsapp.py

  • Added logging import
  • Added validate_template_params() function
  • Fixed send_template_message() payload structure
  • Fixed send_wedding_invitation() to:
    • Map 7 parameters in correct order
    • Add safe fallback values for all params
    • Use env vars for template name and language
    • Add debug logging before API call
  • Added error logging on failures

.env Configuration (Important!)

Your .env file MUST have:

WHATSAPP_TEMPLATE_NAME=wedding_invitation
WHATSAPP_LANGUAGE_CODE=he
WHATSAPP_ACCESS_TOKEN=your_token_here
WHATSAPP_PHONE_NUMBER_ID=your_phone_id_here
FRONTEND_URL=http://localhost:5174

Verify values match:

  1. Template name exactly as it appears in Meta Business Manager
  2. Language code matches your template (he for Hebrew)
  3. Phone number ID is correct (verify at Meta dashboard)
  4. Access token has scopes: whatsapp_business_messaging, whatsapp_business_management

Testing the Fix

Test 1: Verify Payload Structure

cd backend
python test_payload_structure.py

Expected output:

✓ Parameters: 7/7
✓ Structure: Valid (has 'components' array)
✓ All validations passed!

Test 2: Send Single WhatsApp

  1. Open app at http://localhost:5174
  2. Login as admin
  3. Go to event with guests
  4. Select 1 guest
  5. Click "💬 שלח בוואטסאפ"
  6. Fill in the wedding details form
  7. Click "שלח"

Expected success:

  • Guest receives WhatsApp message
  • App shows "Message sent!"
  • Backend logs show: [WhatsApp] Message sent successfully! ID: wamid.xxx

Test 3: Check Backend Logs for Parameter Debug

# Backend terminal should show:
[WhatsApp] Sending template 'wedding_invitation' 
Params (7): ['guest_name', 'groom_name', 'bride_name', 'venue', 'date', 'time', 'link']
[WhatsApp] Message sent successfully! ID: wamid.xxxxx

After Confirming Everything Works

Remove debug logging by commenting out these lines in whatsapp.py:

  • Lines in send_template_message() with logger.info() and logger.error() calls
  • Lines in send_wedding_invitation() with logger.info() call

This keeps the service production-ready without verbose logging.


Acceptance Criteria

  • Payload structure matches Meta API v20.0 requirements (has components array)
  • Always sends exactly 7 parameters in correct order
  • Fallback values prevent empty/null parameters
  • Parameter validation catches errors before sending to Meta
  • Debug logging shows what's being sent
  • Single guest send succeeds and returns message ID
  • Bulk send shows success/fail per guest
  • No more (#132000) Number of parameters errors

Next Steps

  1. Restart backend (if not already running): python start_server.py
  2. Test sending a WhatsApp message to confirm it works
  3. Check backend logs to see the debug output
  4. Verify guest receives the WhatsApp message on their phone
  5. Comment out debug logging once confirmed working

Status: 🚀 Ready to test!