Linje

Inbound email for Amazon SES

Keep SES for sending. Add application-aware replies.

Put a Linje-generated address in Reply-To. When the recipient replies, Linje returns the message, attachments, and original application context as a signed, replayable webhook event.

A separate inbound boundary

Do not assemble the inbound half of SES unless you want to own it.

Amazon SES can receive email. Its native model uses receipt rules and can pass messages through services such as S3, SNS, and Lambda. Your application then owns the remaining parsing, correlation, delivery, and operational lifecycle.

Build on SES receiving Add Linje inbound What stays yours
Configure receipt rules and AWS resources Use a hosted inbound address Your SES outbound setup
Store or transport raw MIME Receive normalized content and attachment references Your application workflow
Persist token-to-object mappings Create an opaque route with immutable metadata Your object and authorization model
Build callback signing, retry, replay, and inspection Receive a signed, retryable, replayable event Your idempotent event handler

Read Amazon's SES receiving model.

Application context

Create a reply route for one real object.

curl -fsS \
  -H "Authorization: Bearer $LINJE_PROJECT_TOKEN" \
  -H "Idempotency-Key: 018f47d2-89ab-4cde-8123-456789abcdef" \
  -H "content-type: application/json" \
  -d '{
    "inbox-id":"claims",
    "metadata":{
      "claim_id":"claim_123",
      "customer_id":"cus_17"
    }
  }' \
  https://api.linje.systems/v1/reply-routes
{
  "reply-route": {
    "id":"route_...",
    "address":"r+012345...@in.linje.systems",
    "metadata":{
      "claim_id":"claim_123",
      "customer_id":"cus_17"
    }
  }
}

No outbound migration

Keep the SES send path unchanged.

From: claims@example.com
To: customer@example.com
Reply-To: r+012345...@in.linje.systems
Subject: Claim claim_123

Continue using your SES identities, templates, reputation, bounce handling, and sending code. The only change to this flow is the generated Reply-To value.

Reply to application event

Receive the reply with the route context attached.

POST https://app.example.com/linje/inbound
x-linje-inbound-id: ...
x-linje-delivery-id: ...
x-linje-timestamp: ...
x-linje-signature: sha256=...

{
  "schema":"linje.inbound-email.v1",
  "route": {
    "id":"route_...",
    "metadata":{
      "claim_id":"claim_123",
      "customer_id":"cus_17"
    }
  },
  "content":{"text":"The requested photo is attached."},
  "attachments":[
    {"filename":"photo.pdf","download":{"url":"https://api.linje.systems/..."}}
  ]
}

The complete product

Linje can also send the outbound email.

The SES sidecar is one adoption path. Linje remains bidirectional application email infrastructure: transactional email out, inbound email and replies back into your application. Move neither, either, or both directions based on the boundary you need.

See Linje's transactional email API.

Self-service quickstart

Add replies to one real SES email flow.

Choose one order, claim, case, or document request. Keep the existing SES send, add the generated Reply-To, and verify that a real reply reaches the correct object.

Add replies to one real SES email flow Read the API docs