Introduction
Getting Started
- Apps
- Pagination
- Authentication
- Environments
- Definitions
Checkout
- Overview
- Getting Started
- Merchants
- Catalog
- Carts and Bags
- Discounts
- Payments
- Payouts
- Webhooks
- Guides
- FAQs
- Resources
- Current Platforms
Violet Connect
- Overview
- Setup
- Payouts
- Commissions
- Guides
- Testing
- FAQs
Relay
Product Info
Payments FAQs
Can we support a different payment provider?
As of now, Violet only supports payments through Stripe. You are however, able to bypass payments with Violet and work with whichever payment provider works best for you if you use our External Payments flow.
How are refunds handled?
Refunds are triggered by a Merchant. If a merchant marks an item as refunded, the refunded amount is returned to the Shoppers card and any transfers made to parties involved are reversed by Violet.
You can view a diagram of our returns and refund process here
How are refunds initiated?
Refunds are initiated by the merchant from within their E-commerce platform dashboard. Violet has webhooks that pick up on refund events which we use to update our records before forwarding the updates to the channel who created the order.
You can view a diagram of our returns and refund process here
How are orders cancelled?
Cancellations are initiated by the merchant from within their E-commerce platform dashboard. Violet has webhooks that pick up on cancellation events which we use to update our records before forwarding the updates to the channel who created the order.
How often does Violet perform reconciliation to ensure order parity?
Violet maintains order parity by reconciling our data with that of the e-commerce platforms on a per-bag basis. The frequency of these checks will depend on the status of the bag(s) in question:
- Bags in an
ACCEPTED
state will be checked every 120 minutes once 2 days have passed since they were submitted. Once 30 days have passed this schedule will move to our long tail reconciliation schedule. - Bags in a
COMPLETED
state will be checked every 120 minutes once 5 days have passed since they they were submitted. Once 30 days have passed this schedule will move to our long tail reconciliation schedule. - Bags in an
ACCEPTED
orCOMPLETED
state that were submitted more than 30 days ago (long tail) will be checked every 5 days. Once 45 days have passed reconciliation syncs for an order will end. Customers should likely have requested a refund and merchants should likely have processed a refund within 45 days of an order being submitted.
How does Violet handle multi merchant checkout with differing Payment Service Providers (PSPs)?
Violet doesn’t rely on merchant PSP’s. During the onboarding process, we create an “internal” Stripe Express Connect account for this merchant (this only lives within Violet and is different to a traditional Stripe account). Merchants then connect their bank account directly to this Stripe account, which is what is paid out.
See our Payouts section for more info.
What should we do if there’s a non-US merchant trying to connect a USD bank account?
Unfortunately, Stripe does not allow cross-border transfers to be made in USD due to differences in KYC regulations for each country. Cross-border transfers require the “Recipient Service Agreement” for linked accounts, and as seen here, the only supported combination as of now for “country name” accounts is “country code” / “currency code”. Our recommendation is to ask the Merchant to connect their local currency bank account instead. We actively monitor the list of settlement currencies though, so if this ever changes, we will let you know.
If we are using our own payment process, why does Violet still require billing address?
We just pass the billing address through to the commerce platforms where it’s generally a requirement on their end. Most commerce platforms will not accept orders without a billing address, which historically has been used to determine who is ultimately responsible for paying for the order.
The billing address can sometimes be used for calculating taxes but it’s not a common practice. Most merchants, at least in North America, only use the shipping address for calculating taxes. The choice for which address to use is something the merchant’s can configure in their commerce platform. Violet does not play any role in deciding which address to use. We provide both addresses to the commerce platform, and they eventually provide tax data in return usually without telling us which address they used.
Unfortunately this is a Platform restriction. Some of the platforms we support require both. At this point Violet has the same requirements. The best workaround for now is to send the same address for both; we have a property for just that.
Can I issue store credit to a Shopper?
You can certainly issue store credit to a Shopper. The key is in how to implement store credit. You have two choices based on whether you use Violet’s integrated payment tools, or your own.
- Violet Payments
- Shopper has $20 of credit from Channel.
-
Scenario 1: Shopper can buy anything less than the price of the credit (less than $20) at no charge.
- Channel uses a company credit card to pay for the purchase. Default behavior of checkout satisfies this requirement. Channel builds the logic to use the company card when tokenizing the payment instead of the Shopper’s credit card.
-
Scenario 2: Price of the product is $100. Shopper applies the discount to the purchase.
→ Biggest issue here is multiple credit card transaction fees. If you’re ok with that, it’s relatively easy.
- When shopper opts to use the credit, the payment method logic changes.
- Channel uses a company credit card to pay $100 for the product(s) directly with the Merchant through Violet’s API.
- 1st credit card processing fee
- Channel charges the Shopper $80.
- 2nd credit card processing fee
-
- Shopper has $20 of credit from Channel.
- Custom Payments
- Same as above. The difference is, it’s your payment stack, so you can determine if you want to have some sort of other payment rules with the Merchant.
-
Scenario 1: Shopper pay Channel directly for $80 (product total was $100)
-
Channel pays merchant at the end of the month via ACH for all orders.
- Shopper is charged $80 for the $100 item.
- Merchant receives the order and it is marked as Paid.
- Merchant has not received payment.
- Last day of the month the Merchant receives an ACH for all orders from the month.
→ Violet is likely going to introduce this an alternative payout model for the future to make payouts more flexible. However, many parts of the system become more open to abuse, so we’re taking our time in how we approach this.
Note: this involves the Channel keeping funds for orders placed for a longer period of time than the usual payment processing period. Channel will need to consult tax and legal professionals to ensure they are in compliance with applicable laws.
-
-
Scenario 2: 2 credit card processing fees (like scenario 2 above)
-
- Same as above. The difference is, it’s your payment stack, so you can determine if you want to have some sort of other payment rules with the Merchant.
Violet has a solution for this use-case on our product roadmap. Follow our Changelog for updates on this feature.
How should I use Stripe Test Mode?
In Stripe test mode, you can go through the KYC flow by just clicking on “Use Test Document” / “Use Test Account” etc. as shown in the screenshot he sent. No data will transfer over when moving from test to live. KYC will have to be completed from scratch
When you’re in “test” mode, the Stripe account you create is also a test account. This is so that you can test the full end-to-end checkout flow before any transactions are places in production. Orders placed in sandbox using test credit cards will have money flow through to the fake Stripe account. Stripe requires that you still put in real addresses though, but does not do verification, so addresses of famous landmarks are easy test addresses.
Once you have “live mode” enabled, the Stripe account you connect will be your real stripe account. Your commission from orders placed in production will flow into this account once it has been set up and orders are placed.
Both accounts live simultaneously — to switch between the two, all you need to do is flip between live and test mode from the toggle in the channel dashboard. See Environments for more details.
How can we change commission rates?
See here for details on changing commission rates.
When is a Customer card charged?
Authorization (Hold) vs Capture
Stripe supports both authorizing funds on a card, often referred to as a hold, and actually capturing those funds, or charging the card. Many businesses use these distinctions in their workflows since they often need to happen at different moments in time. Think of a hotel authorizing a card for incidentals and charging (capturing) the funds at checkout.
How Violet uses Authorization and Capture (Stripe V2)
Violet uses these two concepts for a similar purpose as a hotel or rental agency, just on a much smaller timescale. Violet authorizes the payment of a cart first, then completes the order write back to the merchant or merchants’ ecommerce platform and only after all bags have been successfully written does Violet capture funds. This means that we can validate funds exist and check for fraud before creating orders in the merchant’s system, while at the same time, not actually charging a customer in the event there is an error during write back. In the event that an error does occur, the hold will expire and drop off the customer’s bank statement with 7 days, per standard Stripe processes. All three of these actions take place, one after another when an order is submitted to Violet, i.e. during the final call in checkout. Thus the time frame between authorization and capture can potentially be just milliseconds.
Stripe V3 and Wallet (ApplePay)
In Stripe V3 and ApplePay as well as wallets, one of the key differences is that the browser makes a call directly to Stripe with the entered credit card information to authorize funds. This means that when this payment flow is used, on cart submit, Violet skips the authorize call and instead validates that authorization succeeded before continuing on like normal to write back the order and capture funds. Note that this should have no overall impact on the shopper since in this flow they are still not actually charged until write back is complete, and if there is any error during submit or at any point after authorize, the hold will still expire and drop off their bank statement, same as above.
How does a merchant get paid?
This depends on the payment/payouts method you select. If using Violet, the funds will be process via Stripe and pay the Merchant directly to their Stripe Connect account. If using external payments, you will need to handle the payouts to merchants yourself.
How often do merchants get paid out?
Merchants that have properly set up payout accounts and gone through Stripe KYC automatically get paid out on a 2-day rolling basis. Violet transfers these funds to their Stripe account at point of sale and then Stripe processes a bulk transfer to their connected payout account.
Violet transfers will be transitioning to batched transfers in the future.
How do chargebacks work?
The money goes back to the Shopper, and the money is retrieved from each party. Whoever got their cut, loses their cut. If using Violet’s payment tools, whatever Violet gets charged, we pass on to the channel and invoice at the end of the month. Any penalties incurred for the chargeback will be paid for by the Channel. If a channel is using their own payment tools, they’d pay for the charges they incur.
How does commission work & how is the commission calculated?
We calculate the commission based on the Subtotal.
- When a order is submitted, Violet takes into account Stripe fees, tax, shipping and the commission rate associated with any merchants involved before transferring any funds. Violet then charges the customer the full amount, calculates what needs to be sent to each party and uses Stripe to transfer the final amount. This is all automated. Both you and the merchant can visit your own Stripe Express dashboards where you can see the total amounts being transferred to you after each transaction.
- Note that Stripe fees are deducted from the Channel’s commission, not the Merchant’s payout. This will be transparent to the Merchant.
- For example: A Merchant sees a $100 order in the order view on the merchant dashboard, the subtotal is $90 ($10 in shipping and taxes), they have a 10% commission configured in their dashboard with the channel, then they would see a $91 payout in Stripe. 100 - (90 * 0.1) = 91
How does a channel do payment bypassing?
You can enable payment bypassing by reaching out to us on support@violet.io. When payment bypassing is enabled for an application, the application becomes exempt from all order payment requirements and no longer applies a payment method to a cart. The channel assumes all responsibility for facilitating payments between the shopper and the merchant.
Considerations:
- This feature is immediately available from Violet. Once a channel opts in and is approved the change will generally go into effect within one business day.
- The channel must subscribe to the
ORDER_CANCELED
,ORDER_REFUNDED
, andORDER_RETURNED
webhooks, or the catchallORDER_UPDATED
webhook. This is to ensure that channels can facilitate a refund back to the shopper when necessary. Channel Level of Effort - The channel is fully responsible for their own payment stack.
This is intended Channels who have a complete payment solution and are able to fully manage transactions between shoppers and merchants.
See External Payments for more information
How are payments processed considering the fact that Shopify requires the use of their payment stack?
Currently, all payments for orders placed through Violet are processed outside of the commerce platforms. We use Stripe today for this functionality. During onboarding a merchant will connect their payout account. When an order is placed, their portion will be transferred into their account.
This approach allows us to support a wider range of commerce platforms, as many do not allow for payments to be sent through their API.
Shopify does have this requirement for developers who utilize the Sales Channel SDK. If you are going to use the Sales Channel SDK, you will need to handle payment processing and payouts.
We also support the use of the Draft Orders API, which provides similar functionality to the Sales Channel SDK, but without the on-site payments requirement. This is the most common scenario we see.
Using the Draft Orders API allows you the flexibility to choose whether you’d like to use Violet Payouts or not.
Can we connect to Existing Stripe Accounts?
Yes! See here for more info.
How does /v1/checkout/cart/{cart_id}/payment/update
work?
We take the current state of the cart (total price including shipping, etc) and updates the cart’s intent with the correct value in stripe. This is done for you automatically when call this method.
The good news is that this should be done automatically when you apply a shipping method to the cart, so ideally you don’t have to do call this endpoint in most cases.
You can learn more about this endpoint in our API Reference.
How does Violet and Stripe calculate and collect sales tax?
Violet only uses Stripe to power payment processing not any calculation on the total or the sales tax. Violet uses the merchant’s ecommerce platform to calculate shipping and sales tax. That means that those values will be calculated just as if the shopper had placed a “native” order on the merchant’s website. In addition, the order will appear in their system, again as if it were a native order. This means that all configured sales tax rules will be honored, and any reporting or remediation will function the same way it already does for their “native” orders. The merchant will not have to do any additional reporting work around sales tax for Violet orders.
How do we attach a payment method to a payment intent created by Violet via the Stripe API?
During Checkout, Violet creates a payment intent that payment methods can directly be attached to using Stripe.js Elements. If you don’t want to use Stripe elements, you can do the following:
-
Create an Order with the
wallet_based_checkout
flag as True. This will create a payment intent for this Order. You will need the following:payment_intent_client_secret
from this Order, as described in https://docs.violet.io/checkout/guides/violet-checkout-with-apple-pay
-
Create a Payment Method Token using the Stripe Tokens API and the Violet publishable key (attached to the Order). This is the same key that is used to render Stripe.js elements and is shared across environment.
For Sandbox, you can use this publishable Key:
pk_test_UHg8oLvg4rrDCbvtqfwTE8qd
For Prod the publishable key is returned on the Order. You can also reach out to us to receive this key. It doesn’t change between orders, so once you have it, you can store it in your system.
-
//Sample Request curl https://api.stripe.com/v1/tokens \ -u "pk_test_UHg8oLvg4rrDCbvtqfwTE8qd:" \ -d "card[number]"=4242424242424242 \ -d "card[exp_month]"=5 \ -d "card[exp_year]"=2024 \ -d "card[cvc]"=314 //Sample Response { "id": "tok_1P5xBbK29KDiBVldTV3aOPD1", "object": "token", "card": { "id": "card_1P5xBaK29KDiBVldlvLNToEu", "object": "card", "address_city": null, "address_country": null, "address_line1": null, "address_line1_check": null, "address_line2": null, "address_state": null, "address_zip": null, "address_zip_check": null, "brand": "Visa", "country": "US", "cvc_check": "unchecked", "dynamic_last4": null, "exp_month": 5, "exp_year": 2024, "funding": "credit", "last4": "4242", "name": null, "networks": { "preferred": null }, "tokenization_method": null, "wallet": null }, "client_ip": "38.95.108.171", "created": 1713216935, "livemode": false, "type": "card", "used": false }
-
-
Once you have a card token, you can attach it to the payment intent using the payment intent client secret, and the following call to Stripe
-
Confirm a Payment Intent
curl -X POST https://api.stripe.com/v1/payment_intents/pi_3P5wz4K29KDiBVld1501YdpV/confirm\?client_secret\=pi_3P5wz4K29KDiBVld1501YdpV_secret_FFwDnQu8SCEli0LXr3UcNu59C \ -d "payment_method_data[card][token]"=tok_1P5xAyK29KDiBVldtwdmEo8u \ -d "payment_method_data[type]"="card" \ -d 'key'='pk_test_UHg8oLvg4rrDCbvtqfwTE8qd' { "id": "pi_3P5wz4K29KDiBVld1501YdpV", "object": "payment_intent", "amount": 2000, "amount_details": { "tip": {} }, "automatic_payment_methods": { "allow_redirects": "always", "enabled": true }, "canceled_at": null, "cancellation_reason": null, "capture_method": "automatic", "client_secret": "pi_3P5wz4K29KDiBVld1501YdpV_secret_FFwDnQu8SCEli0LXr3UcNu59C", "confirmation_method": "automatic", "created": 1713216158, "currency": "usd", "description": "(created by Stripe Shell)", "last_payment_error": null, "livemode": false, "next_action": null, "payment_method": "pm_1P5xCaK29KDiBVld1RujwHyT", "payment_method_configuration_details": { "id": "pmc_1P5wlCK29KDiBVldMlKNrqmn", "parent": null }, "payment_method_types": [ "card" ], "processing": null, "receipt_email": null, "secret_key_confirmation": "optional", "setup_future_usage": null, "shipping": null, "source": null, "status": "succeeded" }
This will both attach the payment method to the payment intent, and authorize the Violet payment intent for capture. This is similar to the shopper inputting their Credit Card details or using Apple Pay through Stripe.js Elements.
-
-
You can now submit the Violet cart to capture the funds from the payment method that was attached to the payment intent.
- Can we support a different payment provider?
- How are refunds handled?
- How are refunds initiated?
- How are orders cancelled?
- How often does Violet perform reconciliation to ensure order parity?
- How does Violet handle multi merchant checkout with differing Payment Service Providers (PSPs)?
- What should we do if there’s a non-US merchant trying to connect a USD bank account?
- If we are using our own payment process, why does Violet still require billing address?
- Can I issue store credit to a Shopper?
- How should I use Stripe Test Mode?
- How can we change commission rates?
- When is a Customer card charged?
- How does a merchant get paid?
- How often do merchants get paid out?
- How do chargebacks work?
- How does commission work & how is the commission calculated?
- How does a channel do payment bypassing?
- How are payments processed considering the fact that Shopify requires the use of their payment stack?
- Can we connect to Existing Stripe Accounts?
- How does /v1/checkout/cart/{cart_id}/payment/update work?
- How does Violet and Stripe calculate and collect sales tax?
- How do we attach a payment method to a payment intent created by Violet via the Stripe API?