> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# الفوترة المعتمدة على المقاعد

> قم بتنفيذ تسعير لكل مستخدم لبرامج الفريق، ومنتجات SaaS، والتراخيص المؤسسية مع إدارة مقاعد مرنة وتقسيم الأسعار.

<Info>
  تتيح الفوترة المعتمدة على المقاعد فرض رسوم على العملاء بناءً على عدد المستخدمين أو أعضاء الفريق أو التراخيص التي يحتاجونها. إنها نموذج التسعير القياسي لأدوات التعاون الجماعي، وبرمجيات المؤسسات، ومنتجات SaaS بين الشركات.
</Info>

<CardGroup cols={2}>
  <Card title="Implementation Tutorial" icon="code" href="/developer-resources/seat-based-pricing">
    دليل خطوة بخطوة مع أمثلة تعليمات برمجية.
  </Card>

  <Card title="Add-ons Documentation" icon="puzzle" href="/features/addons">
    تعرف على نظام الإضافات الذي يغذي الفوترة المعتمدة على المقاعد.
  </Card>

  <Card title="Subscription Management" icon="repeat" href="/features/subscription">
    إدارة الاشتراكات المعتمدة على المقاعد وتغييرات الخطة.
  </Card>

  <Card title="Webhooks" icon="bell" href="/developer-resources/webhooks/intents/subscription">
    تتبع تغييرات المقاعد باستخدام ويب هوكس الاشتراك.
  </Card>
</CardGroup>

***

## ما هي الفوترة المعتمدة على المقاعد؟

تفرض الفوترة المعتمدة على المقاعد (المعروفة أيضًا بالتسعير لكل مستخدم أو لكل مقعد) رسومًا على العملاء بناءً على عدد المستخدمين الذين يصلون إلى منتجك. بدلاً من رسم ثابت، يتزايد السعر مع حجم الفريق.

### حالات الاستخدام الشائعة

| الصناعة                    | المثال               | نموذج التسعير      |
| -------------------------- | -------------------- | ------------------ |
| تعاون الفرق                | Slack، Notion، Asana | لكل مستخدم نشط/شهر |
| أدوات المطورين             | GitHub، GitLab، Jira | لكل مقعد/شهر       |
| برامج إدارة علاقات العملاء | Salesforce، HubSpot  | لكل ترخيص مستخدم   |
| أدوات التصميم              | Figma، Canva         | لكل مقعد محرر      |
| برامج الأمان               | 1Password، Okta      | لكل مستخدم/شهر     |
| مؤتمرات الفيديو            | Zoom، Teams          | لكل ترخيص مضيف     |

### فوائد التسعير المعتمد على المقاعد

**لعملك:**

* تتزايد الإيرادات بشكل طبيعي مع نمو العملاء
* تسعير يمكن التنبؤ به يمكن للعملاء وضع ميزانية له
* مسار ترقية واضح من الفرد إلى الفريق إلى المؤسسة
* قيمة عمرية أعلى مع توسع الفرق

**لعملائك:**

* الدفع فقط مقابل ما يستخدمونه
* سهل الفهم وتوقع التكاليف
* مرونة لإضافة/إزالة المستخدمين حسب الحاجة
* تسعير عادل يتناسب مع حجم الفريق

***

## كيف تعمل الفوترة المعتمدة على المقاعد في Dodo Payments

تقوم Dodo Payments بتنفيذ الفوترة المعتمدة على المقاعد باستخدام نظام **الإضافات**. إليك كيف يعمل:

### نظرة عامة على الهيكلية

يكلف اشتراك Team Pro 99 دولارًا شهريًا ويشمل 5 مقاعد. إذا كان لديك أكثر من 5 مستخدمين، تدفع 15 دولارًا إضافية شهريًا عن كل مقعد إضافي.

على سبيل المثال، إذا كانت فرقك تحتاج 15 مقعدًا:

* الخطة الأساسية: 99 دولارًا شهريًا (تشمل 5 مقاعد)
* الإضافات: 10 مقاعد إضافية × 15 دولارًا شهريًا = 150 دولارًا شهريًا
* التكلفة الشهرية الإجمالية: 99 + 150 = 249 دولارًا مقابل 15 مقعدًا

### المكونات الرئيسية

| المكون         | الغرض                               | المثال                                        |
| -------------- | ----------------------------------- | --------------------------------------------- |
| المنتج الأساسي | الاشتراك الأساسي مع المقاعد المضمنة | "خطة الفريق - 99 دولارًا/شهر (5 مقاعد مضمنة)" |
| إضافة المقعد   | رسوم لكل مقعد لمستخدمين إضافيين     | "مقعد إضافي - 15 دولارًا/شهر لكل"             |
| الكمية         | عدد المقاعد الإضافية المشتراة       | 10 مقاعد إضافية                               |

***

## استراتيجيات التسعير

اختر استراتيجية التسعير المعتمدة على المقاعد التي تناسب عملك:

### الاستراتيجية 1: خطة أساسية + إضافة لكل مقعد

قم بتضمين عدد محدد من المقاعد في الخطة الأساسية، وفرض رسوم على المقاعد الإضافية.

**مثال:**

```
Starter Plan: $49/month
├── Includes: 3 seats
├── Extra seats: $10/month each
└── 8 total seats = $49 + (5 × $10) = $99/month
```

**الأفضل لـ:** المنتجات التي يمكن أن تعمل فيها الفرق الصغيرة مع العرض الأساسي.

### الاستراتيجية 2: تسعير لكل مقعد فقط

فرض رسوم ثابتة لكل مقعد دون رسوم أساسية.

**مثال:**

```
Per User: $12/month
├── 5 users = $60/month
├── 20 users = $240/month
└── 100 users = $1,200/month
```

**التنفيذ:** تعيين سعر الخطة الأساسية إلى 0 دولار، واستخدام إضافة المقعد فقط.

**الأفضل لـ:** تسعير بسيط وشفاف؛ نماذج قائمة على الاستخدام.

### الاستراتيجية 3: تسعير مقاعد متدرجة

خطط أساسية مختلفة مع معدلات مختلفة لكل مقعد.

**مثال:**

```
Starter: $0/month base + $15/seat
├── Lower features, higher per-seat cost

Professional: $99/month base + $10/seat
├── More features, lower per-seat cost

Enterprise: $499/month base + $7/seat
└── All features, volume discount on seats
```

**التنفيذ:** إنشاء منتجات منفصلة لكل مستوى مع أسعار إضافات مختلفة.

**الأفضل لـ:** تشجيع الترقيات إلى مستويات أعلى؛ مبيعات المؤسسات.

### الاستراتيجية 4: حزم المقاعد

بيع المقاعد في حزم بدلاً من فردية.

**مثال:**

```
5-Seat Pack: $50/month ($10/seat)
10-Seat Pack: $80/month ($8/seat)
25-Seat Pack: $175/month ($7/seat)
```

**التنفيذ:** إنشاء إضافات متعددة لأحجام الحزم المختلفة.

**الأفضل لـ:** تبسيط قرارات الشراء؛ تشجيع الالتزامات الأكبر.

***

## إعداد الفوترة المعتمدة على المقاعد

### الخطوة 1: خطط لتسعيرك

قبل التنفيذ، حدد هيكل التسعير الخاص بك:

<Steps>
  <Step title="Define Base Plan">
    قرر ما يتم تضمينه في الاشتراك الأساسي:

    * السعر الأساسي (يمكن أن يكون 0 دولار للاشتراك المعتمد كليًا على المقاعد)
    * عدد المقاعد المشمولة
    * الميزات المتاحة في هذا المستوى
  </Step>

  <Step title="Set Seat Pricing">
    حدد تكلفة الإضافة لكل مقعد:

    * السعر لكل مقعد إضافي
    * أي خصومات على الكميات (عبر إضافات متعددة)
    * الحد الأقصى للمقاعد المسموح بها (إن وُجد)
  </Step>

  <Step title="Consider Billing Frequency">
    وافق تسعير المقاعد مع دورة الفوترة الخاصة بك:

    * الاشتراكات الشهرية → رسوم مقاعد شهرية
    * الاشتراكات السنوية → رسوم مقاعد سنوية (غالبًا مخفضة)
  </Step>
</Steps>

### الخطوة 2: إنشاء إضافة المقعد

في لوحة معلومات Dodo Payments الخاصة بك:

1. انتقل إلى **المنتجات** → **الإضافات**
2. انقر على **إنشاء إضافة**
3. قم بتكوين الإضافة:

| الحقل       | القيمة                                       | الملاحظات                    |
| ----------- | -------------------------------------------- | ---------------------------- |
| الاسم       | "مقعد إضافي" أو "عضو فريق"                   | اسم واضح وسهل الاستخدام      |
| الوصف       | "أضف عضو فريق آخر إلى مساحة العمل الخاصة بك" | اشرح ما يحصل عليه العملاء    |
| السعر       | سعر المقعد الخاص بك                          | على سبيل المثال، 10.00 دولار |
| العملة      | تطابق منتجك الأساسي                          | يجب أن تكون نفس العملة       |
| فئة الضريبة | نفس المنتج الأساسي                           | يضمن معالجة ضريبية متسقة     |

<Tip>
  أنشئ أسماء إضافات وصفية واضحة في الفواتير. "مقعد فريق إضافي" أوضح من "إضافة مقعد" للعملاء الذين يراجعون فواتيرهم.
</Tip>

### الخطوة 3: إنشاء الاشتراك الأساسي

قم بإنشاء منتج الاشتراك الخاص بك:

1. انتقل إلى **المنتجات** → **إنشاء منتج**
2. اختر **اشتراك**
3. قم بتكوين التسعير والتفاصيل
4. في قسم **الإضافات**، قم بإرفاق إضافة المقعد الخاصة بك

### الخطوة 4: ربط الإضافة بالمنتج

قم بربط إضافة المقعد باشتراكك:

1. قم بتحرير منتج الاشتراك الخاص بك
2. انتقل إلى قسم **الإضافات**
3. انقر على **إضافة إضافات**
4. اختر إضافة المقعد الخاصة بك
5. احفظ التغييرات

<Check>
  يدعم منتج الاشتراك الخاص بك الآن التسعير المعتمد على المقاعد. يمكن للعملاء شراء أي كمية من المقاعد الإضافية أثناء إتمام عملية الدفع.
</Check>

***

## إدارة المقاعد

### إضافة مقاعد للاشتراكات الجديدة

عند إنشاء جلسة الخروج، حدد كمية المقاعد:

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{
    product_id: 'prod_team_plan',
    quantity: 1,
    addons: [{
      addon_id: 'addon_seat',
      quantity: 10  // 10 additional seats
    }]
  }],
  customer: { email: 'admin@company.com' },
  return_url: 'https://yourapp.com/success'
});
```

### تغيير عدد المقاعد في الاشتراكات الحالية

استخدم واجهة برمجة التطبيقات لتغيير الخطة لضبط المقاعد:

```typescript theme={null}
// Add 5 more seats to existing subscription
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  addons: [{
    addon_id: 'addon_seat',
    quantity: 15  // New total: 15 additional seats
  }]
});
```

### إزالة المقاعد

لتقليل عدد المقاعد، حدد الكمية الأقل:

```typescript theme={null}
// Reduce from 15 to 8 additional seats
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'difference_immediately',
  addons: [{
    addon_id: 'addon_seat',
    quantity: 8  // Reduced to 8 additional seats
  }]
});
```

### إزالة جميع المقاعد الإضافية

مرر مصفوفة إضافات فارغة لإزالة جميع الإضافات:

```typescript theme={null}
// Remove all additional seats, keep only base plan seats
await client.subscriptions.changePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'difference_immediately',
  addons: []  // Removes all add-ons
});
```

***

## التقسيم لتغييرات المقاعد

عندما يضيف العملاء أو يزيلون المقاعد في منتصف الدورة، يحدد التقسيم كيفية فرض الرسوم عليهم.

```mermaid theme={null}
sequenceDiagram
    participant A as Admin
    participant App as Your App
    participant D as Dodo Payments
    A->>App: Add/remove seats
    App->>D: Preview change
    D-->>App: Prorated charge preview
    App->>A: Show cost details
    A->>App: Confirm
    App->>D: changePlan (new seat count)
    D->>D: Prorate & charge/credit
    D-->>App: Updated subscription
    D->>App: Webhook: plan_changed
    App->>A: Seats updated
```

### أوضاع الحساب النسبي

| الوضع                    | إضافة مقاعد                     | إزالة مقاعد                                 | دورة الفوترة     |
| ------------------------ | ------------------------------- | ------------------------------------------- | ---------------- |
| `prorated_immediately`   | الشحن للأيام المتبقية في الدورة | رصيد للأيام غير المستخدمة                   | يُعاد ضبطه لليوم |
| `difference_immediately` | الشحن بالسعر الكامل للمقعد      | يتم تطبيق الائتمان على التجديدات المستقبلية | يُعاد ضبطه لليوم |
| `full_immediately`       | الشحن بالسعر الكامل للمقعد      | لا ائتمان                                   | يُعاد ضبطه لليوم |
| `do_not_bill`            | إضافة المقعد، بدون شحن حاليًا   | إزالة المقعد، لا ائتمان                     | يبقى كما هو      |

<Warning>
  `prorated_immediately`, `difference_immediately` و `full_immediately` جميعها **تعيد ضبط دورة الفوترة إلى تاريخ التغيير** — يتم إعادة استقبال التجديد التالي إلى اليوم الذي يتم فيه تطبيق تغيير المقعد. فقط **`do_not_bill`** يحتفظ بتاريخ التجديد الأصلي (يتم فرض رسوم على العدد الجديد من المقاعد بالكامل عند التجديد التالي، دون أي رسوم في وقت التغيير).
</Warning>

### أمثلة على التناسب

**الحالة: تبقى 15 يومًا من دورة الفوترة، إضافة 5 مقاعد بسعر 10 دولارات لكل مقعد**

<Tabs>
  <Tab title="prorated_immediately">
    ```
    Prorated charge = ($10 × 5 seats) × (15 days / 30 days)
                    = $50 × 0.5
                    = $25 immediate charge
    Billing cycle resets to today
    ```

    العميل يدفع المبلغ المقدم الآن، ودورة الفوترة تُعاد تعرضه إلى تاريخ التغيير — يتم الشحن للتجديد التالي (\$50/شهريًا للمقاعد المضافة) دورة واحدة من اليوم، وليس من تاريخ التجديد الأصلي.
  </Tab>

  <Tab title="difference_immediately">
    ```
    Immediate charge = $10 × 5 seats = $50
    Billing cycle resets to today
    ```

    العميل يدفع السعر الكامل للمقعد الآن، بغض النظر عن وضع الدورة، وتُعاد ضبط دورة الفوترة لتاريخ التغيير.
  </Tab>

  <Tab title="full_immediately">
    ```
    Immediate charge = Full subscription + add-ons
    Billing cycle resets to today
    ```

    العميل يدفع المبلغ الكامل، وتبدأ دورة فوترة جديدة.
  </Tab>

  <Tab title="do_not_bill">
    ```
    Immediate charge = $0
    Billing cycle unchanged
    ```

    يتم إضافة المقاعد فورًا بدون رسوم في وقت التغيير. يتم الحفاظ على تاريخ التجديد الأصلي، ويتم الشحن للعدد الجديد من المقاعد بالكامل عند التجديد التالي. استخدم هذا عندما تحتاج إلى الحفاظ على دورة الفوترة الحالية.
  </Tab>
</Tabs>

**الحالة: إزالة 3 مقاعد في منتصف الدورة بعملية تناسبية فورية**

```
Current: Team Plan ($99/month) + 10 extra seats × $10/seat = $199/month
Change: Remove 3 seats (10 → 7 extra seats) on day 20 of 30-day cycle
Remaining: 10 days

Credit for removed seats:
  = ($10 × 3 seats) × (10 days / 30 days)
  = $30 × 0.333
  = $10.00 credit

→ $10.00 credit added to subscription
→ Next renewal: $99 + (7 × $10) = $169.00/month
→ Credit auto-applies: $169.00 − $10.00 = $159.00 on next invoice
```

<Tip>
  **اختيار وضع التناسب لتغيير المقاعد**: استخدم `prorated_immediately` للفوترة العادلة التي تعتمد على اليوم عندما تقوم الفرق بتعديل المقاعد بشكل متكرر. استخدم `difference_immediately` للحسابات البسيطة التي تفرض رسومًا أو أرصدة بالسعر الكامل للمقعد. إذا كنت بحاجة إلى الحفاظ على تاريخ التجديد الحالي دون تغيير، استخدم `do_not_bill` — الوضع الوحيد الذي لا يعيد ضبط دورة الفوترة (يتم الشحن للعدد الجديد من المقاعد عند التجديد التالي). راجع [دليل التناسب](/developer-resources/subscription-upgrade-downgrade#proration-modes) لمقارنات مفصلة.
</Tip>

### معاينة قبل التغيير

قم دائمًا بمراجعة التناسب قبل إجراء التغييرات:

```typescript theme={null}
const preview = await client.subscriptions.previewChangePlan('sub_123', {
  product_id: 'prod_team_plan',
  quantity: 1,
  proration_billing_mode: 'prorated_immediately',
  addons: [{ addon_id: 'addon_seat', quantity: 20 }]
});

console.log('Immediate charge:', preview.immediate_charge.summary);
// Show customer: "Adding 5 seats will cost $25 today"
```

***

## تتبع المقاعد باستخدام الويب هوكس

راقب تغيرات المقاعد عن طريق الاستماع إلى الاشتراك باستخدام الويب هوكس:

### الأحداث ذات الصلة

| الحدث                       | عند التشغيل       | حالة الاستخدام                        |
| --------------------------- | ----------------- | ------------------------------------- |
| `subscription.active`       | تفعيل اشتراك جديد | تقديم المقاعد الأولية                 |
| `subscription.plan_changed` | إضافة/إزالة مقاعد | تحديث عدد المقاعد في التطبيق الخاص بك |
| `subscription.renewed`      | تجديد الاشتراك    | تأكيد عدم تغيير عدد المقاعد           |
| `subscription.cancelled`    | إلغاء الاشتراك    | إلغاء تزويد جميع المقاعد              |

### مثال على معالج الويب هوك

```typescript theme={null}
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;

  switch (event.type) {
    case 'subscription.active':
      // New subscription - provision seats
      const seats = calculateTotalSeats(event.data);
      await provisionSeats(event.data.customer_id, seats);
      break;

    case 'subscription.plan_changed':
      // Seats changed - update access
      const newSeats = calculateTotalSeats(event.data);
      await updateSeatCount(event.data.subscription_id, newSeats);
      break;

    case 'subscription.cancelled':
      // Subscription cancelled - deprovision
      await deprovisionAllSeats(event.data.subscription_id);
      break;
  }

  res.json({ received: true });
});

function calculateTotalSeats(subscriptionData) {
  const baseSeats = 5;  // Included in plan
  const addonSeats = subscriptionData.addons?.reduce(
    (total, addon) => total + addon.quantity, 0
  ) || 0;
  return baseSeats + addonSeats;
}
```

***

## فرض حدود المقاعد

يجب على تطبيقك فرض حدود المقاعد. تتبع Dodo Payments الفوترة، ولكنك تتحكم في الوصول.

### استراتيجيات التنفيذ

<Tabs>
  <Tab title="Hard Limit">
    منع إضافة المستخدمين بشكل صارم مقارنةً بعدد المقاعد.

    ```typescript theme={null}
    async function inviteUser(teamId: string, email: string) {
      const team = await getTeam(teamId);
      const subscription = await getSubscription(team.subscriptionId);
      const totalSeats = calculateTotalSeats(subscription);
      const usedSeats = await countTeamMembers(teamId);

      if (usedSeats >= totalSeats) {
        throw new Error('No seats available. Please upgrade your plan.');
      }

      await sendInvitation(teamId, email);
    }
    ```
  </Tab>

  <Tab title="Soft Limit with Warning">
    السماح بالتجاوز مع تقديم تحذير وفترة سماح.

    ```typescript theme={null}
    async function inviteUser(teamId: string, email: string) {
      const team = await getTeam(teamId);
      const { totalSeats, usedSeats } = await getSeatInfo(team);

      if (usedSeats >= totalSeats) {
        // Allow but flag for billing
        await flagOverage(teamId, usedSeats - totalSeats + 1);
        await notifyAdmin(team.adminEmail, 'You have exceeded your seat limit');
      }

      await sendInvitation(teamId, email);
    }
    ```
  </Tab>

  <Tab title="Auto-Upgrade">
    إضافة المقاعد تلقائيًا عند الوصول إلى الحد.

    ```typescript theme={null}
    async function inviteUser(teamId: string, email: string) {
      const team = await getTeam(teamId);
      const { totalSeats, usedSeats, subscriptionId } = await getSeatInfo(team);

      if (usedSeats >= totalSeats) {
        // Automatically add a seat
        await client.subscriptions.changePlan(subscriptionId, {
          product_id: team.productId,
          quantity: 1,
          proration_billing_mode: 'prorated_immediately',
          addons: [{ addon_id: 'addon_seat', quantity: totalSeats - baseSeats + 1 }]
        });

        await notifyAdmin(team.adminEmail, 'A new seat was added to your plan');
      }

      await sendInvitation(teamId, email);
    }
    ```
  </Tab>
</Tabs>

***

## أنماط متقدمة

### أنواع مختلفة من المقاعد

عرض أنواع مختلفة من المقاعد بأسعار مختلفة:

```
Full Seats: $20/month - Full access to all features
View-Only Seats: $5/month - Read-only access
Guest Seats: $0/month - Limited external collaborator access
```

**التنفيذ:** قم بإنشاء إضافات منفصلة لكل نوع من أنواع المقاعد.

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{
    product_id: 'prod_team_plan',
    quantity: 1,
    addons: [
      { addon_id: 'addon_full_seat', quantity: 10 },
      { addon_id: 'addon_viewer_seat', quantity: 25 },
      { addon_id: 'addon_guest_seat', quantity: 50 }
    ]
  }]
});
```

### خصومات المقاعد السنوية

عرض تخفيضات سنوية لأسعار المقاعد:

```
Monthly: $15/seat/month
Annual: $12/seat/month (20% savings)
```

**التنفيذ:** قم بإنشاء منتجات منفصلة للخطط الشهرية والسنوية بأسعار إضافات مختلفة.

### متطلبات حَدّ المقاعد الأدنى

فرض عدد أدنى من المقاعد لبعض الخطط:

```typescript theme={null}
async function validateSeatCount(planId: string, seatCount: number) {
  const minimums = {
    'prod_starter': 1,
    'prod_team': 5,
    'prod_enterprise': 25
  };

  if (seatCount < minimums[planId]) {
    throw new Error(`${planId} requires at least ${minimums[planId]} seats`);
  }
}
```

***

## أفضل الممارسات

### أفضل ممارسات التسعير

* **التواصل الواضح**: عرض تسعير المقاعد بشكل بارز على صفحة التسعير الخاصة بك
* **المقاعد المضمنة**: النظر في تضمين بعض المقاعد في السعر الأساسي لتقليل العوائق
* **خصومات الحجم**: تقديم أسعار أقل للمقعد الواحد للفرق الأكبر للفوز بالعقود الكبيرة
* **الحوافز السنوية**: تخفيض الخطط السنوية لتحسين التدفق النقدي والاحتفاظ بالعملاء

### أفضل الممارسات التقنية

* **تخزين أعداد المقاعد مؤقتًا**: تخزين أعداد المقاعد المؤقتة محليًا لتجنب إجراء طلبات API على كل طلب
* **المزامنة بانتظام**: مزامنة عدد المقاعد المحلي لديك بشكل دوري مع Dodo Payments عبر API
* **تعامل مع الإخفاقات**: إذا فشل تغيير المقعد، أظهر رسائل خطأ واضحة وخيارات لإعادة المحاولة
* **سجل التدقيق**: سجل جميع تغييرات المقاعد للنزاعات الفوترة والامتثال

### أفضل الممارسات لتجربة المستخدم

* **التغذية الراجعة في الوقت الفعلي**: إظهار تأثير التكلفة فورًا عند تعديل المقاعد
* **خطوات التأكيد**: طلب تأكيد قبل إجراء تغييرات الفوترة
* **شفافية التناسب**: شرح تفاصيل الرسوم التناسبية قبل تطبيقها بوضوح
* **تسهيل التخفيضات**: لا تجعل من الصعب تقليل المقاعد (يُبني الثقة)

***

## استكشاف الأخطاء وإصلاحها

<AccordionGroup>
  <Accordion title="Seat count mismatch between app and billing">
    **العرض العرضي**: يظهر تطبيقك عددًا مختلفًا من المقاعد عن الاشتراك.

    **الأسباب**:

    * الويب هوك لم يُتلقَ أو لم يُعالج
    * حالة السباق أثناء تغيير المقعد
    * البيانات المخزنة مؤقتًا غير محدثة

    **الحلول**:

    1. قم بتنفيذ معالجات الويب هوك لـ `subscription.plan_changed`
    2. أضف زر "مزامنة مع الفوترة" الذي يجلب الاشتراك الحالي
    3. تعيين TTL للتخزين المؤقت لضمان التحديث المنتظم
  </Accordion>

  <Accordion title="Proration charges unexpected">
    **العرض العرضي**: العميل مشوش من مبلغ الشحن في منتصف الدورة.

    **الأسباب**:

    * لم يتم توضيح وضع التناسب بشكل واضح
    * العميل لم يرَ المعاينة قبل التأكيد

    **الحلول**:

    1. استخدم دائمًا `previewChangePlan` قبل إجراء التغييرات
    2. أظهر تفاصيل واضحة: "إضافة X مقاعد = \$Y اليوم (تناسب Z أيام)"
    3. وثق سياسة التناسب الخاصة بك في مركز المساعدة
  </Accordion>

  <Accordion title="Add-on not appearing in checkout">
    **العرض العرضي**: الإضافة للمقاعد غير متاحة أثناء الدفع.

    **الأسباب**:

    * الإضافة غير ملحقة بالمنتج
    * الإضافة مؤرشفة أو محذوفة
    * عدم التطابق بين العملات بين المنتج والإضافة

    **الحلول**:

    1. تحقق من أن الإضافة ملحقة في إعدادات المنتج
    2. تحقق من حالة الإضافة في لوحة التحكم الإضافية
    3. تأكد من تطابق العملات بشكل تام
  </Accordion>

  <Accordion title="Cannot reduce seats below current usage">
    **العرض العرضي**: العميل يريد تقليل المقاعد ولكن لديه مستخدمون مخصصون.

    **الحلول**:

    1. أظهر أي المستخدمين يجب إزالتهم قبل تقليل المقاعد
    2. تنفيذ سير عمل: إزالة المستخدمين → تقليل المقاعد
    3. ضع في اعتبارك فترة سماح قبل فرض تقليل المقاعد
  </Accordion>
</AccordionGroup>

***

## الوثائق ذات الصلة

<CardGroup cols={2}>
  <Card title="Seat-Based Pricing Tutorial" icon="code" href="/developer-resources/seat-based-pricing">
    دليل التنفيذ الكامل مع الكود.
  </Card>

  <Card title="Add-ons" icon="puzzle" href="/features/addons">
    فهم نظام الإضافات بالتفصيل.
  </Card>

  <Card title="Plan Changes & Proration" icon="arrows-rotate" href="/developer-resources/subscription-upgrade-downgrade">
    التعامل مع تعديلات الاشتراك.
  </Card>

  <Card title="Subscription Webhooks" icon="bell" href="/developer-resources/webhooks/intents/subscription">
    تتبع أحداث الاشتراك.
  </Card>
</CardGroup>
