Switchyard

Source wiring

How to point each real-world source at Switchyard. The parser auto-resolves by slug first, then by source kind — see LeadParserResolver for the routing rules.

ScopeForged contact form (or any brand site)

scopeforged-formwebhook

Point your contact form's submit handler at the bearer API. Standard fields (name, email, message, optional company, budget, timeline, service) parse without a field map. For non-matching field names, use kind generic-webhook with a field_mapping.

// In your Next.js route handler / Express handler:
await fetch('https://api.switchyard.philiprehberger.com/v1/leads', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer ' + process.env.SWITCHYARD_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    source_slug: 'scopeforged-form',
    payload: formData,
  }),
});

Upwork notification emails

upwork-emailemail

Forward Upwork notification emails to a mail-to-webhook service (Postmark inbound, SendGrid Parse, Cloudflare Email Workers). Configure the destination as the signed inbound endpoint.

The parser extracts the job title from the for: "..." quoted line, the description between Job description: and Skills:, and the budget from Budget: / Hourly: lines.

Expected payload shape from the mail processor:

{
  "subject": "[Upwork] You have a new invitation",
  "body": "...full email body...",
  "from": { "email": "noreply@upwork.com", "name": "Upwork" }
}

Fiverr message notifications

fiverr-emailemail

Same mail-to-webhook pipeline as Upwork. The parser extracts the buyer name from the subject ("You received a message from X" / "X sent you a message"), strips the Fiverr footer boilerplate, and finds dollar budgets + within N weeks / ASAP timelines.

Generic webhook / Tally / Typeform / Zapier

any-webhook-slugwebhook

For any source whose payload shape isn't already covered by a built-in parser, create a source with kind webhook and set a field_mapping:

{
  "contact": {
    "name": "fullName",
    "email": "emailAddress",
    "company": "org",
    "phone": "phoneNumber"
  },
  "job": {
    "title": "subject",
    "body": "message",
    "budget_text": "budget",
    "timeline_text": "deadline"
  }
}

Dotted paths are supported (e.g. payload.lead.email). Fields not in the mapping are silently dropped.

Manual paste-in (operator entry)

manual-pastemanual

Some inquiries arrive in places that can't webhook out — LinkedIn DMs, referral texts, hand-typed emails. The Filament admin includes a paste-in form (under Lead sources) where you pick a source and paste the raw text. The parser runs against the pasted body the same way it would against an inbound webhook.