1. Objective
Build three connected workflows on one shared architecture:
- Internal purchase request approval
- Equipment request routing
- Policy acknowledgment tracking
The architecture should remain platform-agnostic and work across HRIS, CRM, ERP, procurement tools, ITSM, email, Slack, or Teams. The implementation should rely on standardized request objects, states, and routing logic rather than platform-specific features.
The central principle:
Request → Validate → Resolve Ownership → Route → Approve / Fulfill → Verify → Audit
Every workflow in this blueprint follows that sequence. The platform changes; the sequence does not.
2. Shared data model
Every workflow should operate against a standardized internal request object. This is what keeps the three workflows compatible with one another - the same record can move from a purchase approval into an equipment fulfillment or trigger a policy acknowledgment without re-mapping fields.
| Field | Purpose |
|---|---|
request_id | Stable request identifier |
request_type | PURCHASE, EQUIPMENT, POLICY |
requester_id | Employee reference |
requester_name | Display name |
requester_email | Contact email |
requester_department | Owning department |
manager_id | Direct manager reference |
manager_email | Direct manager contact |
approver_id | Current or final approver |
approver_email | Approver contact |
amount | Monetary value where applicable |
currency | Currency of the amount |
budget_code | Budget classification |
cost_center | Cost center reference |
request_reason | Business justification |
requested_item | Item, service, or policy reference |
quantity | Requested quantity |
priority | LOW / NORMAL / HIGH / URGENT |
created_at | Creation timestamp |
expires_at | Approval window deadline |
approval_status | Approval lifecycle state |
fulfillment_status | Fulfillment lifecycle state |
acknowledgment_required | Whether acknowledgment applies |
acknowledgment_deadline | Acknowledgment due date |
acknowledged_at | Acknowledgment timestamp |
last_reminder_at | Most recent reminder sent |
reminder_count | Number of reminders sent |
workflow_version | Automation version that last touched the record |
updated_at | Last metadata update |
3. Shared request states
Use standardized states regardless of platform:
DRAFT
SUBMITTED
VALIDATION_FAILED
PENDING_APPROVAL
APPROVED
REJECTED
EXPIRED
FULFILLMENT_PENDING
IN_PROGRESS
FULFILLED
ACKNOWLEDGMENT_PENDING
ACKNOWLEDGED
MANUAL_REVIEW
The separation matters. Approval, fulfillment, and acknowledgment are three different lifecycles, and a single request may pass through all of them. Collapsing them into one status field is how requests get lost between departments.
4. Core routing context
Before taking any action, resolve:
Requester
|
v
Department
|
v
Manager
|
v
Budget / Threshold
|
v
Approver
|
v
Deadline
The workflow should never assume that the requester's direct manager is always the final approver. Approval rules may depend on:
- department;
- request type;
- monetary value;
- cost center;
- seniority;
- equipment category;
- regional entity.
Resolve the context first, then route. Do not encode "manager approves everything" into the logic.
BLUEPRINT 1 — INTERNAL PURCHASE REQUEST APPROVAL
5. Trigger
[TRIGGER] Purchase Request Submitted
Required information:
- Requester
- Department
- Item / Service
- Amount
- Currency
- Business Reason
- Cost Center
6. Validate request
[FILTER] Required Fields Complete?
If no:
[ACTION] Return Request to Requester
Status: VALIDATION_FAILED
Return exactly what is missing. Do not send a generic failure message.
Example:
Missing:
- Cost Center
- Business Justification
7. Resolve requester
[LOOKUP] Employee / Requester Record
Retrieve:
- department;
- direct manager;
- role;
- office/entity;
- active employee status.
If the employee cannot be identified, do not guess. Route to MANUAL_REVIEW.
8. Budget threshold router
Create configurable approval thresholds. The amounts should live in configuration, not hard-coded workflow logic.
| Amount | Approval route |
|---|---|
| 0 – 500 | Direct Manager |
| 501 – 2,500 | Manager + Department Head |
| 2,501 – 10,000 | Department Head + Finance |
| > 10,000 | Finance + Executive Approver |
Then:
[ROUTER] Request Amount
Currency handling matters: convert to the company's base currency using a stored rate before applying the threshold, and keep the original amount for the audit trail.
9. Department-specific routing
After monetary routing:
[ROUTER] Department
| Department | Route to |
|---|---|
| Marketing | Marketing Lead |
| Sales | Head of Sales |
| Engineering | Engineering Manager |
| Operations | Operations Lead |
| IT | IT Manager |
Certain categories may require specialist approval regardless of department:
| Category | Required review |
|---|---|
| Software Subscription | IT / Security Review |
| Legal Service | Legal Review |
| Hardware | IT Review |
Combine the two routers - amount and department - rather than letting one overwrite the other. A 12,000 software subscription in Marketing needs the Marketing Lead, Finance, an executive, and IT security review.
10. Approval chain
Example:
[LOOKUP] Manager
|
v
[FILTER] Threshold
|
v
[ROUTER] Department
|
v
[ACTION] Request Approval
Possible approval states:
PENDING_MANAGER_APPROVAL
PENDING_DEPARTMENT_APPROVAL
PENDING_FINANCE_APPROVAL
PENDING_EXECUTIVE_APPROVAL
11. Sequential vs parallel approval
Make this configurable per request type.
Sequential:
Manager
|
v
Department Head
|
v
Finance
Useful when each approval depends on the previous one.
Parallel:
+--> Finance
Request ----+
+--> IT
Continue only after both approve. Do not mark the request approved when one branch of a parallel chain is still pending.
12. Approved request
When all approvals pass:
approval_status = APPROVED
Then:
[ACTION] Notify Requester
Optionally:
[ACTION] Create Procurement Task
or:
[ACTION] Create Purchase Order
The fulfillment lifecycle starts here: FULFILLMENT_PENDING → IN_PROGRESS → FULFILLED.
13. Rejected request
Store:
rejected_byrejected_atrejection_reason
Then notify the requester. Never send only:
Request rejected.
Provide the decision reason where organizational policy allows it. A rejection without a reason generates a follow-up email, a Slack message, and a meeting - every time.
14. Expired request
Requests should have an approval window. Example:
expires_at = submitted_at + 7 business days
Scheduled monitor:
[SCHEDULE] Check Pending Requests
Then:
[FILTER] Current Time > expires_at?
If yes:
approval_status = EXPIRED
Do not continue sending approval reminders indefinitely. An expired request that keeps pinging approvers trains people to ignore the workflow.
BLUEPRINT 2 — EQUIPMENT REQUEST ROUTING
15. Trigger
[TRIGGER] Equipment Request Submitted
Examples:
- laptop;
- monitor;
- phone;
- keyboard;
- headset;
- workstation;
- access card;
- specialist equipment.
16. Validate equipment request
Required:
- Employee
- Department
- Equipment Type
- Reason
- Required Date
- Location
Optional:
- Preferred Model
- Replacement / New
- Existing Asset ID
17. Determine request type
[ROUTER] Equipment Category
| Category | Route to |
|---|---|
| Computer Hardware | IT |
| Office Furniture | Workplace / Operations |
| Mobile Device | IT + Finance |
| Specialized Equipment | Department Manager + Operations |
18. New vs replacement
[FILTER] Replacement?
If yes:
[LOOKUP] Existing Asset
Check:
- asset ID;
- assigned employee;
- age;
- warranty;
- condition;
- previous replacement history.
This avoids issuing duplicate equipment unnecessarily. A replacement request for an asset still under warranty should route to the vendor process, not to procurement.
19. Budget check
Equipment can reuse the purchasing approval engine.
[LOOKUP] Equipment Cost
Then:
[ROUTER] Budget Threshold
Example:
| Condition | Route |
|---|---|
| Standard Equipment AND within department allowance | Auto Route to IT |
| Above Standard Budget | Manager Approval |
| High-Value Equipment | Manager + Finance |
20. Department-specific rules
Example:
- Engineering → High-Spec Laptop Allowed
- Sales → Standard Laptop + Headset
- Design → Design Workstation / Monitor
- Operations → Standard Equipment Profile
Do not hard-code specific device models into the workflow. Use an equipment_profile:
STANDARD
POWER_USER
DESIGN
ENGINEERING
EXECUTIVE
CUSTOM
Profiles keep the workflow stable when hardware models change every year.
21. Inventory lookup
Before purchasing:
[LOOKUP] Available Inventory
If available:
[ACTION] Reserve Equipment
If unavailable:
[ACTION] Create Procurement Request
22. Unavailable equipment
If the requested item is unavailable:
[FILTER] Approved Alternative Exists?
If yes, offer the alternative. If no, route to MANUAL_REVIEW or procurement.
23. Fulfillment
After approval:
[ACTION] Create IT / Operations Task
Include:
- Requester
- Equipment
- Location
- Required Date
- Approval Reference
24. Completion verification
Before closing:
[VERIFY] Equipment Assigned?
Check:
- asset created;
- employee assignment recorded;
- serial/reference stored;
- fulfillment date available.
Then:
fulfillment_status = FULFILLED
Never mark a request fulfilled because a task was closed. Mark it fulfilled when the asset record proves the equipment reached the employee.
BLUEPRINT 3 — POLICY ACKNOWLEDGMENT TRACKER
25. Objective
Track whether employees received and acknowledged required policies. Examples:
- Information Security Policy
- Remote Work Policy
- Expense Policy
- Code of Conduct
- Acceptable Use Policy
- AI Usage Policy
26. Trigger
Possible triggers:
[TRIGGER] Policy Published
or:
[TRIGGER] Employee Added
or:
[TRIGGER] Policy Version Updated
27. Identify required audience
[ROUTER] Policy Audience
Examples:
ALL_EMPLOYEES
MANAGERS
FINANCE
SALES
ENGINEERING
CONTRACTORS
SPECIFIC_REGION
Then:
[LOOKUP] Eligible Employees
Resolve the audience at assignment time and store it on each acknowledgment record, so the requirement stays stable even if the policy scope changes later.
28. Create acknowledgment record
For every employee:
policy_idpolicy_versionemployee_idassigned_atacknowledgment_deadlinestatusacknowledged_at
Status:
ACKNOWLEDGMENT_PENDING
29. Send policy notification
[ACTION] Send Policy
Include:
- policy title;
- version;
- effective date;
- deadline;
- acknowledgment action.
Avoid asking employees to reply by email if possible. Use a trackable acknowledgment action - a form, a portal confirmation, or a button in the message - so the record is created by the act of acknowledging.
30. Deadline logic
Example:
Assigned
|
v
Deadline = +7 Days
Configurable by policy. Store the deadline per acknowledgment record.
31. Reminder workflow
Scheduled daily:
[SCHEDULE] Acknowledgment Monitor
Then:
[FILTER] Acknowledged?
If no:
[ROUTER] Time Remaining
Example:
| Time remaining | Action |
|---|---|
| 3 Days Remaining | Reminder 1 |
| 1 Day Remaining | Reminder 2 |
| Deadline Passed | Escalation |
32. Prevent repeated reminders
Before sending:
[LOOKUP] Reminder History
Check:
policy_idemployee_idpolicy_versionreminder_level
Then:
[FILTER] Already Sent?
If yes:
STOP
This prevents duplicate reminders caused by workflow retries. A scheduler that fires twice in one morning should not produce two identical emails.
33. Policy versioning
Acknowledgment must be linked to a specific version. Do not store only:
Policy = Security Policy
Acknowledged = true
Store:
Policy = Security Policy
Version = 3.1
Acknowledged = true
Acknowledged At = timestamp
If version 4.0 is released, create a new acknowledgment requirement. Prior acknowledgments remain valid history for the version they covered - they are not deleted or overwritten.
34. Acknowledgment complete
On acknowledgment:
[TRIGGER] Acknowledgment Submitted
Then:
[FILTER] Correct Policy Version?
If yes:
status = ACKNOWLEDGED
acknowledged_at = timestamp
Stop all future reminders for that version. If the version is wrong - for example, the employee acknowledged 3.1 after 4.0 went live - keep the record but do not satisfy the current requirement.
35. Missed deadline
If the deadline passes:
status = OVERDUE
Escalation:
Employee
|
v
Manager
|
v
HR / Compliance
Depending on policy. Escalation thresholds should be configuration, not code.
SHARED EDGE CASES
36. Missing manager
This should never cause the workflow to silently fail.
[LOOKUP] Direct Manager
If missing:
[FALLBACK] Department Head
If unavailable:
[FALLBACK] Operations / HR / Finance Queue
Record:
MANAGER_LOOKUP_FAILED
37. Expired purchase request
Before every approval action:
[FETCH] Latest Request
Then:
[FILTER] Still Active?
If expired, stop. Do not approve stale requests.
38. Employee becomes inactive
Before:
- equipment fulfillment;
- policy reminder;
- purchase completion;
check employee status.
[FILTER] Employee Active?
If no, cancel or route to manual review.
39. Duplicate request
Before creating:
[LOOKUP] Existing Active Request
Possible uniqueness:
requester
+
request_type
+
item
+
time_window
If duplicate suspected:
DUPLICATE_REVIEW
Do not silently drop the submission - the requester should know why it was flagged.
40. Repeated reminder protection
Every reminder should have an idempotency key. Example:
request_id
+
reminder_type
+
reminder_level
Example:
REQ123_PURCHASE_APPROVAL_REMINDER_1
If already sent:
SKIP
41. Approval changed after notification
Always refresh request state before sending reminders.
[FETCH] Latest Request
If already APPROVED, REJECTED, or EXPIRED, stop the notification. A reminder sent five minutes after an approval is a trust problem, not a minor bug.
42. Master approval architecture
[TRIGGER]
Request Submitted
|
v
[LOOKUP]
Requester
|
v
[LOOKUP]
Department + Manager
|
v
[VALIDATE]
Required Data
|
v
[ROUTER]
Request Type
|
v
[ROUTER]
Budget Threshold
|
v
[ROUTER]
Department
|
v
[LOOKUP]
Approver
|
v
[ACTION]
Request Approval
|
v
[FILTER]
Approved?
+-------+--------+
| |
v v
YES NO
| |
v v
FULFILL REJECT
|
v
[VERIFY]
|
v
[AUDIT]
43. Policy architecture
[TRIGGER]
Policy Published
|
v
[LOOKUP]
Required Audience
|
v
[ACTION]
Create Acknowledgments
|
v
[ACTION]
Notify Employees
|
v
[SCHEDULE]
Deadline Monitor
|
v
[FILTER]
Acknowledged?
|
v
[ROUTER]
Time Remaining
+---------+---------+----------+
| | | |
v v v v
WAIT REMINDER OVERDUE |
| | |
EMPLOYEE MANAGER STOP
|
v
HR / COMPLIANCE
44. Shared vault layer
Credentials should stay outside workflow logic.
Workflow
|
v
[LOOKUP] Vault / Credential Store
|
+-- HRIS
+-- ERP
+-- Procurement
+-- ITSM
+-- Email
+-- Messaging
Never store:
- API keys;
- authentication tokens;
- passwords;
- financial credentials
inside request descriptions or audit logs. The request object should reference an approver by ID, never by embedded credentials.
45. Audit model
Every meaningful action should create an event.
| Field | Purpose |
|---|---|
event_id | Unique event identifier |
request_id | Request reference |
request_type | PURCHASE, EQUIPMENT, POLICY |
requester_id | Employee reference |
department | Owning department |
event_type | What happened (see below) |
previous_status | State before the event |
new_status | State after the event |
approver_id | Approver involved, if any |
approval_level | Which approval step was affected |
result | Outcome of the action |
error | Error detail when the action failed |
workflow_run_id | Execution reference |
workflow_version | Automation version |
created_at | Event timestamp |
Useful events:
REQUEST_SUBMITTED
VALIDATION_FAILED
APPROVAL_REQUESTED
APPROVAL_REMINDER_SENT
APPROVED
REJECTED
REQUEST_EXPIRED
EQUIPMENT_RESERVED
PROCUREMENT_REQUIRED
EQUIPMENT_ASSIGNED
POLICY_ASSIGNED
POLICY_REMINDER_SENT
POLICY_ACKNOWLEDGED
POLICY_OVERDUE
MANAGER_LOOKUP_FAILED
DUPLICATE_REQUEST_DETECTED
46. Recommended daily operations digest
These three workflows can feed one internal digest.
INTERNAL OPERATIONS
Approvals
- 6 pending
- 2 expiring today
Equipment
- 4 awaiting fulfillment
- 1 unavailable item
- 2 procurement requests
Policy
- 18 acknowledgments pending
- 4 due today
- 2 overdue
Exceptions
- 1 missing manager
- 1 duplicate request
This gives Operations, Finance, HR, and IT one exception-focused view. The digest should lead with exceptions - the pending counts are context, the exceptions are the work.
47. Final system
INTERNAL REQUEST
|
v
[VALIDATE]
|
v
REQUESTER + DEPARTMENT
|
v
[ROUTER]
+------------+------------+
| | |
v v v
PURCHASE EQUIPMENT POLICY
| | |
v v v
THRESHOLD CATEGORY AUDIENCE
| | |
v v v
APPROVAL APPROVAL DEADLINE
| | |
v v v
PURCHASE FULFILLMENT ACKNOWLEDGE
+------------+------------+
|
v
[VERIFY]
|
v
[AUDIT]
The core principle:
Every request follows the same path: validate it, resolve who owns it, route it with configuration-driven rules, act on it, verify the action actually happened, and record what happened.
That is what separates three reliable internal workflows from three scripts that email people and hope the email was enough.