TechnoStore — Revenue Cloud Quote-to-Cash for the DACH market
End-to-end B2B electronics Quote-to-Cash demo on Salesforce Revenue Lifecycle Management, Contract Lifecycle Management, and Industries CPQ — orchestrated with MuleSoft Anypoint across ten external systems.
- Year
- 2025
- Role
- Salesforce Developer
- Tech stack
- ApexRevenue Lifecycle ManagementContract Lifecycle ManagementIndustries CPQAgentforce Actions (@InvocableMethod)SAP OData v2 (CSRF, deep-insert)CAMT.053 / ISO 20022DATEV (EXTF / SKR04)Approval Processes (multi-tier)MuleSoft AnypointPlatform EventsNamed CredentialsSFDX (6 packages)Kevin O'Hara trigger frameworkOpenAPI 3.0arc42
Highlights
- 10 external systems via MuleSoft + Apex — incl. SAP S/4HANA (OData v2: CSRF, deep-insert, CloudEvents) and the German finance stack (lexoffice + DATEV EXTF/SKR04)
- Agentforce-ready Apex actions, Einstein Copilot-invocable (revenue summary + payment reminders)
- CAMT.053 / ISO 20022 bank-statement parser for SEPA payment reconciliation
- Multi-tier discount approval (>30 % Finance Director, >50 % VP) + account-context product qualification (Expression Sets)
- Integration-health observability: correlation IDs, error classification, two-layer idempotency, Slack escalation + dashboards
- ~79 Apex classes across 6 SFDX packages; 33 ADRs (Nygard) + arc42 Solution Blueprint
- 50-entry STAR-format Notion portfolio published programmatically
- DACH-specific: 19 % VAT (multi-country fallback table), DHL preference, DE/AT/CH address parsing
Feature walkthrough
Salesforce → Stripe, end to end
The payment flow in Anypoint Studio: a Salesforce Platform Event (On Invoice Payment Requested) triggers the Mule flow, which builds the Stripe body in DataWeave, creates a Stripe Checkout session, and writes the payment URL straight back into Salesforce. Below it, the stripe-webhook-flow routes the incoming webhook by event type. The console reports the application DEPLOYED — this runs.

The order fan-out — with the failure paths drawn in
A Choice router branches on the fulfillment flags (physical / digital / both). Each branch calls Sendcloud inside a Try scope that has its own error handler and a Sendcloud GET Fallback, then a retry scope creates the Salesforce record and a logger records the outcome. This is the integration-health layer the case study describes — error classification, fallbacks and idempotency — made visible instead of merely claimed.

DataWeave — where “DHL prioritised” actually lives
The Extract Preferred Carrier transform, in DataWeave: it reads Sendcloud's shipping methods, filters for DHL (the DACH carrier preference), falls back to the first available method when there is none, and puts a default on every field it touches. The line in the case study that says the DACH carrier is prioritised is not a slide — it is these six lines of code.

SAP S/4HANA — actually queried, not mocked
The SAP integration flow: a GET against SAP S/4HANA Cloud for Business Partner records, the response logged and diagnosed, the records extracted in DataWeave, and a final response assembled. This is the OData layer behind the SAP claim in the case study — the flow runs and the console reports the records it read.

No secrets in source
The Configuration XML: the Salesforce connector, the webhook HTTP listener, and the Stripe / Slack / Sendcloud request configs. Every credential resolves through a property placeholder — ${salesforce.password}, ${stripe.host}, ${sendcloud.secret} — never a hard-coded value. The secrets live outside the repository, which is the difference between a demo and something you could actually deploy.

The problem
DACH enterprise Salesforce roles (T-Systems, Allianz Technology, Mercedes-Benz.io, BMW Group IT, SAP Industries practice) consistently ask for the same combination: Revenue Cloud + Industries CPQ on the Salesforce side, plus real MuleSoft + payment + logistics + e-signature integration on the orchestration side. Most portfolio projects demonstrate one or the other, not both, and almost none reflect German-market specifics such as Mehrwertsteuer, DHL preference, or multi-country address parsing.
Architecture
Reps work with an account-context-aware Industries CPQ catalogue. Bundle configuration triggers an asynchronous attribute-based pricing service. On Order activation, the OrderTriggerHandler fans out across five downstream systems in parallel: JIRA (direct Apex callout) for inventory tickets, Slack #warehouse (Platform Event → MuleSoft) for picking, DocuSign (Apex + Named Credential) for the contract envelope, Stripe (MuleSoft outbound) for payment, and a branded invoice email. The Stripe webhook arrives at MuleSoft, is HMAC-SHA256 verified, then scatters back to Salesforce (mark Paid), Slack #payments-team, and a Choice router for fulfilment — Sendcloud/DHL for physical items, license-key generation for digital. The DocuSign Connect webhook lands at a Salesforce Site, publishes a Platform Event to escape Guest User FLS limits, and an autolaunched Flow creates the Asset. Cross-cutting, an integration-health layer threads correlation IDs from Salesforce → MuleSoft → provider, classifies failures (auth / validation / timeout / downstream), escalates 5xx to Slack, and enforces two-layer idempotency; revenue and payment-reminder logic is also exposed as Agentforce-ready Apex actions (Einstein Copilot-invocable).
The approach
Code is organised into six SFDX packages (force-app + controllers + services + handlers + actions + tests) so architectural boundaries are visible at the filesystem level — a Service class calling ApexPages would be obvious in code review. All triggers extend the Kevin O'Hara TriggerHandler base with recursion guards and a bypass mechanism. Each external call uses a Named Credential and is wrapped in an idempotent service: the Stripe webhook checks Order.Status before mutating, DocuSign uses a Platform Event indirection to satisfy Guest User context, JIRA stays in direct Apex because the flow is synchronous and low-volume while Stripe goes via Mule for retry and queueing. The 50-entry Notion documentation is itself a feature: NotionPublishService.publishEnterprise() orchestrates six API calls per entry to work around Notion's two-level nesting limit.
The outcome
A coherent twelve-minute Quote-to-Cash demo narrative across ten external systems, ready for both portfolio interviews and customer-facing solution conversations. The project is documented as 33 Architecture Decision Records in Nygard format, an arc42 Solution Blueprint, OpenAPI 3.0 specs for inbound webhooks, and a 17-request Postman collection. Measured end-to-end latency lands at 2–6 seconds. The DACH framing — Mehrwertsteuer formulas, DHL preference, DE/AT/CH address parsing — is the level of detail German enterprises expect, not generic Salesforce knowledge.
External integrations
StripeCheckout + webhook with HMAC-SHA256 verification
Sendcloud / DHLv3 API, DACH carrier prioritised
DocuSignEnvelope creation + Connect webhook
JIRA CloudAuto-ticket on inventory shortage
SlackTwo channels: #warehouse + #payments-team
NotionProgrammatic 50-entry portfolio publishing
MuleSoft AnypointOrchestration layer for the whole flow
SAP S/4HANAATP check, sales-order acknowledgment, tax determination, CAMT.053 reconciliation, master-data sync — a seven-phase layer
Twilio WhatsAppCustomer notifications over WhatsApp Business
lexofficeGerman cloud accounting — automated invoice (Rechnung) creation
DATEVDATEV-konform Buchungsstapel (SKR04, EXTF 700) export for the Steuerberater