Project

General

Profile

Support #9702 ยป common_emailservice.txt

Yalavarthi Thriveni, 07/09/2026 07:38 AM

 
Use one tenant-aware email service as the only counted path: [src/utils/email.js (line 102)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\email.js:102) or, if you want the cleaner long-term version, [src/utils/mailer/base.mail.js (line 87)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\mailer\\base.mail.js:87). Both already record tenant usage, but right now the repo is split between them.
For accurate per-tenant email counting, every triggered email should go through one common sender and always pass dbName for non-request flows.
Recommended common service
Use [src/utils/mailer/base.mail.js (line 87)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\mailer\\base.mail.js:87) as the final common service.
Reason:
It is tenant-aware via ConnectEmail
It supports templates
It already records metered usage per tenant
It is a better abstraction than scattering raw sendEmail(...)
Places already good for tenant counting
These already use the common path with dbName explicitly:
[src/utils/notifyUsers.js (line 224)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\notifyUsers.js:224)
[src/utils/notifyUsers.js (line 293)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\notifyUsers.js:293)
[src/routes/EvergreenInvoice/EverGreen-invoice-controller.js (line 2109)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\routes\\EvergreenInvoice\\EverGreen-invoice-controller.js:2109)
[src/routes/EvergreenInvoice/EverGreen-invoice-controller.js (line 5059)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\routes\\EvergreenInvoice\\EverGreen-invoice-controller.js:5059)
[src/routes/EvergreenInvoice/EverGreen-invoice-controller.js (line 6704)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\routes\\EvergreenInvoice\\EverGreen-invoice-controller.js:6704)
Places that must reuse the common service for correct per-tenant counting
These are the important email-trigger services to standardize:
Subscription/service email helper layer[src/services/email.service.js (line 63)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:63)
[src/services/email.service.js (line 115)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:115)
[src/services/email.service.js (line 206)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:206)
[src/services/email.service.js (line 274)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:274)
[src/services/email.service.js (line 299)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\services\\email.service.js:299)

These should all pass dbName into the common sender.
Webhook-triggered emails[src/webhook-handlers/subscriptionUpdated.js (line 199)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\webhook-handlers\\subscriptionUpdated.js:199)
Also similar webhook mail flows in:src/webhook-handlers/*
src/service-webhook-handlers/*


These run outside normal request context, so they must use the common sender with explicit dbName.
Cron-triggered emails[src/cron/subscriptionEmailCron.js (line 267)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\cron\\subscriptionEmailCron.js:267)
[src/cron/subscriptionEmailCron.js (line 352)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\cron\\subscriptionEmailCron.js:352)
[src/cron/subscriptionEmailCron.js (line 404)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\cron\\subscriptionEmailCron.js:404)
Also review:src/cron/workerCron.js
src/cron/enquiryCron.js
src/cron/orderTrackingCron.js


Cron jobs are the biggest risk for wrong tenant counts if dbName is omitted.
Business services sending customer/admin emailssrc/allservices/InvoiceService.js
src/allservices/clientService.js
src/allservices/jobService.js
src/services/subscripiton.service.js
src/services/orderTrackingService.js
src/services/nursery/order.service.js
src/services/nursery/payment.service.js
src/services/nursery/sale.service.js
src/services/nursery/ecom.service.js
src/services/nursery/assets.service.js
src/services/quotation.service.js

Controllers/routes still triggering email directlysrc/controllers/EverGreenQuotation/QuotationController.js
src/controllers/ProductQuotation/product-quote.controller.js
src/controllers/nursery/shop-controller.js
src/controllers/nursery/user-controller.js
src/controllers/user-controller.js
src/controllers/subscription.controller.js
src/controllers/superadmin/onboarding.controller.js
src/routes/productQuoteRoute.js
src/routes/productInvoiceRoute.js

Architecture recommendation
For tenant email counting, define one rule:
All email triggers must call one function like:
sendTenantEmail({ dbName, to, subject, html, template, attachments, service })
Then meter only there.
Best answer to your question
The email service you should use for counting per tenant is the single shared backend sender:
Preferred final choice: [src/utils/mailer/base.mail.js (line 87)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\mailer\\base.mail.js:87)
Current most-used choice: [src/utils/email.js (line 102)](G:\\POS\\EGF_POS\\evergreen_pos_be\\src\\utils\\email.js:102)
    (1-1/1)