{"id":27118344,"url":"https://github.com/coffeebeanslabs/notif-engine","last_synced_at":"2025-04-07T07:37:29.416Z","repository":{"id":54605896,"uuid":"276841878","full_name":"CoffeeBeansLabs/notif-engine","owner":"CoffeeBeansLabs","description":"The 'notif-engine' is an 'npm module' to store notifications before sending them in the supported data stores and then send them through supported providers; nevertheless, it updates the status of sending the notifications in your data store.","archived":false,"fork":false,"pushed_at":"2021-09-10T02:33:46.000Z","size":320,"stargazers_count":3,"open_issues_count":7,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-22T02:18:32.625Z","etag":null,"topics":["email","email-notifications","inapp","inapp-notifications","javascript","javascript-modules","nodejs","notif-engine","notifications","npm-module","push","push-notifications","slack","slack-notifications","sms","sms-notifications","webpush","webpush-notifications"],"latest_commit_sha":null,"homepage":"https://coffeebeanslabs.github.io/notif-engine/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CoffeeBeansLabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-03T07:55:19.000Z","updated_at":"2023-01-23T21:24:45.000Z","dependencies_parsed_at":"2022-08-13T21:10:48.710Z","dependency_job_id":null,"html_url":"https://github.com/CoffeeBeansLabs/notif-engine","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoffeeBeansLabs%2Fnotif-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoffeeBeansLabs%2Fnotif-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoffeeBeansLabs%2Fnotif-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoffeeBeansLabs%2Fnotif-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CoffeeBeansLabs","download_url":"https://codeload.github.com/CoffeeBeansLabs/notif-engine/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247615178,"owners_count":20967178,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["email","email-notifications","inapp","inapp-notifications","javascript","javascript-modules","nodejs","notif-engine","notifications","npm-module","push","push-notifications","slack","slack-notifications","sms","sms-notifications","webpush","webpush-notifications"],"created_at":"2025-04-07T07:37:28.644Z","updated_at":"2025-04-07T07:37:29.409Z","avatar_url":"https://github.com/CoffeeBeansLabs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# notif-engine\n\nThe 'notif-engine' is an 'npm module' to store notifications before sending them in the supported data stores and then send them through supported providers; nevertheless, it updates the status of sending the notifications in your data store.\n\n- [Features](#features)\n- [How to use](#how-to-use)\n- [Contributing](#contributing)\n- [Need help? Found a bug?](#need-help-found-a-bug-feature-request)\n- [Vote of thanks to the community for](#vote-of-thanks-to-the-community-for)\n\n## Features\n\n* **Easy notification storage (multiple channel support)** — Store `email` | `push` before sending them. Currently supports MongoDB as the data store.\n\n* **Easy notification sending** — Send `email` | `push` through supported providers and update the status in your data store. Currently supports [Amazon Simple Email Service](https://aws.amazon.com/ses/) for emails and [OneSignal](https://onesignal.com/) for push notifications.\n\n* **Multi lingual template support** — Define templates in multiple languages and use them.\n\n* **MIT license** — Use it like you want.\n\n## How to use\n\n### Installation for using as a producer\n\n#### [Via npm](https://www.npmjs.com/package/@coffeebeanslabs/notif-engine)\n\n```shell\n$ npm i @coffeebeanslabs/notif-engine\n```\n\n#### [Via yarn](https://classic.yarnpkg.com/en/package/@coffeebeanslabs/notif-engine)\n\n```shell\n$ yarn add @coffeebeanslabs/notif-engine\n```\n\n#### Producing email from your code\n```javascript\nconst notifEngine = require('@coffeebeanslabs/notif-engine');\n\nawait notifEngine.createNotificationTransaction({\n  mongo: {\n    MONGOURL: '\u003cyour_mongourl_or_mongoclusterurls\u003e',\n    DATABASE_NAME: '\u003csame-as-dynamic.mail.database_name-in-consumer/configurations/configuration.json\u003e',\n    SCHEMA_NAME: '\u003csame-as-dynamic.mail.schema_name-in-consumer/configurations/configuration.json\u003e',\n  },\n  data: {\n    server: '\u003cyour_operating_server_type_localhost/staging/production'\u003e,\n    type: 'mail',\n    provider: 'amazonses',\n    trigger_event: 'create',\n    notification_template_slug: 'welcome',\n    user_id: ['your_user_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],\n    user_email: ['your_user_email_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],\n    data: [{\n      user_id: 'each_values_in_data.user_id_will_have_one_object_each_in_data.data',\n      user_email: 'each_values_in_data.user_email_will_have_one_object_each_in_data.data',\n      user_name: 'your_user\\'s_name',\n      user_language: 'your_user\\'s_language_must_be_one_of_defined_inside_the_respective_template_in_template_schema',\n      brand_name: '\u003cyour_brand_name\u003e',\n      verification_link: '\u003cyour_verification_link\u003e',\n      brand_url: '\u003cyour_brand_url_link\u003e',\n      brand_url_without_protocol: '\u003cyour_brand_url_link_without_protocol\u003e',\n      attachments: ['your_file_paths_as_array_of_strings_compatible_with_nodemailer'],\n      include_player_ids: ['your_onesignal_player_ids_targeted_in_the_notification']\n    }],\n    status: -1,\n    db_created_at: \u003ctimestamp\u003e,\n    db_updated_at: \u003ctimestamp\u003e\n  }\n});\n```\n\n#### Producing push from your code\n```javascript\nconst notifEngine = require('@coffeebeanslabs/notif-engine');\n\nawait notifEngine.createNotificationTransaction({\n  mongo: {\n    MONGOURL: '\u003cyour_mongourl_or_mongoclusterurls\u003e',\n    DATABASE_NAME: '\u003csame-as-dynamic.push.database_name-in-consumer/configurations/configuration.json\u003e',\n    SCHEMA_NAME: '\u003csame-as-dynamic.push.schema_name-in-consumer/configurations/configuration.json\u003e',\n  },\n  data: {\n    server: '\u003cyour_operating_server_type_localhost/staging/production'\u003e,\n    type: 'push',\n    provider: 'onesignal',\n    trigger_event: 'create',\n    notification_template_slug: 'welcome',\n    user_id: ['your_user_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],\n    user_email: ['your_user_email_ids_as_array_of_strings_for_users_targeted_in_the_notification_this_helps_for_filtering_and_reporting_purposes_only'],\n    data: [{\n      user_id: 'each_values_in_data.user_id_will_have_one_object_each_in_data.data',\n      user_email: 'each_values_in_data.user_email_will_have_one_object_each_in_data.data',\n      user_name: 'your_user\\'s_name',\n      user_language: 'your_user\\'s_language_must_be_one_of_defined_inside_the_respective_template_in_template_schema',\n      brand_name: '\u003cyour_brand_name\u003e',\n      verification_link: '\u003cyour_verification_link\u003e',\n      brand_url: '\u003cyour_brand_url_link\u003e',\n      brand_url_without_protocol: '\u003cyour_brand_url_link_without_protocol\u003e',\n      attachments: ['your_file_paths_as_array_of_strings_compatible_with_nodemailer'],\n      include_player_ids: ['your_onesignal_player_ids_targeted_in_the_notification']\n    }],\n    status: -1,\n    db_created_at: \u003ctimestamp\u003e,\n    db_updated_at: \u003ctimestamp\u003e\n  }\n});\n```\n\n\n### Installation for using as a consumer process\n\n#### Setting up the consumer process\n```shell\n$ git@github.com:CoffeeBeansLabs/notif-engine.git \u0026\u0026 cd notif-engine \u0026\u0026 npm install\n```\nor\n```shell\n$ https://github.com/CoffeeBeansLabs/notif-engine.git \u0026\u0026 cd notif-engine \u0026\u0026 npm install\n```\n\n#### Setting up the consumer process\n\n- Create a new file at `consumer/configurations/configuration.json` manually or by copy pasting and editing the contents of `consumer/configurations/configuration.template.json`\n- Be sure to at least update the `\u003cdatabase_name_here\u003e`, `\u003cschema_name_here\u003e` and `'Full Name' \u003cemail@address.com\u003e` in the file\n- You are now ready to turn on the consumer process\n- The `batch_size` is for the quantum of messages being read in a single read for sending\n- The `max_retries` is for the number of attempts being done while sending, if the sending fails\n- As a rule of thumb, for all schemas the meaning of the statuses is as below :\n  - `-2` = `SENDING_FAILED`\n  - `-1` = `NOT_PROCESSED` // The default which has to be set for produced notifications to get created and then sent\n  - `0` = `PROCESSING`  \n  - `1` = `SENDING_SUCCEEDED`\n- As a rule of thumb, for all schemas the meaning of the enabled_flags is as below :\n  - `1` = `ENABLED`\n  - `0` = `DISABLED`\n\n#### Turning on the consumer process\n\n\u003e\n\u003eSESHOST=\"\u003camazonses_host\u003e\" SESPORT=\u003camazonses_port\u003e SESISSECURE=\u003camazonses_is_secure_flag_integer_0_or_1\u003e SESUSER=\"\u003camazonses_user\u003e\" SESPASS=\"\u003camazonses_password\u003e\" OSAPPID=\"\u003conesignal_appid\u003e\" OSAPIKEY=\"\u003conesignal_apikey\u003e\" MONGOURL=\"\u003cyour_mongourl_or_mongoclusterurls\u003e\" node consumer/app.js\n\u003e\n\n### Concepts for entities involved\n\n#### tl;dr\n\n- Templates form the base content layout for all the channels and are prerequisite for the `notif-engine` to work\n- Transactions are produced from your code into the `notif-engine` to have enough data to produce the actual notifications for respective channels, this is called the producer code\n- `notif-engine` runs and creates respective channel notifications (`email` | `push`) in their specified schemas, this is called the consumer code\n- For producer, the configuration is passed as parameters to the function calls\n- For consumer, the `consumer/configurations/configuration.json` is the base for the configuration and the consumer process works on this. This file is to be created manually before turning on the consumer process and a template is available for the same at `consumer/configurations/configuration.template.json`\n\n#### Templates\n\n- The templates provide a mechanism to configure a base for each supported channel which will be string replaced by the data in transactions to generate the actual data that will be stored in the respective collections of that respective channel and this actual data stored will be used to send the notification via the configured service provider\n- [Reference for designing email templates](https://nodemailer.com/message/)\n- [Reference for designing html inside the email templates](https://templates.mailchimp.com/development/html/)\n- [Reference for designing push templates for onesignal](https://documentation.onesignal.com/reference/create-notification)\n- HTML output for the ```en``` email template below\n![notif-engine-email-template-preview](https://raw.githubusercontent.com/CoffeeBeansLabs/notif-engine/master/meta/img/notif-engine-email-template-preview.png)\n- Push output for the ```en``` push template below\n![notif-engine-push-template-preview](https://raw.githubusercontent.com/CoffeeBeansLabs/notif-engine/master/meta/img/notif-engine-push-template-preview.png)\n- Setting up test data for templates manually\n  - ```\u003cschema_name_here\u003e``` is the collection which stores templates data and has to be configured in ```consumer/configurations/configuration.json base.template.schema_name``` for using the module\n  - ```slug``` identifier for the template, as database primary keys/id keys may change but this will always be consistent for retrieval\n  - ```name``` human readable string for describing the template\n  - ```inapp_template``` inapp notification template for the template in consideration\n  - ```email_template``` email notification template for the template in consideration\n  - ```email_template.provider``` email notification provider\n  - ```email_template.subject``` email notification subject which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)\n  - ```email_template.html``` email notification html/content which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)\n  - ```email_template.attachments``` email notification attachments as supported by [nodemailer](https://nodemailer.com/message/attachments/)\n  - ```push_template``` push notification template for the template in consideration\n  - ```push_template.provider``` push notification provider\n  - ```push_template.headings``` push notification heading which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)\n  - ```push_template.subtitle``` push notification subtitle which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)\n  - ```push_template.contents``` push notification contents which supports multiple languages as keys with values of text in that language(can be string replaced to personalize/customize)\n  - ```push_template.url``` push notification hyperlink to open (external url or internal deep links to the app)\n  - ```push_template.android_accent_color``` push notification accent color for android devices\n  - ```push_template.huawei_accent_color``` push notification accent color for huawei devices\n  - ```push_template.android_led_color``` push notification led color for android devices\n  - ```push_template.huawei_led_color``` push notification led color for huawei devices\n  - ```sms_template``` sms notification template for the template in consideration\n  - ```is_enabled``` switch for turning on/off the usage of template in consideration\n  \n```javascript\ndb.getCollection('\u003cschema_name_here\u003e').insertOne({\n    \"slug\" : \"welcome\",\n    \"name\" : \"welcome mail with verification link\",\n    \"inapp_template\" : null,\n    \"email_template\" : {\n        \"provider\" : \"amazonses\",\n        \"subject\" : {\n            \"en\" : \"Welcome to CoffeeBeans Consulting LLP!\",\n            \"in\" : \"Selamat Datang di CoffeeBeans Consulting LLP!\"\n        },\n        \"html\" : {\n            \"en\" : \"\u003ctable border=\\\"0\\\" cellpadding=\\\"0\\\" cellspacing=\\\"0\\\" height=\\\"100%\\\" width=\\\"100%\\\" id=\\\"bodyTable\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"600\\\" id=\\\"emailContainer\\\" style=\\\"border-radius: 10px;box-shadow: 0 2.8px 2.2px rgba(0, 0, 0, 0.034), 0 6.7px 5.3px rgba(0, 0, 0, 0.048), 0 12.5px 10px rgba(0, 0, 0, 0.06), 0 22.3px 17.9px rgba(0, 0, 0, 0.072), 0 41.8px 33.4px rgba(0, 0, 0, 0.086), 0 100px 80px rgba(0, 0, 0, 0.12)\\\"\u003e \u003ctr style=\\\"background-color: #f7dc61;\\\"\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"100%\\\" id=\\\"emailHeader\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003cimg src=\\\"https://www.coffeebeans.io/images/logo-a8559bab.png\\\" alt=\\\"CoffeeBeans Consulting LLP logo\\\" width=\\\"50\\\" height=\\\"50\\\"\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"100%\\\" id=\\\"emailBody\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"left\\\" valign=\\\"top\\\"\u003e Hi {{user_name}}, \u003cbr/\u003e\u003cbr/\u003eWelcome! We are incredibly excited to have you on {{brand_name}}. We applaud your fantastic decision :). \u003cbr/\u003e\u003cbr/\u003e Please click on the following verification link to verify your email and enjoy all the benefits of using {{brand_name}} : \u003ca href=\\\"{{verification_link}}\\\" target=\\\"_blank\\\" style=\\\"text-decoration: none;color: #f7dc61;\\\"\u003e{{verification_link}}\u003c/a\u003e\u003cbr/\u003e\u003cbr/\u003eCheers, \u003cbr/\u003e{{brand_name}}\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"100%\\\" id=\\\"emailFooter\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e\u003ca href=\\\"{{brand_url}}\\\" target=\\\"_blank\\\" style=\\\"text-decoration: none;color: #f7dc61;\\\"\u003e{{brand_url_without_protocol}}\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\",\n            \"in\" : \"\u003ctable border=\\\"0\\\" cellpadding=\\\"0\\\" cellspacing=\\\"0\\\" height=\\\"100%\\\" width=\\\"100%\\\" id=\\\"bodyTable\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"600\\\" id=\\\"emailContainer\\\" style=\\\"border-radius: 10px;box-shadow: 0 2.8px 2.2px rgba(0, 0, 0, 0.034), 0 6.7px 5.3px rgba(0, 0, 0, 0.048), 0 12.5px 10px rgba(0, 0, 0, 0.06), 0 22.3px 17.9px rgba(0, 0, 0, 0.072), 0 41.8px 33.4px rgba(0, 0, 0, 0.086), 0 100px 80px rgba(0, 0, 0, 0.12)\\\"\u003e \u003ctr style=\\\"background-color: #f7dc61;\\\"\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"100%\\\" id=\\\"emailHeader\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003cimg src=\\\"https://www.coffeebeans.io/images/logo-a8559bab.png\\\" alt=\\\"CoffeeBeans Consulting LLP logo\\\" width=\\\"50\\\" height=\\\"50\\\"\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"100%\\\" id=\\\"emailBody\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"left\\\" valign=\\\"top\\\"\u003e Hai {{user_name}}, \u003cbr/\u003e \u003cbr/\u003e Selamat datang! Kami sangat senang menerima Anda di {{brand_name}}. Kami menghargai keputusan fantastis Anda :). \u003cbr/\u003e \u003cbr/\u003e Silakan klik tautan verifikasi berikut untuk memverifikasi email Anda dan nikmati semua manfaat menggunakan {{brand_name}} : \u003ca href=\\\"{{verification_link}}\\\" target=\\\"_blank\\\" style=\\\"text-decoration: none;color: #f7dc61;\\\"\u003e{{verification_link}}\u003c/a\u003e\u003cbr/\u003e \u003cbr/\u003e Ceria, \u003cbr / \u003e{{brand_name}}\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e \u003ctable border=\\\"0\\\" cellpadding=\\\"20\\\" cellspacing=\\\"0\\\" width=\\\"100%\\\" id=\\\"emailFooter\\\"\u003e \u003ctr\u003e \u003ctd align=\\\"center\\\" valign=\\\"top\\\"\u003e\u003ca href=\\\"{{brand_url}}\\\" target=\\\"_blank\\\" style=\\\"text-decoration: none;color: #f7dc61;\\\"\u003e{{brand_url_without_protocol}}\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\"\n        },\n        \"attachments\" : []\n    },\n    \"push_template\" : {\n        \"provider\" : \"onesignal\",\n        \"headings\" : {\n            \"en\" : \"Welcome!\",\n            \"in\" : \"Selamat datang!\"\n        },\n        \"subtitle\" : {\n            \"en\" : \"Excited to have you onboard\",\n            \"in\" : \"Senang melihat Anda bergabung\"\n        },\n        \"contents\" : {\n            \"en\" : \"Hi {{user_name}}, we are incredibly excited to have you onboard and have sent you a verification email.\",\n            \"in\" : \"Halo {{user_name}}, kami sangat senang Anda bergabung dan mengirimkan email verifikasi.\"\n        },\n        \"url\" : \"https://www.coffeebeans.io\",\n        \"android_accent_color\" : \"FFFF0000\",\n        \"huawei_accent_color\" : \"FFFF0000\",\n        \"android_led_color\" : \"FF0000FF\",\n        \"huawei_led_color\" : \"0000FF\"\n    },\n    \"sms_template\" : null,\n    \"is_enabled\" : 1\n});\n```\n\n## Contributing\n\n### Pull requests\nAnd, of course, feel free to submit pull requests with bug fixes/changes/feature additions. All contributions are always welcomed!\n\nTo get started: [fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device.\n\n```shell\n$ git clone git@github.com:[YOUR_USERNAME]/notif-engine.git \u0026\u0026 cd notif-engine \u0026\u0026 npm install\n```\n\n### [Publish on npm](https://www.npmjs.com/package/np)\n```shell\n$ np\n```\n\n### [Publish on yarn](https://classic.yarnpkg.com/en/docs/publishing-a-package/)\n```shell\n$ yarn publish\n$ yarn info @coffeebeanslabs/notif-engine // for package info\n```\n\nThen add, commit, push to your repo and finally send a [pull request](https://help.github.com/articles/creating-a-pull-request/)\n\n\n## Need Help? Found a bug? Feature Request?\n\n[Feel free to open an issue](https://github.com/CoffeeBeansLabs/notif-engine/issues).\n\n\n## Vote of thanks to the community for\n- [MongoDB Node.JS Driver](https://www.npmjs.com/package/mongodb)\n- [Nodemailer](https://www.npmjs.com/package/nodemailer)\n- [onesignal-node](https://www.npmjs.com/package/onesignal-node)\n- [Sindre Sorhus](https://github.com/sindresorhus) for the amazing module [np](https://www.npmjs.com/package/np). This module has been of immense help, making ```npm publish``` easy and blazing fast.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoffeebeanslabs%2Fnotif-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoffeebeanslabs%2Fnotif-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoffeebeanslabs%2Fnotif-engine/lists"}