Giter Site home page Giter Site logo

parcelvoy / platform Goto Github PK

View Code? Open in Web Editor NEW
138.0 6.0 21.0 8.88 MB

Parcelvoy: Open source multi-channel marketing automation platform. Send data-driven emails, sms, push notifications and more!

Home Page: https://parcelvoy.com

License: Other

JavaScript 4.72% TypeScript 89.91% Dockerfile 0.13% Shell 0.02% HTML 0.22% CSS 5.01%
campaign email marketing messages notifications push-notifications sms webhook multichannel omni

platform's People

Contributors

chrishills avatar pushchris avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

platform's Issues

Unable to setup a campaign with a local webhook channel

Hello,
I have a local setup of parcelvoy with docker-compose.

I have gone ahead to setup a webhook integration together with a simple campaign and I am unable
to get the webhook working correctly. In the logs, i see the following:

worker_1  |     error: {}
worker_1  | [1688592420268] ERROR (9 on 6e41aeabb571): queue:job:errored
worker_1  |     stacktrace: "TypeError: Cannot convert undefined or null to object\n    at Function.keys (<anonymous>)\n    at WebhookChannel.send (/usr/src/app/providers/webhook/WebhookChannel.js:22:29)\n    at handler (/usr/src/app/providers/webhook/WebhookJob.js:29:23)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n    at async Queue.dequeue (/usr/src/app/queue/Queue.js:36:9)\n    at async worker.bullmq_1.Worker.connection [as processFn] (/usr/src/app/queue/RedisQueueProvider.js:62:13)\n    at async Worker.processJob (/usr/src/app/node_modules/bullmq/dist/cjs/classes/worker.js:346:28)\n    at async Worker.retryIfFailed (/usr/src/app/node_modules/bullmq/dist/cjs/classes/worker.js:520:24)"
worker_1  |     job: {
worker_1  |       "name": "webhook",
worker_1  |       "data": {
worker_1  |         "campaign_id": 10,
worker_1  |         "user_id": 20,
worker_1  |         "send_id": 39
worker_1  |       },
worker_1  |       "options": {
worker_1  |         "delay": 0,
worker_1  |         "attempts": 3
worker_1  |       }
worker_1  |     }
worker_1  |     error: {}
mysql_1   | mbind: Operation not permitted

Could you please help shed some light on this?
Thanks

Screenshot 2023-07-05 at 23 37 59

We need a better documentation

The documentation about the use of journeys is not the best. We need examples, templates, how exactly use each tool. In the documentations says that use handlebars but when I try to use it does not work, so how exactly you implement handlebars templates?... Same with email campaings, the editor does not have integration with the variables to populate the email with user and event data. We dont have examples of how to do it and when you use the {{ user.email }} squeme dont work as well. I'm very lost using this. We need examples of how exactly do the things

Regarding LICENSE

Let me explain my intention of use and seek your advice regarding the current LICENSE restrictions:

I am building a campaign platform who has its own email sending algorithm to avoid emails going into the Spam. The algorithm revolves around sending emails at variable times and variable intervals.

I am using your repository as a base start (if you allow) and build the email sending algorithm on top of it. Starting from scratch would take time, and building the UI takes hectic efforts.

Is it possible that i contribute back to you in your features and you allow the commercial use of this initial code-base? Some of the features could be helpful for you too like CSV uploads of contacts, SendGrid integration, Azure AD integration. Any thoughts?

Gates not using event data

Setting up a pretty basic gate check using event data and it never seems to work. Gates are working when I use user values, its just any that use event data don't seem to evaluate. It may be related but I am also unable to set a Data Key value to then entrance, it just never saves. Using the latest docker images.

Docker Container isn't starting

Here are the logs:

ERROR: for api Container "4b6347da86c0" is unhealthy. ERROR: Encountered errors while bringing up the project. [ec2-user@ip-172-31-91-197 platform]$ docker logs 4b6347da86c 2023-04-13 14:42:01+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started. 2023-04-13 14:42:01+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2023-04-13 14:42:01+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started. 2023-04-13T14:42:01.750028Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 1 2023-04-13T14:42:01.761481Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2023-04-13T14:42:02.018619Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2023-04-13T14:42:02.214023Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main 2023-04-13T14:42:02.214060Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main 2023-04-13T14:42:02.214947Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 2023-04-13T14:42:02.214995Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 2023-04-13T14:42:02.217367Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 2023-04-13T14:42:02.240228Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock 2023-04-13T14:42:02.240441Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

I have tried everything - even Gpt4 can't figure it out 😂

Add lists

Create a structure to house lists

  • Allow for them to be dynamic and generated based on rules
  • Ensure structure is cacheable and easily accessible
  • Ensure structure can also support static lists

Date format

Please, can you clarify what is the format of the date expected in the filters. Nothing works...

Screenshot 2023-12-17 at 21 37 46

Broken link when accessing the details of a subscription

When I click
Settings / Subscriptions / Default Email

I get this error message

Looks Like You're Lost!
The page or resource you are looking for does not exist or has been moved.
Go back

The URL in the browser at that time is:
https://my-domain.com/projects/1/settings/subscriptions/1

Even when I create a new subscription of my own, and I click on that subscription, the same error message appears.

The version I use is new. I installed the docker container today (Sat, March 9, 2024):
ghcr.io/parcelvoy/api:latest

What can I do?

Add authentication

Allow for the following main forms of authentication:

  • SAML
  • OpenID
  • MagicLink

API missing important endpoints

Dear Team,

We have started to look into your product and find it quite helpful.

However, some critical parts still need to be there, which makes it impossible to use for Production.

  1. Any data must have the possibility to be deleted. It especially important for PII data. Legally, any user can request the deletion of data (GDPR right to be forgotten, for example).
    With that said, both API and UI should have the Client deletion.
    Mainly, it is essential on the API level, as any mistake, for example, a wrongly created record, is currently impossible to delete.

Therefore, the DELETE client/:id endpoint is suggested to be implemented. P.S. Delete Job already exists.

  1. API does not currently allow overwriting the data partially. Suggest that POST /client/identify endpoint should in fact, act as Create, as it is implied according to the REST and the endpoint name. A new endpoint is needed to PATCH /client/:id to update the full or partial data of the Client.

  2. API is inconsistent. Examples:
    a. /client endpoints are in fact representing the User. In fact, the internal API uses the User as the entity.
    b. POST /client/identify is a strange name. It is not clear what Identify actually means. It would be best to use the REST approach when working with Entities. Aka POST /client, GET /client/:id, PATCH /client/:id

Add push notification support

Minimum support should be Android and iOS using local push notification libraries.

Further support could include:

  • SNS
  • ADM (Android)
  • Also using FCM for iOS?

Feature Request: SMTP Account Grouping and Hourly/Daily Rate Restrictions

In today's dynamic email marketing landscape, one widespread strategy involves the utilization of numerous Google Workspace email accounts, each typically sending around 50 emails daily.

Given the limited number of emails sent from each account, there is a necessity to consolidate these accounts into groups. This would enable a more substantial daily email output. Hence, the request for the ability to group these SMTP accounts and implement hourly/daily rate limits is of utmost importance.

Events are not consumed by the Journey

Hi,

Here is the basic Journey setup:

Screenshot 2024-01-04 at 18 41 27

After that:

curl -X "POST" "https://XXXX.com/api/client/events" \
     -H 'Authorization: Bearer ZZZZZ' \
     -H 'Accept: application/json' \
     -H 'Content-Type: application/json' \
     -d $'[
  {
    "name": "user_created",
    "external_id": "06ca2362-7950-4a2a-9a3d-142ea6bd626c"
  }
]'

And nothing happens - the Journey is not triggered... This event is, however, visible on the User:
Screenshot 2024-01-04 at 18 43 46

There are errors in the logs either.

Add client side API endpoints

Create endpoints just for a user lifecycle.

Lifecycle:

  • Anonymous
  • Identified
  • Triggered Event
  • Registered Device
  • Logout

These endpoints should be distinct from any other client endpoints.

Also need to refactor existing client endpoints so that anything destructive isn't allowed with public keys.

Create image embed for emails to track open rates

All emails should contain a tiny image that when loaded creates an event that marks an email as being opened

<img border="0" width="1" height="1" alt="" src="https://links.parcelvoy.com/q/399UpetrvE0gob5ic6F50g">

Or some such thing

Project Roles

Permissions:

  • campaigns: view | edit | send
  • journey: view | edit (| publish/enable?)
  • lists/users: view | edit lists | manage user subs
  • settings access

Types of admins:

  • support can search users, manage subscription settings
  • author can do anything except manage settings
  • admin can do anything

Self-host - Onboarding Stuck

We installed Parcelvoy on AWS. Once we login we see a "Looks Like You're Lost! The page or resource you are looking for does not exist or has been moved." error.
When I click on back, it show the base page with the button to "create project". However, it redirects immediately to the same error again.

The URL stays at http://ec2-ip:3000/organization/projects/onboarding

Screenshot 2024-03-21 at 4 09 15 PM

Is there any configuration that's needed?

I also tried updating the BASE_URL to the ec2 URL. same status.

Uploaded image not found (error 404)

When I upload an image inside the email template editor, it lands in my ./data/uploads directory correctly. However, when I want to preview the email, the image is not found. The server returns HTTP 404 (not found).

In my .env file, next to the docker compose file, I have this setting:

STORAGE_DRIVER=local
STORAGE_BASE_URL=https://my-domain.com/uploads

In the docker-compose file, the volume declaration looks like this:

volumes:
  mysql_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/mysql

  redis_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/redis

  uploads:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./data/uploads

Upload works fine, the image is in the correct directory!

These are the permissions of the directory:

drwxr-xr-x 2             1000             1000 4096 Mar 10 15:38 uploads

What needs to be done here?

Add campaigns

Campaigns could be a good middle ground between journeys, lists and templates. They could also be used for individual sending of emails to users without going through a journey.

Analytics could be associated to campaigns for more in-depth analysis

Create date handlers for templates

Adds methods for manipulating dates inside of templates. Need at least the following:

  • now which lets you access the current time and format it
  • dateFormat which takes a date, format and optional timezone so that you can format any date. It uses date-fns format options which differ from Moment
  • addDate takes a date, an amount and a unit and performs the math (such as add 1 day)
  • subDate the inverse of addDate basically

Adding SMTP Account Error

When I attempt to add a SMTP account in the UI, I get this error: Error Must be number . Here is the my payload request: {
"host": "email.hostname.io",
"port": "465",
"secure": true,
"auth": {
"user": "my email address",
"pass": "password"
}
}

Build and run local

hi guy, I build and run on my computer. When I login it appear error :
error: {
"status": "error",
"error": "Authorization error.",
"code": 1000
}
image

please help me.
thanks a lot

Feat request: Allow non-AWS S3 buckets

Two small amends to ask for:

  1. Please extend the config in order to be able to use S3 buckets from other providers.
    At the moment, the domain can not be changed. Allowing to do so - solves the issue.

Example of AWS SDK usage for DigitalOcean:

const s3Client = new S3Client({
    forcePathStyle: false, // Configures to use subdomain/virtual calling format.
    endpoint: "https://ams3.digitaloceanspaces.com", // ams3 is used in this case, for AWS it is not needed
    region: "us-east-1", // same as on AWS
    credentials: {
      accessKeyId: 'XXX',
      secretAccessKey: 'XXXX'
    }
  });
  1. Please add some form of image base URL. You upload to the S3 bucket (on AWS or outside), but it can be served via CDN or via a custom domain. Otherwise, it can not be served via CDN at all, that is quite important for emails.

Trouble Installing

Hello im having trouble installing the code...ive had my developer look at it as well. We are getting errors. Can you help me?

Error sending campaign

I deployed the system using a digital ocean droplet and docker and when I'm trying to launch a campaign, the campaign is never staring
Screenshot 2024-02-29 at 11 07 53 PM
Here is the error log

[1709265841097] ERROR (7 on 2aaf90a05584): queue:job:errored
    stacktrace: "Error: select * from `lists` where `id` in ({\"id\":2,\"created_at\":\"2024-03-01T03:57:27.000Z\",\"updated_at\":\"2024-03-01T04:00:00.000Z\",\"project_id\":1,\"name\":\"galad\",\"type\":\"dynamic\",\"state\":\"ready\",\"rule_id\":1,\"rule\":null,\"version\":4,\"users_count\":2,\"tags\":[\"users\"],\"is_visible\":true,\"deleted_at\":null}) - Unknown column 'tags' in 'where clause'\n    at createQueryBuilder (/usr/src/app/node_modules/knex/lib/knex-builder/make-knex.js:320:26)\n    at knex (/usr/src/app/node_modules/knex/lib/knex-builder/make-knex.js:101:12)\n    at List.table (/usr/src/app/build/core/Model.js:244:16)\n    at List.query (/usr/src/app/build/core/Model.js:59:21)\n    at estimatedSendSize (/usr/src/app/build/campaigns/CampaignService.js:383:40)\n    at handler (/usr/src/app/build/campaigns/CampaignGenerateListJob.js:21:77)\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n    at async Queue.dequeue (/usr/src/app/build/queue/Queue.js:59:9)\n    at async worker.bullmq_1.Worker.connection [as processFn] (/usr/src/app/build/queue/RedisQueueProvider.js:78:13)\n    at async Worker.processJob (/usr/src/app/node_modules/bullmq/dist/cjs/classes/worker.js:389:28)\n    at async Worker.retryIfFailed (/usr/src/app/node_modules/bullmq/dist/cjs/classes/worker.js:578:24)"
    job: {
      "name": "campaign_generate_list_job",
      "data": {
        "id": 2,
        "type": "blast",
        "project_id": 1,
        "list_ids": [
          2
        ],
        "exclusion_list_ids": null,
        "name": "Prueba",
        "channel": "email",
        "provider_id": 1,
        "subscription_id": 1,
        "state": "pending",
        "delivery": {
          "sent": 0,
          "opens": 0,
          "total": 2,
          "clicks": 0
        },
        "send_at": "2024-03-01T04:01:58.000Z",
        "send_in_user_timezone": false,
        "created_at": "2024-03-01T03:59:30.000Z",
        "updated_at": "2024-03-01T04:01:59.000Z",
        "deleted_at": null
      },
      "options": {
        "delay": 0,
        "attempts": 3
      }
    }
    error: {
      "code": "ER_BAD_FIELD_ERROR",
      "errno": 1054,
      "sqlState": "42S22",
      "sqlMessage": "Unknown column 'tags' in 'where clause'",
      "sql": "select * from `lists` where `id` in (`id` = 2, `created_at` = '2024-03-01 03:57:27.000', `updated_at` = '2024-03-01 04:00:00.000', `project_id` = 1, `name` = 'galad', `type` = 'dynamic', `state` = 'ready', `rule_id` = 1, `rule` = NULL, `version` = 4, `users_count` = 2, `tags` = 'users', `is_visible` = true, `deleted_at` = NULL)",
      "originalStack": "Error: select * from `lists` where `id` in ({\"id\":2,\"created_at\":\"2024-03-01T03:57:27.000Z\",\"updated_at\":\"2024-03-01T04:00:00.000Z\",\"project_id\":1,\"name\":\"galad\",\"type\":\"dynamic\",\"state\":\"ready\",\"rule_id\":1,\"rule\":null,\"version\":4,\"users_count\":2,\"tags\":[\"users\"],\"is_visible\":true,\"deleted_at\":null}) - Unknown column 'tags' in 'where clause'\n    at Packet.asError (/usr/src/app/node_modules/mysql2/lib/packets/packet.js:728:17)\n    at Query.execute (/usr/src/app/node_modules/mysql2/lib/commands/command.js:29:26)\n    at Connection.handlePacket (/usr/src/app/node_modules/mysql2/lib/connection.js:456:32)\n    at PacketParser.onPacket (/usr/src/app/node_modules/mysql2/lib/connection.js:85:12)\n    at PacketParser.executeStart (/usr/src/app/node_modules/mysql2/lib/packet_parser.js:75:16)\n    at Socket.<anonymous> (/usr/src/app/node_modules/mysql2/lib/connection.js:92:25)\n    at Socket.emit (node:events:517:28)\n    at Socket.emit (node:domain:489:12)\n    at addChunk (node:internal/streams/readable:368:12)\n    at readableAddChunk (node:internal/streams/readable:341:9)\n    at Readable.push (node:internal/streams/readable:278:10)\n    at TCP.onStreamRead (node:internal/stream_base_commons:190:23)"
    }

Add support for image uploads with a remote storage option

Users will need to be able to upload images for use in their templates.

Add additional third party integrations for storage options such as S3, Spaces and Minio

Images should auto-convert to various formats and sizes to best be displayed in templates

Local development setup

Hi,

Great work. I would love to contribute but it is very hard for me to set up the local development environment. If we look at the API, it is running on PORT env variable mentioned in /config/env.ts file and it is the same environment being used by the React App. I am assuming we are running npm start to boot the application using lerna.

What am I missing here? If I change the API to serve on a different port then i am having issues where you are setting up redirects after basic authentication.

What is your flow of running it locally? It will be a great help if you could guide me on it.

Once again, great work.

POST 400 (Bad Request)

Discussed in #362

Originally posted by lexciobotariu February 19, 2024
Hi there,

I've deployed the platform on render.com set the BASE_URL accordingly and set the CNAME in the container settings.
I've configured the SMTP with Google as I have a GSuit account.
I've tried with SSL, TLS and with App Password.

I've tried to send a proof email of the template I've created to test it out.
Unfortunately, I get a notification error An error occurred with this request. and in the console, I get another error saying the following: POST https://xxxx.xxxx.net/api/admin/projects/1/templates/1/proof 400 (Bad Request)

What am I missing?

Thank you!

Specs on data import missing

Can you please clarify the format expected for the Static list data import? Below is the example that fails with no helpful information provided in the error. It would be beneficial to have an example in UI. I am unclear, for example, how the custom metadata should look in CSV...?

MarketingEmails.csv

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.