DEV Community

Alex Kane
Alex Kane

Posted on

n8n for PharmaTech/Drug Supply Chain SaaS Vendors: 5 Automations for FDA DSCSA, DEA Part 1304, cGMP, USP <797> and VAERS Compliance

n8n for PharmaTech/Drug Supply Chain SaaS Vendors: 5 Automations for FDA DSCSA, DEA Part 1304, cGMP, USP <797> and VAERS Compliance

PharmaTech SaaS has three compliance clocks your cloud iPaaS vendor cannot cover.

The DSCSA suspicious-product clock (21 USC §360eee-3(h)) starts the moment your platform identifies a suspect product. You have 24 hours to quarantine, notify FDA, and alert every trading partner in the supply chain. No SLA from AWS, Azure, or a cloud iPaaS vendor covers this window — if your workflow tool is down during an FDA inquiry, the clock keeps running.

The DEA 21 CFR §1304 records problem is structural: controlled substance records stored in a cloud iPaaS provider means the DEA field office has subpoena authority over that vendor directly, outside your legal team's review. Your attorneys are not in the chain of custody for a DEA diversion investigation subpoena served to your automation vendor.

The USP <797> sterile compounding boundary means batch production records and environmental monitoring data must stay within the accreditation boundary. A cloud iPaaS provider is not on the authorized-access list for your ISO 5 clean room data — that is a State Board of Pharmacy finding, not a risk to manage.

This article shows five n8n workflows that handle the full PharmaTech compliance stack. All five run inside your perimeter. Import the JSON, point them at your database, and you have the compliance automation layer your SaaS customers expect.


The Regulatory Landscape: What PharmaTech SaaS Vendors Actually Need to Automate

Regulation Scope Fastest Clock Penalty Exposure
DSCSA 21 USC §360eee-3 Drug serialization traceability 24h suspicious-product quarantine + FDA notification Trading partner suspension + FDA warning letter
DEA 21 CFR Part 1304 Controlled substance records (2yr) 1 business day — DEA Form 106 theft/loss DEA license suspension + criminal referral
USP <797> Chapter Sterile compounding quality IMMEDIATE — contamination batch recall State Board of Pharmacy license suspension
FDA cGMP 21 CFR Parts 210-211 Drug manufacturing quality 15 business days — FDA 483 response Consent decree + plant shutdown
FDA VAERS 21 CFR §600.80 Vaccine adverse event reporting 15-day ICSR clock from receipt CBER enforcement action
FDA REMS Risk evaluation and mitigation Annual REMS program assessment Drug withdrawal + civil penalties

Workflow 1: PharmaTech SaaS Customer Onboarding Drip (7 Compliance Tiers)

PharmaTech SaaS buyers are not uniform. An enterprise pharma manufacturer running DSCSA + DEA + cGMP simultaneously needs a completely different Day 0 briefing than a compounding pharmacy focused exclusively on USP <797>. This workflow segments by 7 tiers and injects the right compliance clock and procurement argument into the first email.

7 customer tiers:

  • ENTERPRISE_PHARMA_MANUFACTURER — DSCSA + DEA + cGMP + VAERS all active; sharpest argument is DEA §1304 subpoena exposure
  • SPECIALTY_PHARMA_505b2 — 505(b)(2) NDA post-market surveillance obligations; VAERS 15-day clock is primary
  • COMPOUNDING_PHARMACY_797 — USP <797> sterile compounding; State Board of Pharmacy accreditation boundary argument
  • DRUG_SUPPLY_CHAIN_SAAS — DSCSA EPCIS traceability; FDA can subpoena EPCIS repository directly from cloud vendor
  • PHARMACY_BENEFIT_MANAGER — HIPAA + state PBM regulations; controlled substance data in cloud = pharmacy board exposure
  • DRUG_TESTING_LABORATORY_SAAS — DEA Schedule I-V testing lab; chain of custody records outside lab perimeter = DEA finding
  • PHARMATECH_STARTUP — compliance tooling; self-hosting as competitive differentiator for enterprise pharma buyers
{
  "name": "PharmaTech SaaS \u2014 Customer Onboarding Drip (7 Tiers)",
  "nodes": [
    {
      "id": "1",
      "name": "Webhook \u2014 New Customer",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        240,
        300
      ],
      "parameters": {
        "path": "pharmatech-onboard",
        "responseMode": "responseNode",
        "httpMethod": "POST"
      }
    },
    {
      "id": "2",
      "name": "Set Compliance Tier",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        460,
        300
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "tier",
              "value": "={{ $json.customer_tier }}"
            },
            {
              "name": "dscsa_covered",
              "value": "={{ $json.flags?.dscsa_covered_product ?? false }}"
            },
            {
              "name": "dea_schedule",
              "value": "={{ $json.flags?.dea_controlled_substance ?? false }}"
            },
            {
              "name": "usp797",
              "value": "={{ $json.flags?.usp_797_sterile_compounding ?? false }}"
            },
            {
              "name": "cgmp_required",
              "value": "={{ $json.flags?.fda_cgmp_required ?? false }}"
            },
            {
              "name": "vaers_reporter",
              "value": "={{ $json.flags?.fda_vaers_reporter ?? false }}"
            },
            {
              "name": "rems_required",
              "value": "={{ $json.flags?.fda_rems_required ?? false }}"
            }
          ]
        }
      }
    },
    {
      "id": "3",
      "name": "Route by Tier",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 1,
      "position": [
        680,
        300
      ],
      "parameters": {
        "dataType": "string",
        "value1": "={{ $json.tier }}",
        "rules": {
          "rules": [
            {
              "value2": "ENTERPRISE_PHARMA_MANUFACTURER",
              "output": 0
            },
            {
              "value2": "SPECIALTY_PHARMA_505b2",
              "output": 1
            },
            {
              "value2": "COMPOUNDING_PHARMACY_797",
              "output": 2
            },
            {
              "value2": "DRUG_SUPPLY_CHAIN_SAAS",
              "output": 3
            },
            {
              "value2": "PHARMACY_BENEFIT_MANAGER",
              "output": 4
            },
            {
              "value2": "DRUG_TESTING_LABORATORY_SAAS",
              "output": 5
            },
            {
              "value2": "PHARMATECH_STARTUP",
              "output": 6
            }
          ],
          "fallbackOutput": 6
        }
      }
    },
    {
      "id": "4",
      "name": "Enterprise Pharma Brief",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        900,
        80
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "subject",
              "value": "Your FDA DSCSA + DEA + cGMP compliance automation brief"
            },
            {
              "name": "key_clock",
              "value": "DSCSA \u00a7360eee-3(h): 24h suspicious-product quarantine + FDA notification \u2014 no SLA covers this window"
            },
            {
              "name": "fastest_risk",
              "value": "DEA 21 CFR \u00a71304 records in cloud = DEA subpoena authority over vendor directly, outside your legal review"
            },
            {
              "name": "workflow_priority",
              "value": "Health monitor \u2192 Incident pipeline \u2192 Deadline tracker"
            }
          ]
        }
      }
    },
    {
      "id": "5",
      "name": "Compounding Pharmacy Brief",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        900,
        220
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "subject",
              "value": "USP <797> sterile compounding compliance automation brief"
            },
            {
              "name": "key_clock",
              "value": "USP <797> contamination = IMMEDIATE batch recall + FDA notification \u2014 cloud outage = missed window"
            },
            {
              "name": "fastest_risk",
              "value": "Batch records outside clean room boundary = accreditation finding under USP <797>"
            },
            {
              "name": "workflow_priority",
              "value": "Incident pipeline \u2192 Environmental monitoring tracker \u2192 Health monitor"
            }
          ]
        }
      }
    },
    {
      "id": "6",
      "name": "Drug Supply Chain Brief",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        900,
        360
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "subject",
              "value": "FDA DSCSA EPCIS traceability compliance automation brief"
            },
            {
              "name": "key_clock",
              "value": "DSCSA \u00a7360eee-3: suspicious product quarantine + trading partner alert within 24h of identification"
            },
            {
              "name": "fastest_risk",
              "value": "EPCIS data in cloud iPaaS = FDA can subpoena vendor's EPCIS repository directly during investigation"
            },
            {
              "name": "workflow_priority",
              "value": "EPCIS health monitor \u2192 Incident pipeline \u2192 Serialization audit tracker"
            }
          ]
        }
      }
    },
    {
      "id": "7",
      "name": "Send Day 0 Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        1120,
        300
      ],
      "parameters": {
        "fromEmail": "compliance@yourcompany.com",
        "toEmail": "={{ $json.contact_email }}",
        "subject": "={{ $json.subject }}",
        "text": "Welcome to the platform.\n\nYour compliance profile: Tier={{ $json.tier }}\nDSCSA={{ $json.dscsa_covered }} | DEA={{ $json.dea_schedule }} | USP797={{ $json.usp797 }} | cGMP={{ $json.cgmp_required }}\n\nKey clock: {{ $json.key_clock }}\nPrimary risk: {{ $json.fastest_risk }}\n\nWorkflow recommendation: {{ $json.workflow_priority }}\n\nImport these n8n workflows today: https://stripeai.gumroad.com",
        "html": ""
      }
    },
    {
      "id": "8",
      "name": "Respond 200",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": [
        1340,
        300
      ],
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\"status\":\"ok\",\"tier\":\"{{ $json.tier }}\"}"
      }
    }
  ],
  "connections": {
    "Webhook \u2014 New Customer": {
      "main": [
        [
          {
            "node": "Set Compliance Tier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Compliance Tier": {
      "main": [
        [
          {
            "node": "Route by Tier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Tier": {
      "main": [
        [
          {
            "node": "Enterprise Pharma Brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Enterprise Pharma Brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Compounding Pharmacy Brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Drug Supply Chain Brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Drug Supply Chain Brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Drug Supply Chain Brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Drug Supply Chain Brief",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enterprise Pharma Brief": {
      "main": [
        [
          {
            "node": "Send Day 0 Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compounding Pharmacy Brief": {
      "main": [
        [
          {
            "node": "Send Day 0 Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Drug Supply Chain Brief": {
      "main": [
        [
          {
            "node": "Send Day 0 Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day 0 Email": {
      "main": [
        [
          {
            "node": "Respond 200",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 2: FDA DSCSA / cGMP / DEA Compliance Deadline Tracker (12 Types)

PharmaTech compliance has a dense calendar. This workflow runs every morning at 7AM, queries your deadlines table, and surfaces anything due within 30 days — prioritized by days remaining and annotated with the specific regulatory body and penalty exposure.

12 deadline types covered:

  • FDA_DSCSA_SERIALIZATION_AUDIT — §360eee EPCIS audit
  • DEA_BIENNIAL_CONTROLLED_SUBSTANCE_INVENTORY — §1304.11, every 2 years (Schedule II-V)
  • USP_797_MEDIA_FILL_TEST — monthly/semi-annual fill test
  • FDA_CGMP_ANNUAL_PRODUCT_REVIEW — §211.180(e) APR
  • FDA_CGMP_BATCH_RECORD_RETENTION — 3 years per §211.180
  • DEA_FORM_222_CONTROLLED_SUBSTANCE_PURCHASE — 2yr record retention §1305.13
  • FDA_NDA_PSUR_ANNUAL — annual safety update report
  • FDA_VAERS_SAFETY_SURVEILLANCE_QUARTERLY — quarterly AE review
  • FDA_REMS_PROGRAM_ANNUAL_ASSESSMENT — REMS program annual
  • USP_797_ENVIRONMENTAL_MONITORING — monthly environmental monitoring
  • SOC2_TYPE2_RENEWAL — annual audit
  • ANNUAL_PENTEST — security testing
{
  "name": "PharmaTech \u2014 DSCSA / cGMP / DEA Deadline Tracker",
  "nodes": [
    {
      "id": "1",
      "name": "Schedule \u2014 Daily 7AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        240,
        300
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 7 * * *"
            }
          ]
        }
      }
    },
    {
      "id": "2",
      "name": "Query Deadlines",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 1,
      "position": [
        460,
        300
      ],
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT customer_id, tier, deadline_type, due_date, status, EXTRACT(day FROM due_date - NOW()) AS days_remaining FROM pharmatech_compliance_deadlines WHERE status = 'OPEN' AND due_date <= NOW() + INTERVAL '30 days' ORDER BY due_date ASC"
      }
    },
    {
      "id": "3",
      "name": "Set Priority + Escalation",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        680,
        300
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "priority",
              "value": "={{ $json.days_remaining <= 3 ? 'CRITICAL' : $json.days_remaining <= 7 ? 'HIGH' : $json.days_remaining <= 14 ? 'MEDIUM' : 'LOW' }}"
            },
            {
              "name": "regulatory_body",
              "value": "={{ {'FDA_DSCSA_SERIALIZATION_AUDIT':'FDA Office of Criminal Investigations','DEA_BIENNIAL_CONTROLLED_SUBSTANCE_INVENTORY':'DEA Diversion Control Division','USP_797_MEDIA_FILL_TEST':'State Board of Pharmacy','FDA_CGMP_ANNUAL_PRODUCT_REVIEW':'FDA CDER/CBER','DEA_FORM_222_CONTROLLED_SUBSTANCE_PURCHASE':'DEA','FDA_NDA_PSUR_ANNUAL':'FDA CDER','FDA_VAERS_SAFETY_SURVEILLANCE_QUARTERLY':'FDA CBER','FDA_REMS_PROGRAM_ANNUAL_ASSESSMENT':'FDA CDER REMS Program','USP_797_ENVIRONMENTAL_MONITORING':'State Board of Pharmacy','FDA_CGMP_BATCH_RECORD_RETENTION':'FDA ORA','SOC2_TYPE2_RENEWAL':'Your auditor','ANNUAL_PENTEST':'Security team'}[$json.deadline_type] ?? 'Compliance team' }}"
            },
            {
              "name": "penalty_note",
              "value": "={{ {'FDA_DSCSA_SERIALIZATION_AUDIT':'\u00a7360eee-3 trading partner suspension + FDA warning letter','DEA_BIENNIAL_CONTROLLED_SUBSTANCE_INVENTORY':'21 CFR \u00a71304.11 DEA inspection trigger \u2014 Schedule II-V discrepancy = diversion investigation','USP_797_MEDIA_FILL_TEST':'State Board of Pharmacy compounding license suspension','FDA_CGMP_ANNUAL_PRODUCT_REVIEW':'21 CFR \u00a7211.180(e) warning letter + consent decree risk','FDA_VAERS_SAFETY_SURVEILLANCE_QUARTERLY':'21 CFR \u00a7600.80 \u2014 serious AE underreporting = CBER enforcement'}[$json.deadline_type] ?? 'See compliance calendar' }}"
            }
          ]
        }
      }
    },
    {
      "id": "4",
      "name": "Filter Critical + High",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 1,
      "position": [
        900,
        300
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.priority }}",
              "operation": "regex",
              "value2": "CRITICAL|HIGH"
            }
          ]
        }
      }
    },
    {
      "id": "5",
      "name": "Send Deadline Alert",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        1120,
        300
      ],
      "parameters": {
        "fromEmail": "compliance@yourcompany.com",
        "toEmail": "={{ $json.compliance_owner_email }}",
        "subject": "[{{ $json.priority }}] {{ $json.deadline_type }} due in {{ $json.days_remaining }} days \u2014 {{ $json.regulatory_body }}",
        "text": "Compliance deadline approaching.\n\nCustomer: {{ $json.customer_id }} ({{ $json.tier }})\nDeadline type: {{ $json.deadline_type }}\nDue: {{ $json.due_date }}\nDays remaining: {{ $json.days_remaining }}\nRegulatory body: {{ $json.regulatory_body }}\n\nPenalty exposure: {{ $json.penalty_note }}\n\nAction required immediately."
      }
    }
  ],
  "connections": {
    "Schedule \u2014 Daily 7AM": {
      "main": [
        [
          {
            "node": "Query Deadlines",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Query Deadlines": {
      "main": [
        [
          {
            "node": "Set Priority + Escalation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Priority + Escalation": {
      "main": [
        [
          {
            "node": "Filter Critical + High",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Critical + High": {
      "main": [
        [
          {
            "node": "Send Deadline Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 3: FDA Record Access & EPCIS Health Monitor (Every 15 Minutes)

This workflow runs every 15 minutes and checks 5 critical endpoints. Each endpoint carries a regulatory annotation — not just a health status. When an alert fires, your on-call team sees the FDA/DEA enforcement context, not just 'API returned 500.'

5 monitored endpoints with regulatory annotations:

  • dscsa_epcis_api — DSCSA §360eee-3(h): 24h suspicious-product clock — outage during FDA inquiry = enforcement action
  • controlled_substance_records_api — DEA §1304: subpoena authority over cloud vendor directly, outside legal review perimeter
  • usp797_sterile_compounding_api — USP <797>: batch records outside clean room boundary = State Board of Pharmacy finding
  • batch_production_records_api — cGMP §211.180(e): batch records must survive FDA inspection during outage
  • vaers_reporting_api — 21 CFR §600.80: serious AE 15-day ICSR clock — VAERS API down during window = CBER enforcement

The $getWorkflowStaticData('global') cooldown prevents alert storms — one alert per 30-minute window, regardless of how many endpoints are degraded.

{
  "name": "PharmaTech \u2014 FDA Record Access & EPCIS Health Monitor (15min)",
  "nodes": [
    {
      "id": "1",
      "name": "Schedule \u2014 Every 15min",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        240,
        300
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      }
    },
    {
      "id": "2",
      "name": "Check DSCSA EPCIS API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        460,
        160
      ],
      "parameters": {
        "url": "https://api.yourplatform.com/health/dscsa-epcis",
        "method": "GET",
        "responseFormat": "json",
        "timeout": 8000
      }
    },
    {
      "id": "3",
      "name": "Check DEA Records API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        460,
        260
      ],
      "parameters": {
        "url": "https://api.yourplatform.com/health/dea-records",
        "method": "GET",
        "responseFormat": "json",
        "timeout": 8000
      }
    },
    {
      "id": "4",
      "name": "Check USP 797 Compounding API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        460,
        360
      ],
      "parameters": {
        "url": "https://api.yourplatform.com/health/usp797-sterile",
        "method": "GET",
        "responseFormat": "json",
        "timeout": 8000
      }
    },
    {
      "id": "5",
      "name": "Check cGMP Batch Records API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        460,
        460
      ],
      "parameters": {
        "url": "https://api.yourplatform.com/health/cgmp-batch-records",
        "method": "GET",
        "responseFormat": "json",
        "timeout": 8000
      }
    },
    {
      "id": "6",
      "name": "Check VAERS Reporting API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        460,
        560
      ],
      "parameters": {
        "url": "https://api.yourplatform.com/health/vaers-reporting",
        "method": "GET",
        "responseFormat": "json",
        "timeout": 8000
      }
    },
    {
      "id": "7",
      "name": "Merge Health Results",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 1,
      "position": [
        680,
        360
      ],
      "parameters": {
        "mode": "mergeByPosition"
      }
    },
    {
      "id": "8",
      "name": "Annotate Regulatory Risk",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        900,
        360
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "dscsa_risk",
              "value": "DSCSA \u00a7360eee-3(h): 24h suspicious-product clock \u2014 outage during FDA inquiry = enforcement action"
            },
            {
              "name": "dea_risk",
              "value": "21 CFR \u00a71304: DEA subpoena authority over cloud vendor directly \u2014 records outside legal review perimeter"
            },
            {
              "name": "usp797_risk",
              "value": "USP <797>: sterile batch records outside clean room boundary = State Board of Pharmacy finding"
            },
            {
              "name": "cgmp_risk",
              "value": "21 CFR \u00a7211.180(e): batch production records must survive FDA inspection \u2014 cloud outage = cGMP deviation"
            },
            {
              "name": "vaers_risk",
              "value": "21 CFR \u00a7600.80: serious AE 15-day ICSR clock \u2014 VAERS API down during reporting window = CBER enforcement"
            },
            {
              "name": "alert_threshold_ms",
              "value": "5000"
            },
            {
              "name": "cooldown_key",
              "value": "pharmatech_health_alert"
            },
            {
              "name": "cooldown_minutes",
              "value": "30"
            }
          ]
        }
      }
    },
    {
      "id": "9",
      "name": "Check Cooldown",
      "type": "n8n-nodes-base.code",
      "typeVersion": 1,
      "position": [
        1120,
        360
      ],
      "parameters": {
        "jsCode": "const cooldownKey = $json.cooldown_key;\nconst cooldownMs = $json.cooldown_minutes * 60 * 1000;\nconst staticData = $getWorkflowStaticData('global');\nconst lastAlert = staticData[cooldownKey] || 0;\nconst now = Date.now();\nif (now - lastAlert < cooldownMs) {\n  return []; // suppress\n}\nstaticData[cooldownKey] = now;\nreturn [$input.item];"
      }
    },
    {
      "id": "10",
      "name": "Send Health Alert",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        1340,
        360
      ],
      "parameters": {
        "fromEmail": "monitoring@yourcompany.com",
        "toEmail": "oncall@yourcompany.com",
        "subject": "[PHARMATECH HEALTH ALERT] API endpoint degraded \u2014 regulatory clock exposure",
        "text": "PharmaTech health monitor detected degradation.\n\nDSCSA EPCIS: {{ $json.dscsa_status }} \u2014 {{ $json.dscsa_risk }}\nDEA Records: {{ $json.dea_status }} \u2014 {{ $json.dea_risk }}\nUSP <797>: {{ $json.usp797_status }} \u2014 {{ $json.usp797_risk }}\ncGMP Batch Records: {{ $json.cgmp_status }} \u2014 {{ $json.cgmp_risk }}\nVAERS: {{ $json.vaers_status }} \u2014 {{ $json.vaers_risk }}\n\nResolve immediately. FDA/DEA inspection during outage = enforcement window open."
      }
    }
  ],
  "connections": {
    "Schedule \u2014 Every 15min": {
      "main": [
        [
          {
            "node": "Check DSCSA EPCIS API",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check DEA Records API",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check USP 797 Compounding API",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check cGMP Batch Records API",
            "type": "main",
            "index": 0
          },
          {
            "node": "Check VAERS Reporting API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check DSCSA EPCIS API": {
      "main": [
        [
          {
            "node": "Merge Health Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check DEA Records API": {
      "main": [
        [
          {
            "node": "Merge Health Results",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check USP 797 Compounding API": {
      "main": [
        [
          {
            "node": "Merge Health Results",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Check cGMP Batch Records API": {
      "main": [
        [
          {
            "node": "Merge Health Results",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Check VAERS Reporting API": {
      "main": [
        [
          {
            "node": "Merge Health Results",
            "type": "main",
            "index": 4
          }
        ]
      ]
    },
    "Merge Health Results": {
      "main": [
        [
          {
            "node": "Annotate Regulatory Risk",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Annotate Regulatory Risk": {
      "main": [
        [
          {
            "node": "Check Cooldown",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Cooldown": {
      "main": [
        [
          {
            "node": "Send Health Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 4: Drug Supply Chain Incident Response Pipeline (8 Incident Types)

When an incident fires, the clock starts immediately. This workflow routes 8 incident types to their correct priority, SLA, regulation, and escalation path — and logs every incident to Postgres for the audit trail FDA and DEA expect.

8 incident types with fastest clocks:

Type Priority SLA Regulation
FDA_DSCSA_SUSPICIOUS_PRODUCT P0 24h 21 USC §360eee-3(h)
DEA_DIVERSION_THEFT_LOSS P0 1 business day 21 CFR §1301.76 DEA Form 106
USP_797_CONTAMINATION P0 IMMEDIATE USP <797> Chapter
FDA_RECALL_CLASS_I P0 IMMEDIATE 21 CFR §7-3.1
FDA_CGMP_483_OBSERVATION P1 15 business days 21 CFR Parts 210-211
FDA_VAERS_SERIOUS_AE P1 15 days 21 CFR §600.80
DEA_CONTROLLED_SUBSTANCE_INVENTORY_DISCREPANCY P1 48h 21 CFR §1304.11
GENERAL P2 72h Internal SLA
{
  "name": "PharmaTech \u2014 Drug Supply Chain Incident Response Pipeline",
  "nodes": [
    {
      "id": "1",
      "name": "Webhook \u2014 Incident Intake",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        240,
        300
      ],
      "parameters": {
        "path": "pharmatech-incident",
        "responseMode": "responseNode",
        "httpMethod": "POST"
      }
    },
    {
      "id": "2",
      "name": "Route by Incident Type",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 1,
      "position": [
        460,
        300
      ],
      "parameters": {
        "dataType": "string",
        "value1": "={{ $json.incident_type }}",
        "rules": {
          "rules": [
            {
              "value2": "FDA_DSCSA_SUSPICIOUS_PRODUCT",
              "output": 0
            },
            {
              "value2": "DEA_DIVERSION_THEFT_LOSS",
              "output": 1
            },
            {
              "value2": "USP_797_CONTAMINATION",
              "output": 2
            },
            {
              "value2": "FDA_RECALL_CLASS_I",
              "output": 3
            },
            {
              "value2": "FDA_CGMP_483_OBSERVATION",
              "output": 4
            },
            {
              "value2": "FDA_VAERS_SERIOUS_AE",
              "output": 5
            },
            {
              "value2": "DEA_CONTROLLED_SUBSTANCE_INVENTORY_DISCREPANCY",
              "output": 6
            },
            {
              "value2": "GENERAL",
              "output": 7
            }
          ],
          "fallbackOutput": 7
        }
      }
    },
    {
      "id": "3",
      "name": "DSCSA Suspicious Product \u2014 P0 24h",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        680,
        60
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "priority",
              "value": "P0"
            },
            {
              "name": "sla_hours",
              "value": "24"
            },
            {
              "name": "regulation",
              "value": "21 USC \u00a7360eee-3(h) DSCSA"
            },
            {
              "name": "action",
              "value": "Quarantine product immediately. Notify FDA + all trading partners in supply chain within 24h of identification. Do NOT ship suspect product."
            },
            {
              "name": "escalation",
              "value": "VP Regulatory Affairs + Legal + FDA MedWatch + DSCSA trading partners"
            }
          ]
        }
      }
    },
    {
      "id": "4",
      "name": "DEA Diversion Theft Loss \u2014 P0 1BD",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        680,
        160
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "priority",
              "value": "P0"
            },
            {
              "name": "sla_hours",
              "value": "8"
            },
            {
              "name": "regulation",
              "value": "21 CFR \u00a71301.76 DEA Form 106"
            },
            {
              "name": "action",
              "value": "File DEA Form 106 (Theft or Significant Loss) with DEA field office within 1 business day. Conduct immediate inventory count."
            },
            {
              "name": "escalation",
              "value": "DEA Compliance Officer + Legal + DEA Diversion Control Division field office"
            }
          ]
        }
      }
    },
    {
      "id": "5",
      "name": "USP 797 Contamination \u2014 P0 IMMEDIATE",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        680,
        260
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "priority",
              "value": "P0"
            },
            {
              "name": "sla_hours",
              "value": "1"
            },
            {
              "name": "regulation",
              "value": "USP <797> Chapter \u2014 sterile compounding contamination"
            },
            {
              "name": "action",
              "value": "IMMEDIATE batch recall. Halt all compounding in affected ISO 5 zone. Notify State Board of Pharmacy. FDA MedWatch report within 3 days if patient harm."
            },
            {
              "name": "escalation",
              "value": "Director of Pharmacy + State Board of Pharmacy + FDA MedWatch"
            }
          ]
        }
      }
    },
    {
      "id": "6",
      "name": "FDA Recall Class I \u2014 P0 IMMEDIATE",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        680,
        360
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "priority",
              "value": "P0"
            },
            {
              "name": "sla_hours",
              "value": "2"
            },
            {
              "name": "regulation",
              "value": "21 CFR \u00a77-3.1 Class I Recall"
            },
            {
              "name": "action",
              "value": "Halt distribution. Issue recall notification to all affected accounts. FDA MedWatch. Prepare press release per FDA guidance."
            },
            {
              "name": "escalation",
              "value": "CEO + VP Regulatory + Legal + FDA District Office + PR"
            }
          ]
        }
      }
    },
    {
      "id": "7",
      "name": "FDA 483 Observation \u2014 P1 15BD",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        680,
        460
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "priority",
              "value": "P1"
            },
            {
              "name": "sla_hours",
              "value": "360"
            },
            {
              "name": "regulation",
              "value": "21 CFR Part 210-211 cGMP \u2014 FDA Form 483"
            },
            {
              "name": "action",
              "value": "Prepare written response to FDA 483 within 15 business days. Assign CAPA for each observation. Track in quality management system."
            },
            {
              "name": "escalation",
              "value": "VP Quality + Regulatory Affairs + Legal"
            }
          ]
        }
      }
    },
    {
      "id": "8",
      "name": "FDA VAERS Serious AE \u2014 P1 15days",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        680,
        560
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "priority",
              "value": "P1"
            },
            {
              "name": "sla_hours",
              "value": "360"
            },
            {
              "name": "regulation",
              "value": "21 CFR \u00a7600.80 \u2014 15-day ICSR clock"
            },
            {
              "name": "action",
              "value": "Evaluate seriousness and expectedness. File MedWatch 3500A/VAERS within 15 calendar days if serious + unexpected. Start clock from date information received."
            },
            {
              "name": "escalation",
              "value": "Pharmacovigilance Lead + Medical Affairs + Regulatory Affairs + FDA CBER/CDER"
            }
          ]
        }
      }
    },
    {
      "id": "9",
      "name": "Set Incident Timestamp + ID",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        900,
        300
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "incident_id",
              "value": "={{ 'INC-' + $now.toISO().replace(/[:.]/g,'') }}"
            },
            {
              "name": "opened_at",
              "value": "={{ $now.toISO() }}"
            },
            {
              "name": "sla_deadline",
              "value": "={{ $now.plus({hours: parseInt($json.sla_hours)}).toISO() }}"
            }
          ]
        }
      }
    },
    {
      "id": "10",
      "name": "Log to Postgres",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 1,
      "position": [
        1120,
        220
      ],
      "parameters": {
        "operation": "insert",
        "table": "pharmatech_incidents",
        "columns": "incident_id,incident_type,priority,sla_hours,sla_deadline,regulation,customer_id,opened_at,status",
        "values": "={{ $json.incident_id }},={{ $json.incident_type }},={{ $json.priority }},={{ $json.sla_hours }},={{ $json.sla_deadline }},={{ $json.regulation }},={{ $json.customer_id }},={{ $json.opened_at }},'OPEN'"
      }
    },
    {
      "id": "11",
      "name": "Send Escalation Alert",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        1120,
        380
      ],
      "parameters": {
        "fromEmail": "incidents@yourcompany.com",
        "toEmail": "={{ $json.escalation }}",
        "subject": "[{{ $json.priority }}] {{ $json.incident_type }} \u2014 SLA: {{ $json.sla_hours }}h \u2014 {{ $json.regulation }}",
        "text": "PHARMATECH INCIDENT OPENED\n\nID: {{ $json.incident_id }}\nType: {{ $json.incident_type }}\nPriority: {{ $json.priority }}\nSLA deadline: {{ $json.sla_deadline }}\nRegulation: {{ $json.regulation }}\n\nRequired action: {{ $json.action }}\n\nEscalation: {{ $json.escalation }}\n\nCustomer: {{ $json.customer_id }}"
      }
    },
    {
      "id": "12",
      "name": "Respond 201",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": [
        1340,
        300
      ],
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\"incident_id\":\"{{ $json.incident_id }}\",\"priority\":\"{{ $json.priority }}\",\"sla_deadline\":\"{{ $json.sla_deadline }}\"}",
        "responseCode": 201
      }
    }
  ],
  "connections": {
    "Webhook \u2014 Incident Intake": {
      "main": [
        [
          {
            "node": "Route by Incident Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Incident Type": {
      "main": [
        [
          {
            "node": "DSCSA Suspicious Product \u2014 P0 24h",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "DEA Diversion Theft Loss \u2014 P0 1BD",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "USP 797 Contamination \u2014 P0 IMMEDIATE",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "FDA Recall Class I \u2014 P0 IMMEDIATE",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "FDA 483 Observation \u2014 P1 15BD",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "FDA VAERS Serious AE \u2014 P1 15days",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DSCSA Suspicious Product \u2014 P0 24h": {
      "main": [
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DEA Diversion Theft Loss \u2014 P0 1BD": {
      "main": [
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "USP 797 Contamination \u2014 P0 IMMEDIATE": {
      "main": [
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FDA Recall Class I \u2014 P0 IMMEDIATE": {
      "main": [
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FDA 483 Observation \u2014 P1 15BD": {
      "main": [
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FDA VAERS Serious AE \u2014 P1 15days": {
      "main": [
        [
          {
            "node": "Set Incident Timestamp + ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Incident Timestamp + ID": {
      "main": [
        [
          {
            "node": "Log to Postgres",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send Escalation Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Postgres": {
      "main": [
        [
          {
            "node": "Respond 201",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Workflow 5: Weekly PharmaTech KPI Dashboard (Monday 8AM)

Every Monday at 8AM, this workflow aggregates MRR, account counts, and compliance coverage metrics across all 7 tiers and emails a report to the CEO with CCO on BCC. The report includes the self-hosting procurement argument for this week's highest-value segment.

{
  "name": "PharmaTech \u2014 Weekly KPI Dashboard (Monday 8AM)",
  "nodes": [
    {
      "id": "1",
      "name": "Schedule \u2014 Monday 8AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        240,
        300
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * 1"
            }
          ]
        }
      }
    },
    {
      "id": "2",
      "name": "Query Pharma KPIs",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 1,
      "position": [
        460,
        300
      ],
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT tier, COUNT(*) AS accounts, SUM(mrr_usd) AS mrr, SUM(CASE WHEN flags->>'dscsa_covered_product'='true' THEN 1 ELSE 0 END) AS dscsa_accounts, SUM(CASE WHEN flags->>'dea_controlled_substance'='true' THEN 1 ELSE 0 END) AS dea_accounts, SUM(CASE WHEN flags->>'usp_797_sterile_compounding'='true' THEN 1 ELSE 0 END) AS usp797_accounts, SUM(CASE WHEN flags->>'fda_cgmp_required'='true' THEN 1 ELSE 0 END) AS cgmp_accounts FROM pharmatech_customers WHERE status='ACTIVE' GROUP BY tier ORDER BY mrr DESC"
      }
    },
    {
      "id": "3",
      "name": "Query Open Incidents",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 1,
      "position": [
        460,
        420
      ],
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT priority, COUNT(*) AS open_count FROM pharmatech_incidents WHERE status='OPEN' GROUP BY priority ORDER BY priority"
      }
    },
    {
      "id": "4",
      "name": "Query Upcoming Deadlines",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 1,
      "position": [
        460,
        540
      ],
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT deadline_type, COUNT(*) AS due_count FROM pharmatech_compliance_deadlines WHERE status='OPEN' AND due_date <= NOW() + INTERVAL '30 days' GROUP BY deadline_type ORDER BY due_count DESC LIMIT 5"
      }
    },
    {
      "id": "5",
      "name": "Build KPI Report",
      "type": "n8n-nodes-base.code",
      "typeVersion": 1,
      "position": [
        700,
        420
      ],
      "parameters": {
        "jsCode": "const kpis = $input.all();\nconst totalMrr = kpis.reduce((s,i) => s + (parseFloat(i.json.mrr) || 0), 0);\nconst totalAccounts = kpis.reduce((s,i) => s + (parseInt(i.json.accounts) || 0), 0);\nconst dscsaTotal = kpis.reduce((s,i) => s + (parseInt(i.json.dscsa_accounts) || 0), 0);\nconst deaTotal = kpis.reduce((s,i) => s + (parseInt(i.json.dea_accounts) || 0), 0);\nconst usp797Total = kpis.reduce((s,i) => s + (parseInt(i.json.usp797_accounts) || 0), 0);\nconst cgmpTotal = kpis.reduce((s,i) => s + (parseInt(i.json.cgmp_accounts) || 0), 0);\nreturn [{json:{total_mrr: totalMrr, total_accounts: totalAccounts, dscsa_accounts: dscsaTotal, dea_accounts: deaTotal, usp797_accounts: usp797Total, cgmp_accounts: cgmpTotal, report_week: new Date().toISOString().split('T')[0]}}];"
      }
    },
    {
      "id": "6",
      "name": "Send CEO KPI Email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        940,
        420
      ],
      "parameters": {
        "fromEmail": "reporting@yourcompany.com",
        "toEmail": "ceo@yourcompany.com",
        "ccEmail": "cco@yourcompany.com",
        "subject": "[PharmaTech KPI] Week of {{ $json.report_week }} \u2014 ${{ $json.total_mrr }} MRR | {{ $json.total_accounts }} accounts",
        "text": "WEEKLY PHARMATECH SAAS KPI REPORT\nWeek: {{ $json.report_week }}\n\nMRR: ${{ $json.total_mrr }}\nTotal active accounts: {{ $json.total_accounts }}\n\nCOMPLIANCE COVERAGE:\nDSCSA-covered accounts: {{ $json.dscsa_accounts }} (\u00a7360eee-3 24h clock active)\nDEA Schedule accounts: {{ $json.dea_accounts }} (\u00a71304 subpoena exposure)\nUSP <797> compounding: {{ $json.usp797_accounts }} (sterile batch boundary)\ncGMP-required accounts: {{ $json.cgmp_accounts }} (\u00a7211.180(e) inspection risk)\n\nSelf-hosting procurement argument this week:\nDEA 21 CFR \u00a71304: controlled substance records in cloud iPaaS = DEA field office subpoenas vendor directly during diversion investigation \u2014 outside legal team review window. n8n self-hosted = records stay in your DEA-registered premises perimeter.\n\nBCC: Chief Compliance Officer"
      }
    }
  ],
  "connections": {
    "Schedule \u2014 Monday 8AM": {
      "main": [
        [
          {
            "node": "Query Pharma KPIs",
            "type": "main",
            "index": 0
          },
          {
            "node": "Query Open Incidents",
            "type": "main",
            "index": 0
          },
          {
            "node": "Query Upcoming Deadlines",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Query Pharma KPIs": {
      "main": [
        [
          {
            "node": "Build KPI Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Query Open Incidents": {
      "main": [
        [
          {
            "node": "Build KPI Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Query Upcoming Deadlines": {
      "main": [
        [
          {
            "node": "Build KPI Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build KPI Report": {
      "main": [
        [
          {
            "node": "Send CEO KPI Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

The Self-Hosting Argument That Closes PharmaTech Deals

For PharmaTech SaaS buyers, the self-hosting argument is not about security — it is about regulatory exposure that no configuration change can fix.

DEA 21 CFR §1304 controlled substance records: When your automation platform stores DEA-regulated records in a cloud iPaaS provider, the DEA field office has statutory subpoena authority over that vendor directly. Your legal team is not in the notification chain for a DEA diversion investigation subpoena served to AWS or a cloud automation vendor. Self-hosted n8n means records stay within your DEA-registered premises perimeter.

DSCSA §360eee-3 suspicious product clock: The 24-hour window starts when your platform identifies the suspect product — not when your cloud vendor restores service. An outage during an active FDA inquiry is an enforcement action waiting to happen. On-premises n8n survives your cloud provider's SLA.

USP <797> sterile compounding boundary: Batch records and environmental monitoring data routed through a cloud iPaaS workflow tool cross the accreditation boundary. State Boards of Pharmacy and USP accrediting bodies enforce this as a finding, not a theoretical risk. The only fix is keeping the data within your validated system boundary.

cGMP §211.180(e) annual product review: FDA inspectors expect batch production records to be available on demand. A cloud iPaaS workflow tool that routes APR data outside your validated system is a potential cGMP deviation — documented in the next FDA Form 483.


Get All 5 Workflows

These five workflows are part of the FlowKit n8n compliance automation library.

Download all 5 PharmaTech workflows + 14 more automation templates →

Individual templates: $12–$29 | Full library bundle: $97


Part of the FlowKit compliance automation series. Previous verticals: AgriTech/FoodTech (FSMA §117/§204/NOP), BioSecurity/AgBio (42 CFR §73/USDA APHIS), GovTech (FedRAMP/FISMA/CJIS).

Top comments (0)