Arawa Mail does not accept a send-at timestamp. Schedule trial expiry, dunning, and cart reminders in your application clock — Laravel Mail::later or a Next.js cron — then send immediately through POST /emails or MAIL_MAILER=sdp. The message appears in Sent on the day it actually leaves, not the day you queue it.
Founders often look for a “send this receipt on Friday” checkbox inside the email vendor. Arawa Mail is an HTTP send API plus a mailbox, not a campaign calendar. The documented send path is immediate. If you need delay, the delay lives next to the subscription or invoice record in your own stack.
What “scheduled transactional email” means here
Transactional email is mail the product owes a person: a trial ending, an unpaid invoice, an abandoned cart, an onboarding drip. Scheduling it is not the same as queuing a send that should leave now but off the HTTP request. That off-request path is covered in Queue Laravel Mailables with ShouldQueue.
This article owns intentional future send: “do not talk to Arawa Mail until Friday.”
Does Arawa Mail accept a send-at timestamp?
No. The documented Send Email body is from, to, subject, html/text, plus optional CC, BCC, reply-to, headers, and attachments. There is no scheduled_at or scheduledAt field. Some other providers document provider-side delay. That is competitor context only. Do not invent the field on Arawa Mail.
Before any send — delayed or immediate — the domain must be sending-active, and the API key needs the sending scope. Setup is in the Laravel quickstart and Next.js quickstart.
How we analyzed this
We checked the current Arawa Mail introduction, Laravel and Next.js quickstarts, Send Email API, mailbox Sent-folder behavior, and enable-sending rules against this draft. We treated Laravel Mail::later and platform crons as application features. We did not assume a hidden scheduler because Resend or an ESP campaign tool has one.
Laravel: delay with Mail::later, then the same HTTP transport
Install and configure once, as in Send email in Laravel:
composer require sharasolns/sdp-email
MAIL_MAILER=sdp
SDP_EMAIL_KEY=your_api_key
# optional
SDP_EMAIL_ENDPOINT=https://app.arawamail.com
SDP_EMAIL_TIMEOUT=10
Laravel delayed send is an application feature. After signup, delay a trial-expiry mailable 13 days:
use App\Mail\TrialExpiring;
use Illuminate\Support\Facades\Mail;
Mail::to($account->owner)
->later(now()->addDays(13), new TrialExpiring($account));
Queue delay limit: this 13-day example requires a backend that supports that delay and an asynchronous queue configuration. Amazon SQS caps an individual message delay at 15 minutes. For long delays on SQS, store a due date in your database and have Laravel’s scheduler enqueue the job when due. A delayed job runs no earlier than its due time; backlog can make it late.
The worker must be running (php artisan queue:work). When the delay expires, Laravel uses the same sdp HTTP transport as Mail::to(...)->send() or ->queue(). Worker retries, ShouldQueue, and afterCommit belong in the queue article — do not retell them here.
Use a custom delayed job when the send depends on a fresh database check (“still unpaid?”). Use Mail::later when the payload is already decided.
Where the message appears if it is queued for Friday
API-originated mail is written to Sent so administrators can see outbound activity. A reminder that fires in seven days appears in Sent on the day it actually sends — not the day the job is created. Support can read that activity without asking engineering; see Support should see the transactional email log.
Mailbox compose is rate limited per account. Application sends should use an API key with the sending scope, not a human mailbox session.
Next.js: cron first, then POST immediately
On Vercel and similar serverless hosts, long-lived SMTP sockets are a poor fit. HTTP from a cron or worker is the default. Arawa Mail does not trigger the cron. The host does.
A typical App Router pattern:
- A daily Vercel Cron hits a route handler.
- The handler selects invoices due for a reminder.
- For each due invoice, the handler sends once with
sdp-email-nextjs.
// vercel.json
{ "crons": [{ "path": "/api/cron/dunning", "schedule": "0 8 * * *" }] }
// app/api/cron/dunning/route.ts
// Application helper: implement the durable outbox described below.
import { enqueueDueReminderJobs } from '@/lib/reminder-outbox';
export async function GET(request: Request) {
const secret = process.env.CRON_SECRET;
if (!secret || request.headers.get('authorization') !== `Bearer ${secret}`) {
return new Response('Unauthorized', { status: 401 });
}
await enqueueDueReminderJobs();
return Response.json({ ok: true });
}Set a random CRON_SECRET in Vercel. Cron supplies it as a Bearer authorization header. The helper above is application code, not an Arawa Mail SDK function: insert due reminders into a durable outbox with a unique key such as invoice_id + reminder_kind + due_date. A worker claims each row atomically, rechecks eligibility, and calls the sending API. Vercel Cron schedules use UTC; the example is 08:00 UTC, or 11:00 in Kenya.
First-send setup lives in Send transactional email from Next.js. Prefer HTTP over SMTP on serverless; the trade-off is in SMTP vs Email API.
Do not double-send after a retry
A cron that times out and runs again, or a Laravel worker that retries, will happily POST twice unless you record the send. A prior read of alreadyReminded followed by send is not atomic. Use a unique outbox row and an atomic claim or lock, then store the provider message ID after success. A timeout after provider acceptance leaves an uncertain outcome: do not automatically retry it as if nothing happened. Reconcile the send through available logs or manual review. Unless the provider documents idempotent sends, an application lock alone cannot guarantee exactly-once delivery.
The full pattern is in Prevent duplicate transactional emails. Do not treat the email vendor as the source of truth for “did we already nag this invoice?”
MCP is not a scheduler
Connecting ChatGPT, Claude, or Grok to a mailbox via MCP is a mailbox assistant, not a cron. Do not ask an assistant to “remind me to email them Friday” as your dunning system. Humans still own the From address; assistants should not become silent job runners.
Architecture constraints that matter
- Arawa Mail sends when the app calls
POST /emailsor LaravelMAIL_MAILER=sdp. - The From domain must be sending-active. Receiving must be active before sending can be enabled.
- Sent-folder copies appear when the HTTP call succeeds, not when you enqueue a job.
- Do not hard-code send quotas; check live pricing.
FAQ
Should I use Mail::later or a custom delayed job?
Use Mail::later when the mailable is already correct. Use a delayed job when you must re-read the account or invoice before sending.
How do I schedule a reminder from Next.js on Vercel?
Use Vercel Cron (or another platform scheduler) to hit a server route. The route decides who is due, then calls sdp.emails.send immediately.
Can I schedule from mailbox compose?
No. Mailbox compose sends now and is rate limited per account. Application mail belongs on an API key.
Will support see a Friday reminder on Monday?
No. They will see it in Sent after Friday’s successful API call.
Sources and review
Documentation reviewed on 3 October 2026. Examples are illustrative and must be adapted to your application.