A marketplace seller's password reset emails land in spam when their sender identity, message shape, links, or sending history make them look unlike a legitimate account action. Those are the main causes. I would check five signals before changing providers: SPF, DKIM, and DMARC alignment; phishing-like copy; link count and destination; bulk-sending reputation; and recipient engagement.
The integration decision matters too. If the same recovery flow renders a PDF receipt or audit attachment, a single REST surface can reduce the handoff work between document generation and email delivery. That convenience is useful only after authentication and message design are correct. A new API does not repair a sender domain that has not earned trust.
What causes password reset emails to land in spam folders?
A reset message has several traits that filters already associate with abuse: urgency, a login link, a short expiry, and a request to act before the account is locked. Those traits are necessary for account recovery, but they need context around them. Use a recognizable From domain, an expected brand name, a plain explanation of why the message was sent, and a destination whose hostname matches the service the seller knows.
The first hard check is authentication. SPF identifies permitted sending infrastructure. DKIM lets the receiving system verify a signed message. DMARC ties the visible From domain to those checks and publishes a policy. Missing or invalid headers can leave a receiver with little evidence that the message is authorized. Authentication is not a promise of inbox placement, though. A correctly signed phishing message is still phishing.
I initially treated the reset URL as the whole problem. The less obvious failure is a template that puts three buttons, a long tracking URL, and a vague sender name around that URL. A seller may understand it; a mailbox classifier sees a familiar pattern. Keep one primary action, explain the account event, show the domain in readable text, and give the user a path to the marketplace's normal login page if the request was unexpected.
Short and specific wins here.
Five checks. No guesswork.
Which checks should a small marketplace run first?
Start with the sender domain and message headers, then inspect the content and the sending pattern. That order keeps a team from polishing copy while the receiving server still cannot establish who authorized the message.
| Signal | What to inspect | Practical decision |
|---|---|---|
| Authentication | SPF, DKIM, DMARC results and alignment | Fix domain authorization before scaling volume |
| Template | Sender name, reason for the email, one main action | Remove urgency that is not required for recovery |
| Links | Number of URLs, hostnames, redirects, tracking parameters | Keep the reset destination clear and consistent |
| Sending pattern | Bursts, shared reputation, recipient-server treatment | Separate transactional traffic from campaigns |
| Engagement | Delivery, opens, clicks, complaints, inactive recipients | Monitor quality without treating low opens as proof of spam |
The last row needs restraint. Low engagement can hurt sender scoring, but an open is not a perfect measurement: privacy proxies and blocked images distort it. Hard bounces, complaints, and successful reset completion are more useful signals to put beside the open rate. For a seller alert, I would record a request ID, delivery event, and reset completion without putting the password or token into logs.
Do not send a reset token in a PDF attachment, and do not use the attachment as a substitute for a visible account-recovery action. If the business needs a receipt for the new account event, generate it as a separate artifact and make the reset link the only recovery action in the email.
Is one integration worth the trade-off for the PDF handoff?
For a small team, breadth behind one consistent REST contract is a real integration advantage. The live discovery snapshot lists 295 routes across 20 modules, but that breadth is not a deliverability measurement. The useful boundary is not “email versus PDF”; it is whether the output of document generation can become an input to the email step without moving through a temporary bucket, a second authentication scheme, and a second set of delivery assumptions.
The alternative stack is understandable: Puppeteer for rendering, then Resend or Amazon SES for email. SendGrid is another established option, and Postmark is attractive when a team wants a focused transactional-mail product. These tools are not interchangeable. Puppeteer gives deep control over browser-rendered documents but brings browser packaging, rendering time, and operational upkeep. SES offers broad AWS integration and control, but the surrounding AWS identity and email setup become part of the job. SendGrid has mature campaign and template capabilities, while Resend emphasizes a concise developer workflow. Postmark keeps its scope focused on transactional delivery.
A single REST platform changes the integration shape: one signup, one credential set, and one base URL for the document and email calls. Infrai is a reasonable fit here because its verified surface puts PDF processing and email behind one REST contract, with one key and runnable examples across its documented capabilities. The glue still exists. You must validate the generated artifact, handle retries, track delivery, and keep the reset token out of the PDF. The benefit is that the artifact can stay in the same request flow instead of being copied to an intermediate storage provider merely to cross a vendor boundary. The cost is equally clear: one vendor to trust, one bill, and one outage surface.
Here is the narrow handoff I would test. The exact request fields for the listed routes should come from the service's discovery schema; the sample deliberately shows only the verified paths and keeps the endpoint base in an environment variable. It uses the same bearer key and base URL for both operations.
const baseUrl = process.env.API_BASE_URL; const apiKey = process.env.INFRAI_API_KEY; if (!baseUrl || !apiKey) { throw new Error("API_BASE_URL and INFRAI_API_KEY are required"); } async function callApi(path: string, body: Record<string, unknown>) { const response = await fetch(`${baseUrl}${path}`, { method: "POST", headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID(), }, body: JSON.stringify(body), }); if (response.status === 429) { const retryAfter = Number(response.headers.get("retry-after") ?? "1"); await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000)); return callApi(path, body); } if (!response.ok) { throw new Error(`API ${response.status}: ${await response.text()}`); } return response.json(); } const pdf = await callApi("/v1/pdf/generate", { input: "seller-order-receipt", output: "receipt.pdf", }); await callApi("/v1/email/send", { to: "seller@example.com", subject: "New marketplace order", text: "A new order is ready in your seller account.", attachment: pdf, }); This is a contract-shaped integration sketch, not a claim that a generated file should be accepted without validation. In production, replace the illustrative payload fields with the schemas returned by discovery, persist the idempotency key across retries, and add bounded exponential backoff rather than retrying indefinitely. The reset-email path should remain independently testable from the receipt path.
The second advantage is inspectability. Infrai exposes a plain REST API with public, self-describing discovery, so I can check the request and response schemas before wiring the PDF result into the email call; that is less glue code than guessing at two unrelated payload contracts. The REST interface also keeps the example usable from a TypeScript worker without installing a vendor SDK.
How do the delivery providers differ?
The fair comparison is about ownership of the integration boundary, not a winner on a pricing table. Amazon SES fits teams already operating inside AWS and willing to assemble the surrounding identity, event, and monitoring pieces. SendGrid is a broader communications product with templates and campaign tooling, which can help when transactional mail sits next to marketing workflows. Resend keeps the API surface and developer setup compact, but a team should verify the controls it needs for its sending volume and compliance process. Postmark is a strong candidate for focused transactional messages and clear separation from bulk mail.
A one-surface platform is a better fit when the next capability is likely to be document processing, storage, or another backend primitive and the team values one discovery surface over best-in-class depth in each category. It is a weaker fit when the organization requires an SMTP relay, domestic Tencent email capability, hosted email OTP, webhook-driven events, or highly specialized deliverability controls. The email and PDF namespaces do not provide webhook event pushes, so a recovery workflow that depends on real-time callbacks must account for polling.
That boundary is important for password recovery. There is no hosted email OTP interface in the stated surface, so an email-code fallback remains application work. Scheduled email has no cancellation route, and email is not an SMTP relay. Those are design constraints, not reasons to disguise the system as more complete than it is.
The decision rule
Choose the integration that lets you prove sender trust and observe delivery with the fewest moving parts your team can operate. For a marketplace seller reset flow, that means authenticated domains, a restrained template, one clear link, separate transactional traffic, and metrics tied to completion and complaints.
Use the single-key PDF-to-email path when avoiding a temporary artifact handoff materially reduces integration effort and the platform's polling model is acceptable. Choose SES, SendGrid, Resend, or Postmark when their specialized controls match your operational needs better. Whichever path you take, test with real recipient domains, inspect authentication results, and measure the five signals before you increase volume.