parcelvoy / platform Goto Github PK
View Code? Open in Web Editor NEWParcelvoy: Open source multi-channel marketing automation platform. Send data-driven emails, sms, push notifications and more!
Home Page: https://parcelvoy.com
License: Other
Parcelvoy: Open source multi-channel marketing automation platform. Send data-driven emails, sms, push notifications and more!
Home Page: https://parcelvoy.com
License: Other
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
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?
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...?
Currently ENV is pulled from a config file which is limiting for installs with multiple projects (such as having one for testing). Move env to be stored in a database table instead
Allow for the following main forms of authentication:
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 😂
Adds methods for manipulating dates inside of templates. Need at least the following:
now
which lets you access the current time and format itdateFormat
which takes a date, format and optional timezone so that you can format any date. It uses date-fns
format options which differ from MomentaddDate
takes a date, an amount and a unit and performs the math (such as add 1 day)subDate
the inverse of addDate basicallyCreate a scheduler that can handle checking for different things at given intervals
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?
Minimum support should be Android and iOS using local push notification libraries.
Further support could include:
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
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.
Two small amends to ask for:
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'
}
});
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
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?
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
Asking about both the SaaS and the OSS version.
Hello,
Can you add httpsms as a gateway for sending SMS messages?
Repo: https://github.com/NdoleStudio/httpsms
Docs: https://docs.httpsms.com/#send-an-sms
Setup a job that runs on every commit inside of a PR and runs the Jest test cases
Hello im having trouble installing the code...ive had my developer look at it as well. We are getting errors. Can you help me?
Create a structure to house lists
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.
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
Is there any configuration that's needed?
I also tried updating the BASE_URL to the ec2 URL. same status.
Create a script that runs over all URLs and wraps them in an Iterable wrapper that contains both the root URL and the user who is clicking on it
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!
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.
When a new user signs up to one of my products, I want to send an identify
call to Parcelvoy. Is it possible to add this new user to a certain journey, e.g. an "introduction" journey, automatically? If so, what do I need to do?
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
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)"
}
Hi,
Can someone please help me with the following issues?
When trying to make a dynamic list I get to see the following error:
After refreshing the dynamic list is added - however, when I try to open it I get to see Error [500]:
I've setup parcelvoy using docker compose (https://docs.parcelvoy.com/overview/quick-start)
Until now, I have been using ConvertKit. I would like to switch to Parcelvoy, but I am afraid of the amount of work to migrate all my email templates.
Is there any automation for that?
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
I mean, is a link click an event?
Hi,
Here is the basic Journey setup:
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:
There are errors in the logs either.
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"
}
}
Create endpoints just for a user lifecycle.
Lifecycle:
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.
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.
Therefore, the DELETE client/:id
endpoint is suggested to be implemented. P.S. Delete Job already exists.
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.
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.