Customer Engagement Platform for Email, Push Notifications, & SMS
The world's leader for mobile push notifications, web push, SMS, email and in-app messaging. Trusted by 2 million+ businesses to send 12 billion+ messages per…
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Smart global campaigns, clean lists, guaranteed delivery.
Open http://127.0.0.1:3000. Log in, then invite a partner from Settings.
You do not need a custom domain. Connect Gmail and campaigns send as that Google address (about 500/day on a personal Gmail).
1. Open Google Cloud Console
2. Create a project → APIs & Services → enable Gmail API
3. OAuth consent screen: External, app name DeliverIQ, add your Gmail as a test user
4. Credentials → Create OAuth client ID → Web application
5. Authorized redirect URI (must match exactly):查看完整 README ↗Smart global campaigns, clean lists, guaranteed delivery.
docker compose up -d
npm install
npx prisma migrate deploy
npm run db:seed
npm run dev
npm run dev:worker
Open http://127.0.0.1:3000. Log in, then invite a partner from Settings.
You do not need a custom domain. Connect Gmail and campaigns send as that Google address (about 500/day on a personal Gmail).
http://127.0.0.1:3000/auth/google/callback
.env:GOOGLE_CLIENT_ID=....apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=....
GOOGLE_REDIRECT_URI=http://127.0.0.1:3000/auth/google/callback
If you later host for free (Render/Railway), add that URL as a second redirect URI, e.g. https://your-app.onrender.com/auth/google/callback. Still no custom domain.
Only needed if you later buy a domain and want higher volume. Until Gmail is connected or SendGrid is live, jobs are logged locally.
waitUntil), so sending keeps going after the tab is closed or minimized.users.next_send_at. Every send first claims that slot with one atomic UPDATE ... WHERE next_send_at IS NULL OR next_send_at <= now() and moves it forward by the gap plus random jitter (Settings, default 10 s + up to 5 s, minimum 5 s). Overlapping runs can never double send or break the gap.maxDuration 300 s in vercel.json, the Hobby maximum with Fluid compute, read at runtime with getDeadline()). If it sent something and work is left, it starts the next run by calling /cron/send-tick on itself. A lease row (scheduler_leases) keeps it to one run at a time..github/workflows/send-tick.yml (every 5 min), the daily Vercel Cron, and optionally an every minute external pinger such as cron-job.org calling GET https://deliveriq-eosin.vercel.app/cron/send-tick with header Authorization: Bearer <CRON_SECRET>.campaign_recipients.sent_at since midnight Africa/Nairobi for that sender. Over the cap, emails stay queued and continue after midnight (next cron or pinger call).CRON_SECRET (required for the cron endpoint and self chain), SEND_RUN_SECONDS (default 270), SEND_SELF_CHAIN=false to turn chaining off.npm test. Database tests run only with TEST_DATABASE_URL pointing at a throwaway database.