resend.emails.send باستدعاء إلى SendGrid أو Postmark أو Amazon SES أو مرحّل SMTP الخاص بك.- إنشاء استحقاق أرصدة مخصّص للبريد الإلكتروني في لوحة التحكم.
- إرفاق الأرصدة بخطة اشتراك وبمنتج إعادة تعبئة يُشترى لمرة واحدة.
- إرسال البريد الإلكتروني عبر Resend وخصم رصيد واحد لكل إرسال مع إدخال في دفتر الأستاذ.
- قراءة رصيد أرصدة العميل الحالي من الواجهة الأمامية.
- التحقق من Webhooks الخاصة بـ Dodo Payments ومعالجة
credit.balance_lowلتحذير العملاء قبل وصول رصيدهم إلى الصفر.
ما سنبنيه
تبيع MailKit منتجين:- حساب Dodo Payments. أنشئ كل شيء في وضع الاختبار.
- حساب Resend مجاني ومفتاح API.
- Node.js 22 أو إصدار أحدث، ومعرفة عملية بـ TypeScript.
الخطوة 1: إنشاء استحقاق أرصدة البريد الإلكتروني
يحدد استحقاق الأرصدة الوحدة التي تبيعها MailKit: إرسال رسالة بريد إلكتروني واحدة.
The Credits tab under Products lists all your credit entitlements.
Open the Credits Section
- سجّل الدخول إلى لوحة تحكم Dodo Payments.
- انقر على Products في الشريط الجانبي.
- حدّد علامة تبويب Credits.
- انقر على Create Credit.
Configure the Credit Unit
Email Creditsنوع الرصيد: وحدة مخصّصةاسم الوحدة: emailتحديد الدقة: 0. الرسالة الإلكترونية وحدة كاملة، لذلك لا يحتاج الرصيد إلى أرقام عشرية.انتهاء صلاحية الرصيد: 30 days. تنتهي صلاحية الأرصدة غير المستخدمة بعد 30 يومًا من إصدارها.Leave the Other Defaults
Save and Copy the Credit ID
cde_. تستخدمه الواجهة الخلفية لقراءة الأرصدة وإدخالات دفتر الأستاذ.Email Credits جاهزًا. بعد ذلك، أنشئ المنتجات التي تمنحه للعملاء.الخطوة 2: إنشاء الخطة وحزمة إعادة التعبئة
أنشئ منتجين يرفقان استحقاقEmail Credits نفسه: خطة Subscription تمنح 5,000 رسالة بريد إلكتروني في كل دورة فوترة، ومنتج إعادة تعبئة One Time يضيف 5,000 رسالة أخرى عند الطلب.
خطة MailKit ($19/شهريًا، 5,000 رسالة بريد إلكتروني)
Create the Subscription
- انتقل إلى Products وانقر على Add Product.
- أدخل تفاصيل المنتج:
MailKit Planالوصف: 5,000 transactional emails per month.- ضمن Pricing Type، حدّد Subscription.
- حدّد السعر المتكرر:
19.00تكرار الدفع كل: 1 شهرالعملة: USDAttach the Email Credit Entitlement
Email Creditsالأرصدة المُصدرة في كل دورة فوترة: 5000حد انخفاض الرصيد (%): 20. ترسل Dodo Payments credit.balance_low عندما ينخفض الرصيد عن 20% من الأرصدة المُصدرة في كل دورة، أي 1,000 رسالة بريد إلكتروني.استيراد إعدادات الرصيد الافتراضية: مفعّل، لكي يستخدم المنتج مدة الصلاحية البالغة 30 يومًا من الخطوة 1.أضف الرصيد إلى المنتج، ثم احفظ المنتج. انسخ معرّف المنتج، الذي يبدأ بـ pdt_.حزمة إعادة التعبئة ($9 لمرة واحدة، 5,000 رسالة بريد إلكتروني)
Create a One-Time Product
- انتقل إلى Products وانقر على Add Product.
- أدخل تفاصيل المنتج:
Email Top-Up Packالوصف: Add 5,000 emails to your MailKit balance.- ضمن Pricing Type، حدّد One Time.
- حدّد السعر:
9.00العملة: USDAttach the Credit Grant
- حدّد الأرصدة:
Email Credits - عدد الأرصدة المُصدرة:
5000
الخطوة 3: إعداد الواجهة الخلفية
أنشئ خادم Express الذي ينشئ عمليات الدفع، ويرسل البريد الإلكتروني، ويقرأ الأرصدة، ويستقبل Webhooks.Initialize the Project
package.json:Configure Environment Variables
.env باستخدام مفتاح API لوضع الاختبار من Developer → API Keys، ومعرّفات الخطوتين 1 و2:DODO_PAYMENTS_WEBHOOK_KEY في الخطوة 4، بعد إنشاء نقطة نهاية Webhook. أنشئ مفتاح Resend API من resend.com/api-keys.Build the Server
server.ts في جذر المشروع. يوفّر الخادم خمسة مسارات: الدفع للاشتراك، والدفع لإعادة التعبئة، وقراءة الرصيد، والإرسال، ومستقبل Webhook.Add a Demo UI
public/index.html. يستدعي كل مسار من نموذج بسيط، بحيث يمكنك اختبار التدفق في متصفح:الخطوة 4: ربط نقطة نهاية Webhook
يتيح لك حدثcredit.balance_low تحذير العملاء قبل نفاد أرصدتهم. ومن دونه، يلاحظ العميل المشكلة أولًا عند فشل إرسال رسالة بريد إلكتروني.
Expose Your Local Server
https://1234abcd.ngrok-free.app.Register the Endpoint in Dodo Payments
- انتقل إلى Developer → Webhooks وانقر على Add endpoint.
- أدخل عنوان URL
https://1234abcd.ngrok-free.app/webhooks/dodo، باستخدام مضيف النفق الخاص بك. - حدّد الأحداث
credit.addedوcredit.balance_lowوcredit.rolled_over. - انقر على Create endpoint.
- انسخ سر التوقيع من علامة تبويب Overview لنقطة النهاية إلى
.envعلى هيئةDODO_PAYMENTS_WEBHOOK_KEY. - أعد تشغيل الخادم.
الخطوة 5: اختبار التدفق بالكامل
Start the Server
MailKit running on http://localhost:3000. افتح عنوان URL هذا في متصفحك.Subscribe a Test Customer
- في القسم 1، أدخل عنوان بريد إلكتروني واسمًا للاختبار، ثم انقر على Get checkout link.
- افتح الرابط وأكمل الدفع باستخدام بطاقة اختبار.
- في لوحة التحكم، انتقل إلى Customers وانسخ معرّف العميل الجديد، الذي يبدأ بـ
cus_.
Send an Email
- ألصق معرّف العميل في القسم 3.
- اترك To مضبوطًا على
delivered@resend.dev، وهو عنوان اختبار في Resend يقبل كل رسالة. - انقر على Send.
Trigger the Low-Balance Webhook
- افتح العميل ضمن Customers، وحدّد علامة تبويب Credits، واختر Email Credits.
- انقر على Apply Credit/Debit، وحدّد Debit، وأدخل
4000. أصبح الرصيد الآن 1,000 بالضبط، وهو ليس أقل من الحد بعد. - أرسل رسالة بريد إلكتروني أخرى من العرض التجريبي. ينخفض الرصيد إلى 999.
Buy a Top-Up Pack
- ألصق معرّف العميل في القسم 4.
- انقر على Buy 5,000 emails وأكمل عملية الدفع الاختبارية.
- حدّث الرصيد. سيزداد بمقدار 5,000.
credit.added مع transaction_type: "credit_added". يحتوي الاستحقاق المرتبط به على source_type: one_time، ويمكنك قراءته مجددًا باستخدام API List Customer Grants. تُضاف أرصدة إعادة التعبئة إلى أرصدة الاشتراك. تُخصم الدفعات من الاستحقاق الذي تنتهي صلاحيته أولًا، ومن أقدم استحقاق عندما تنتهي صلاحية استحقاقين في الوقت نفسه.Test the Hard Stop
402:402 آلية الإنفاذ في تطبيقك. اعتبر API رصيد Dodo Payments مصدر الحقيقة، ولا تخزّن الرصيد مؤقتًا في العميل.استكشاف الأخطاء وإصلاحها
Webhook signature verification fails (401)
Webhook signature verification fails (401)
express.json() النص بكائن محلّل، ولذلك يفشل التحقق. سجّل /webhooks/dodo باستخدام express.raw({ type: 'application/json' }) أعلى سطر app.use(express.json()). ثم تحقق من أن DODO_PAYMENTS_WEBHOOK_KEY يطابق سر التوقيع في علامة تبويب Overview لنقطة النهاية.Balance is 0, customer not found, or credits don't deduct
Balance is 0, customer not found, or credits don't deduct
- أن العميل أكمل عملية الدفع. تُصدر الأرصدة عند نجاح الدفع، وليس عند إنشاء جلسة الدفع.
- أن
CREDIT_ENTITLEMENT_IDفي.envيطابق الرصيد المرفق بالمنتج. تستخدم استدعاءات الرصيد ودفتر الأستاذ هذا المعرّف، لذا تؤدي عدم المطابقة إلى قراءة رصيد مختلف أو خصمه. - أن
customer_idالذي تمرره هو معرّف عميل Dodo Payments (يبدأ بـcus_)، وليس معرّفًا من قاعدة بياناتك الخاصة.
Resend rejects the recipient
Resend rejects the recipient
onboarding@resend.dev إلا إلى عنوان البريد الإلكتروني الموجود في حساب Resend الخاص بك، أو إلى delivered@resend.dev. للإرسال إلى أي شخص آخر، تحقق من نطاق واستخدم عنوان from على ذلك النطاق.ما أنشأته
One Reusable Credit Unit
Email Credits، عُرّف مرة واحدة وأُرفق بكل من خطة الاشتراك وحزمة إعادة التعبئة.Subscription with Prepaid Allowance
Top-Up Pack
Direct Ledger Debits
createLedgerEntry بعد كل إرسال، من دون عدّاد أو تأخير في التجميع. يمنع معرّف رسالة Resend باعتباره مفتاح idempotency خصمًا ثانيًا للإرسال نفسه.