resend.emails.send بـ SendGrid أو Postmark أو SES أو مرحّل SMTP الخاص بك.- إنشاء استحقاق أرصدة مخصص (لرسائل البريد الإلكتروني) في لوحة التحكم
- إرفاق الأرصدة بخطة اشتراك وبمنتج شحن لمرة واحدة
- إرسال رسائل بريد إلكتروني حقيقية عبر Resend وخصم رصيد واحد لكل إرسال من خلال إدخال في دفتر الأستاذ
- الاستعلام عن رصيد الأرصدة الحالي من الواجهة الأمامية
- التحقق من webhooks الخاصة بـ Dodo بشكل صحيح ومعالجة
credit.balance_lowلتنبيه العملاء قبل وصول رصيدهم إلى الصفر
ما سنبنيه
إليك نموذج التسعير الخاص بـ MailKit:- حساب Dodo Payments (يكفي وضع الاختبار)
- حساب ومفتاح API مجانيان لدى Resend
- Node.js 18+ وإلمام أساسي بـ TypeScript
الخطوة 1: إنشاء استحقاق أرصدة البريد الإلكتروني
يحدد استحقاق الأرصدة الوحدة التي تبيعها منصتك: وهي في هذه الحالة إرسال رسالة بريد إلكتروني واحدة.
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نوع الرصيد: حدّد Custom Unitاسم الوحدة: emailالدقة: 0 (رسالة البريد الإلكتروني دائمًا وحدة كاملة؛ لا يمكنك إرسال نصف رسالة)انتهاء صلاحية الرصيد: 30 days (تُعاد حصة كل دورة إلى قيمتها الأصلية)Leave the other defaults as-is
Save and copy the credit ID
cent_xxxxxxxxxxxx.Email Credits جاهزًا. التالي: المنتجات التي تمنح الأرصدة للعملاء.الخطوة 2: إنشاء الخطة وحزمة الشحن
ستنشىء منتجين: خطة Subscription متكررة، ومنتج شحن Single Payment. تمنح الخطة 5,000 رسالة بريد إلكتروني في كل دورة؛ بينما تضيف حزمة الشحن 5,000 رسالة أخرى عند الطلب. ويرتبط كلاهما باستحقاقEmail Credits نفسه.
خطة MailKit ($19/شهريًا، 5,000 رسالة بريد إلكتروني)
Create the subscription
- انتقل إلى Products → Create Product
- أدخل تفاصيل المنتج:
MailKit Planالوصف: 5,000 transactional emails per month.- حدّد Subscription نوعًا للمنتج
- عيّن السعر المتكرر:
19.00دورة الفوترة: Monthlyالعملة: USDAttach the email credit entitlement
Email Creditsالأرصدة المُصدرة لكل دورة فوترة: 5000حد انخفاض الرصيد: 20 (نسبة مئوية؛ يُطلق credit.balance_low عندما ينخفض الرصيد إلى أقل من 20% من حصة الدورة، أي 1,000 رسالة بريد إلكتروني)استيراد إعدادات الرصيد الافتراضية: مفعّل (يستخدم مدة الصلاحية البالغة 30 يومًا من الخطوة 1)انقر على Add to Product، ثم Save المنتج. انسخ معرّف المنتج (pdt_xxxxxxxxxxxx).حزمة الشحن ($9 لمرة واحدة، 5,000 رسالة بريد إلكتروني)
Create a one-time product
- انتقل إلى Products → Create Product
- أدخل تفاصيل المنتج:
Email Top-Up Packالوصف: Add 5,000 emails to your MailKit balance instantly.- حدّد Single Payment نوعًا للمنتج
- عيّن السعر:
9.00العملة: USDAttach the credit grant
- استحقاق الرصيد:
Email Credits - الأرصدة المُصدرة:
5000
الخطوة 3: إعداد الواجهة الخلفية
أنشئ الآن خادم Express الذي يتعامل مع الدفع، والإرسال، والاستعلامات عن الرصيد، وwebhooks.Initialize the project
package.json:Configure environment variables
.env:DODO_WEBHOOK_KEY في الخطوة 4 بعد إنشاء نقطة النهاية. يأتي مفتاح Resend API من resend.com/api-keys.Build the server
server.ts في جذر المشروع: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
- انتقل إلى Developers → Webhooks → Add Endpoint
- URL:
https://1234abcd.ngrok-free.app/webhooks/dodo - الأحداث: اشترك في
credit.addedوcredit.balance_lowوcredit.rolled_over - احفظ مفتاح signing key، ثم انسخه إلى
.envباسمDODO_WEBHOOK_KEY - أعد تشغيل الخادم
الخطوة 5: اختبار التدفق بالكامل
Start the server
MailKit running on http://localhost:3000. افتحه في متصفحك.Subscribe a test customer
- في القسم 1، أدخل بريدًا إلكترونيًا تجريبيًا واسمًا، ثم انقر على Get checkout link
- افتح الرابط وأكمل الدفع باستخدام بطاقة اختبار
- بعد الدفع، اعثر على
customer_idفي لوحة التحكم ضمن Customers
Send a real email
- الصق
customer_idفي القسم 3 - اترك
toمضبوطًا علىdelivered@resend.dev(صندوق الوارد التجريبي في Resend الذي يقبل كل شيء) - انقر على Send
Trigger the low-balance webhook
- انتقل إلى Customers → [Customer] → Credits → Email Credits
- انقر على Adjust Balance وخصم
4000 - أرسل رسالة بريد إلكتروني أخرى من خلال العرض التجريبي
Buy a top-up pack
- الصق
customer_idفي القسم 4 - انقر على Buy 5,000 emails وأكمل الدفع التجريبي
- حدّث الرصيد، وستجده قد زاد بمقدار 5,000
credit.added مع grant_source: one_time. تتراكم حزمة الشحن فوق أرصدة الاشتراك؛ ويُستهلك كلا الرصيدين وفق FIFO (أقدم منحة غير منتهية الصلاحية أولًا).Test the hard stop
استكشاف الأخطاء وإصلاحها
Webhook signature verification fails (401)
Webhook signature verification fails (401)
express.json() بتحليل الحمولة وإعادة تسلسلها، ما يؤدي إلى كسر HMAC. تأكد من تسجيل /webhooks/dodo باستخدام express.raw({ type: 'application/json' }) فوق سطر app.use(express.json())، وأن DODO_WEBHOOK_KEY يطابق مفتاح التوقيع الظاهر في صفحة تفاصيل نقطة النهاية.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 (جدولcustomersفي لوحة التحكم)، وليس من قاعدة بياناتك الخاصة
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
Instant ledger debits
createLedgerEntry بعد كل إرسال. بلا عداد، ولا تأخر في التجميع، وهو idempotent عند إعادة المحاولة باستخدام معرّف رسالة Resend.