PM Presentation — Lucid Motors Payments
HubSpot PM Interview · Project Presentation

Enabling Credit Card
Payments
at Delivery

and building a unified Customer payment ledger across Stripe, Salesforce, and SAP
  • Identified a high-friction payment problem blocking deliveries at Lucid Motors
  • Designed and shipped a credit card payment method end-to-end as the sole payments PM
  • Migrated ACH data and unified all payment types into one ledger across Salesforce and SAP
  • Unlocked same-day delivery for the first time in company history
CompanyLucid Motors
My RoleProduct Manager, Payments
ScopePortal · Salesforce · Stripe
TimelineQ3–Q4 2024
Scroll
01 Problem & Validation

Three payment methods.
All of them painful.

The Problem

When a customer finalized their Lucid purchase, a remaining balance was due at delivery. Every available payment method introduced delay, manual work, or confusion: for customers and for the internal team.

ACH Transfer

Settlement & Visibility Gap

  • Many customers struggled with the ACH 2FA process and setup
  • 2–3 day settlement window with no real-time visibility
  • Advisors had to check Salesforce daily to see if payment showed as Paid
  • ACH data lived in a legacy system, not yet on the unified payment ledger
⏱ 2–3 day settlement
Wire Transfer

Manual Wire

  • Customer copies routing numbers from portal
  • Initiates wire from their own bank
  • Must tell us they sent it
  • Finance manually logs receipt in Salesforce
⚠ Manual Salesforce logging
Cashier's Check

Physical Check

  • Customer trips to the bank
  • Mail or hand-deliver the check
  • Delivery cannot be scheduled until funds clear
  • 3 to 5 business days minimum
🏦 3–5 day clearance
⚡ Why Now

The original goals were operational: automate payment logging and give the sales team full visibility and refund capability without Stripe access. The bigger unlock only became clear post-launch.

  • Same-day payment settlement and auto-logging across Salesforce, MongoDB, Kafka, and SAP
  • Migrate ACH payment data from legacy system into the unified ledger, visible in Salesforce and SAP
  • Refund functionality inside Salesforce, no Stripe dashboard access needed
  • Chargebacks and refunds visible in Salesforce payment history
  • Every prior method had a 24+ hour settlement lag, the invisible ceiling on how fast we could hand a car over
  • Card authorization is instant. A customer could reserve online, finalize payment, and drive home the same day: for the first time in company history

How we confirmed the problem.

Delivery Advisors
Payment delays flagged in every quarterly ops review as a top-3 friction point. Manual bank verification and Salesforce logging consumed ~15–20 min per affected delivery. The end-of-month and end-of-quarter sales push was even more difficult without an automated, same-day payment option.
Support Tickets
"Payment confusion" and "how do I pay" were consistently top-5 support categories at the delivery stage. Many customers had never sent a wire or initiated an ACH, and credit card was their mental model for all online payments.
Ops Data
An estimated 20–25% of monthly deliveries (~100/month) involved manual payment follow-up, advisor rebooking, or logistics holds, roughly $15–20k/month in preventable operational cost, excluding NPS impact.
Customer Interviews
Post-delivery interviews surfaced a consistent theme: "I didn't know what ACH was" and "I wish I could have just used my card."
Finance + Risk
Finance confirmed credit card risk was manageable with a cap. $8,000 limit was set jointly with Finance and Risk. Above that threshold, chargeback exposure outweighed the convenience gain. A 3% pass-through fee ensured Lucid wouldn't absorb interchange cost.
02 Solution & My Role

Seven requirements.
One coherent system.

I was the sole PM for the payments team, no PM above me on this feature. I owned the problem, the spec, the architecture decisions, and QA sign-off.

REQ 01

Credit Card as New Method

Enabled in the delivery portal via Stripe. Market code (USA, CA, DE…) routes each charge to the correct merchant account automatically.

REQ 02

Overpayment Prevention

Input validated against remaining balance in real time. If the amount entered exceeds what's owed or the $8k cap, the UI tells you exactly which limit was hit.

REQ 03

Multi-Payment Support

Customers can split the balance across multiple card transactions. Each payment is logged immediately and the remaining balance updates live.

REQ 04

$8,000 Credit Card Cap

Hard limit agreed with Finance and Risk. Enforced client-side and server-side. Balances above $8k require ACH or wire for the remainder.

REQ 05

3% Convenience Fee

Applied only to the payment amount, not the vehicle total. Disclosed transparently before confirmation. Base amount reduces balance; fee is a separate line in Salesforce.

REQ 06

Salesforce Payment Ledger + Refunds

Every payment logged with Order ID, VIN, Market, Stripe PI, base amount, and fee separately. Refunds issuable by the sales team directly from Salesforce, no Stripe dashboard access required.

REQ 07 · ACH

Legacy ACH Data Migration

ACH payment history migrated from the legacy system into the unified Lucid payment ledger. Both CC and ACH payments now visible together in Salesforce and consumable by SAP CPI for full reconciliation.

Data Flow: end to end
Customer PortalReact · market_code
Payment Containerrouting layer
Payment Configrules · limits · methods
Stripe APIacct per market
SalesforceLucid__Payment__c
+
MongoDBaudit / portal reads
+
Kafkapayments.captured
SAP CPIERP reconciliation
⚠ What Went Wrong Mid-Delivery

After kickoff, we uncovered that the Salesforce API returning the account balance was not reliable: it was surfacing incorrect amounts, which meant customers could have seen the wrong balance due in the portal. I immediately brought in cross-functional leads across Sales, Finance, and Delivery Ops and reframed the conversation: not as a delay, but as a data integrity fix we were making in parallel before launch.

How I responded

I brought in cross-functional leads across Sales, Finance, and Delivery Ops and reframed the conversation immediately. The message was not "we are delayed." It was: "We found a data integrity issue and we are fixing it in parallel before launch." That framing held the timeline narrative and got us alignment to fix it correctly rather than pressure to ship around it. I then coordinated directly with the enterprise systems team to resolve the calculation logic alongside our own build.

Why it mattered

The feature was only as trustworthy as the balance data behind it. Shipping incorrect balances in a payments product is not a "fix it in v2" situation: a customer could have been overcharged or undercharged at the most important financial moment of their car purchase. This reinforced a principle I now apply to every payments project: validate the system of record before designing the experience on top of it.

🖥
Live Product Demo
Customer Portal · Salesforce · Stripe Dashboard
Expand
💡 Use the tab switcher inside the demo to switch between Customer Portal, Salesforce, and Stripe views.

2026 · Air Grand Touring · Stellar White Metallic

Lucid Air

VINL1CVL3A42NL001337
FinanceLease · 36 mo
Market🇺🇸 USA
DeliveryMar 25, 2026
Status
Balance Due
🚗
🔧 PM Demo: Toggle calculation bug fix
Bug Active
📄 Final Order Ledger
Sale $77,000
Adj. Cap $63,490
Residual $44,000
Monthly $729.81
Due at Delivery $1,611.84
Details
⚠️
Tax Calculation Bug — Backend: The monthly sales tax was being computed against the Adjusted Capitalized Cost ÷ term ($63,490 ÷ 36 = $1,763.61) rather than against the correct tax base of base monthly payment (depreciation + finance charge = $675.75). This produced a monthly tax of $141.09 instead of the correct $54.06 — inflating the monthly payment by $87.03 and cascading into an overstated balance due shown to the customer.
Negotiated Sale Price$77,000.00
+ Acquisition fee$895.00
+ Documentation fee$85.00
+ Title & registration (CA)$400.00
+ Sales tax on fees (8%)$110.00
Gross Capitalized Cost$78,490.00
− Cash down payment–$5,000.00
− Trade-in (2022 Tesla M3)–$8,000.00
− Lucid incentives / rebates–$2,000.00
Adjusted Capitalized Cost$63,490.00
− Residual Value (55% of $80k MSRP)–$44,000.00
Monthly depreciation ($19,490 ÷ 36)$541.39
Finance charge (MF 0.00125)$134.36
Monthly sales tax — wrong base: adj. cap ÷ 36 × 8%BUG$141.09
Monthly Lease Payment$816.84
First Month's Payment (due at delivery)$816.84
Delivery & Prep Fee$1,295.00
− Reservation Deposit (covers security deposit)–$500.00
Balance Due at Delivery$1,611.84
💳 Payment History
Total Applied to Balance $1,000.00
💰 Balance Summary
Remaining Balance
$611.84
After $1,000.00 applied to balance
$1,000 paid$2,345.27 total
Credit Card Limit $0 / $8,000
🔒 Make a Payment
$
Applied to order balance$0.00
3% convenience fee (Lucid pass-through)$0.00
Total charged to card$0.00
✓ Only the base amount reduces your balance. The 3% fee is a separate card processing charge.
🔒 Secured via Stripe · USA Merchant Account
ACH Bank Transfer
Account #••••••4891
Routing #021000021
ReferenceORD-2026-LCA-00741
⏱ ACH takes 2–3 business days to settle. Notify your advisor after initiating.
Wire Transfer
Account #••••••7732
Routing #121140399
SWIFTSVBKUS6S
⚠️ Notify your delivery advisor after sending. Allow 24 hrs for manual verification.
Cashier's Check
Payable ToLucid Motors, Inc.
MemoORD-2026-LCA-00741
Mail To7373 Gateway Blvd, Newark CA
⚠️ Allow 3–5 days for check clearance before delivery can be scheduled.
✨ Credit Card Payments Now Available Pay up to $8,000 by card. A 3% convenience fee is charged on top of your payment — it does not count against your order balance.
Payment Records — Order Object
ORD-2026-LCA-00741 · Object: Lucid__Payment__c
● Live · Synced via payment container webhook
Order IDORD-2026-LCA-00741
VINL1CVL3A42NL001337
Market CodeUSA
Stripe Accountacct_lucid_us_prod
CustomerJames Whitmore
Finance TypeLease · 36 mo
Total Due$1,524.81
Balance Remaining$524.81
📋 Payment Records (Lucid__Payment__c)
Record IDDateMethodMarketBase AmountConv. FeeCard TotalStripe PIStatusAction
⚡ Downstream Event Bus (Kafka) Each captured payment fires lucid.payments.captured consumed by SAP CPI for ERP reconciliation. Events include base_amount and convenience_fee as separate fields so downstream systems can reconcile against Stripe's total charge.
Selected Record
🗂️
Select a record to view
details & issue refunds
⚡ Stripe
Dashboard — Lucid Motors USA
acct_lucid_us_prod · Live mode
Connected
Payment Intents (Card)
ACH Debits
Payment Intents — credit card charges with metadata
PI IDDateCustomerAmount ChargedBase AmtFeeStatusMetadata
🔑 Why metadata matters for reconciliation Each Payment Intent carries metadata with order_id, vin, market, and base_amount. This lets finance match every Stripe charge back to a Salesforce order — and confirms that the total charge = base_amount + convenience_fee, not a reduction of the order balance.
PI Detail
Select a payment to view
full Stripe record & metadata
ACH Debit Transfers — bank transfers with metadata
Transfer IDDateCustomerAmountBankStatusMetadata
🏦 ACH reconciliation note ACH transfers settle in 2–3 business days. The same metadata fields apply — order_id, vin, market. No convenience fee applies to ACH. Finance can filter by order_id to pull all ACH and card charges for a single order in one query.
ACH Detail
🏦
Select an ACH transfer
to view full record & metadata
✅ Payment processed

Specifically, what I owned.

🔍
Discovery & Business Case
Built the problem brief from advisor feedback, support data, and ops estimates. Made the prioritization call: CC payments over expanding wire/ACH automation.
Problem framingPrioritization
📐
Requirements & Product Design
Wrote the full PRD: cap, fee logic, multi-payment, Salesforce schema, and refund flow. Partnered with design on the ledger UX and fee transparency disclosure.
PRDUX partneringStakeholder alignment
⚠️
Bug Identification: Tax Calculation
Caught in QA: monthly sales tax was applied to Adjusted Cap Cost ÷ 36 ($1,763) instead of the correct base (monthly payment = $675), inflating the customer-facing balance by ~$87. Prior to this feature, the calculation was never surfaced to the customer directly, the sales team simply made manual adjustments inside Salesforce. Once balances were exposed in the portal, every number had to be exact. Defined the fix and verified it before any customer saw it.
Tax calc bugQA sign-off
🏗️
Architecture Ownership
Owned the payment container spec: market code routing, Stripe account mapping, and the payment config file that controls method availability per market. Built for extensibility from day one.
Payment containerStripe routing
☁️
Salesforce Integration
Defined the Lucid__Payment__c schema: every field and why it matters for reconciliation, then built the refund flow so sales reps could issue refunds without needing Stripe access.
SalesforceReconciliation
📡
Downstream Coordination
Defined Kafka event schema with the SAP CPI team: base_amount and convenience_fee as separate fields, so ERP systems could reconcile accurately against Stripe's total charge.
KafkaSAP CPIMongoDB
03 Metrics & Success

How we defined
done, and done well.

I defined success criteria before we wrote code, across customer experience, operational efficiency, and financial integrity. Here's how to read the cards below:

Data type →
● Measured outcome
◎ Launch target
◈ Business case estimate
⊘ Guardrail
✦ Qualitative signal

Within the first weeks of launch, same-day delivery conversions appeared for the first time in company history. End-of-month and end-of-quarter spikes were especially visible: advisors could now close deals and hand over cars the same day, something the settlement lag of every prior payment method had made impossible. I escalated this immediately to my VP for C-Level recognition.

$0
Payment-Gated Delivery Pushes
For card-paying customers, delivery could be scheduled the moment payment cleared. The settlement lag that had blocked same-day delivery was eliminated entirely.
● Measured outcome
↑ EOM
Same-Day Deliveries at Month-End
Advisor-reported spike observed post-launch, especially at month-end and quarter-end. Advisors could close and hand over on the same day for the first time, directly enabling end-of-period sales pushes.
● Measured outcome
↓ 80%
Manual Ops Time per Delivery
Advisors spent 15–20 min per delivery on manual verification and Salesforce logging. Card payments auto-log with zero human steps. Advisors confirmed the process was faster and easier post-launch.
◎ Launch target · advisor-confirmed
$15–20k
Monthly Cost of the Problem
~100 deliveries/month with friction × blended ~$150–200 per delivery (advisor time + logistics hold). Used to build the prioritization case, not measured post-launch directly.
◈ Business case estimate
~40%
CC Adoption Within 60 Days
Expected CC to become the dominant method for balances under $8k, displacing ACH. Tracked via payment method breakdown in Salesforce reports.
◎ Launch target
0
Reconciliation Errors in Production
Rule: Stripe PI total must equal SF base_amount + convenience_fee. Any mismatch alerts before it reaches a customer. Finance confirmed reconciliation was cleaner and faster post-launch.
⊘ Guardrail · finance-confirmed
📣 Qualitative Signal: Post-Launch
Delivery Advisors
"Payments are faster and easier": unprompted feedback after launch. The manual verification and Salesforce logging steps they had flagged in every ops review were gone.
Sales Team
Positive feedback on the Salesforce refund flow. Sales reps could resolve customer issues directly without needing to contact the payments team or access Stripe.
Finance
Reconciliation described as cleaner and faster. Separate base amount and fee fields in Salesforce meant no manual calculation to match Stripe totals.
Customers
No meaningful pushback on the 3% convenience fee. The ease of the card experience outweighed the cost in customer perception. Fee transparency before confirmation helped.
04 Reflection & What's Next

What I'd do
differently, and where I'd
take it next.

Shipping v1 gave me three clear misses I'd correct, two durable lessons, and a roadmap I was actively building when I left.

Would do differently

Write a calculation spec before engineering touches code

The tax bug, applying 8% to Adjusted Cap Cost ÷ 36 instead of the base monthly payment, inflated the customer balance by ~$87. A simple worked-example test matrix in the PRD would have caught it in sprint one, not late QA.

Would do differently

Bring advisors into the design phase, not just discovery

I gathered advisor feedback at the problem stage but didn't loop them back in during UI design. They interact with customers at the exact moment of payment: one working session mid-design would have shaped the ledger layout and fee disclosure language much earlier.

Would do differently

Soft launch in one market before full rollout

We launched across all markets at once. A 2-week USA-only pilot would have let us validate the $8k cap against real payment patterns, confirm Salesforce logging at scale, and create a clear go/no-go gate before broader exposure.

Learned

The $8k cap needed data, not intuition

Finance and Risk set $8k based on chargeback intuition, which was reasonable, but I later found median delivery balances were $1,500 to $2,500. That data should have anchored the cap from day one. It might have landed lower with the same coverage, or higher with more confidence.

Learned

Ask: what else becomes possible once the friction is gone?

Same-day delivery wasn't in the brief. I discovered it during a post-launch review when I saw numerous reservations convert into same-day deliveries. I quickly raised this to my VP so they could celebrate the win with C-Level leadership. The lesson: when solving friction, always ask what unlocks upstream: the strategic story is usually bigger than the feature request.

Where I would have taken it next.

The infrastructure, Stripe, Salesforce, and Kafka, was intentionally built to power more than a web form. The roadmap below was what I was actively scoping before I left.

NEXT 01 · Expand

Canada & EU Market Rollout

The payment container was built to route by market code from day one. Expanding CC to CA and EU was a configuration change plus legal review, not a re-architecture. Next step was a market-by-market enablement plan with regional ops teams.

NEXT 02 · Optimize

Data-Driven Cap + Sales Manager Overrides

Post-launch data showing median balances of $1,500 to $2,500 would drive a cap revisit. Beyond that: let sales managers approve per-customer exceptions via a Salesforce-native override. The payment container would read the cap value directly from the Salesforce API, so a manager could adjust the limit for a specific customer without any engineering involvement.

NEXT 03 · Intelligence

Dynamic Risk Scoring via Stripe Radar

The $8k cap is a blunt instrument. Stripe Radar enables transaction-level risk scoring: a higher-trust customer shouldn't have the same ceiling as a first-time buyer. Replace the flat cap with a dynamic limit tied to card and customer history.

NEXT 04 · Physical Retail: Lucid Point of Sale

Tap or Swipe at the Studio: No Portal Required

The biggest item on my roadmap. Today, customers enter card details through the web portal. The next step was bringing this into our retail point-of-sale: a tap or swipe at the Lucid studio, facilitated by the sales advisor. The POS would look up the account by Order ID, VIN, email, phone, or customer name, pull the open balance, and process payment in one motion. No portal, no form-filling. The customer experience becomes identical to any premium retail purchase, backed by the exact same Stripe infrastructure, Salesforce logging, and Kafka events we already built and owned.

Thank you. Happy to go deeper on any section.
Portal demo available · All numbers are real or clearly estimated · No NDA constraints