Bug Bounty Course -- Day 35 of 60
58%

Business Logic Vulnerabilities Bug Bounty 2026 — Price Manipulation, Coupon Abuse and Workflow Bypass | Bug Bounty Course Day 35 of 60

Business Logic Vulnerabilities Bug Bounty 2026 — Price Manipulation, Coupon Abuse and Workflow Bypass | Bug Bounty Course Day 35 of 60
✨ AI Summary
💰 BUG BOUNTY HUNTER
FREE

Part of the Bug Bounty 60-Day Course

Business Logic Vulnerabilities – Day 35 of 60 · 58% complete

When I test an application, I don’t begin by throwing strange characters at every input. I first learn what the product is meant to do. Can a free user upgrade to Pro? Should a discount work once? Must an order be paid before it is marked complete? Those ordinary product rules are the real attack surface in business logic testing. The requests can be perfectly well-formed: a price of 0.01 is a valid decimal, and a quantity of -1 is a valid integer. The weakness appears when the server accepts a value or a sequence of actions that violates the application’s own rules.

Automated scanners are useful for many vulnerability classes, but they usually don’t understand the commercial intent behind a workflow. They can flag suspicious input patterns; they cannot reliably decide whether a user should be allowed to apply a coupon twice or activate a paid feature before payment. I need to understand the expected behaviour, map the requests that enforce it, and then check whether the server—not just the browser—actually enforces it. That is why careful manual reasoning matters so much here.

🎯 What you’ll master in Day 35

Map business flows to identify manipulation targets
Manipulate price and quantity parameters in checkout flows
Test coupon abuse — multi-use, cross-account, and stacking
Bypass multi-step workflow restrictions
Use negative quantities and boundary conditions for credit injection
Write a business logic report with quantified financial impact

⏱ ~30 min read · 3 hands-on exercises · Burp Suite + PortSwigger Academy

Before you start you’ll want: Burp Suite from Day 5 intercepting HTTP traffic, familiarity with Burp Repeater to replay and modify requests, and an understanding of how e-commerce checkout flows work. All three exercises use the PortSwigger Web Security Academy business logic labs, which are free to access.

What business logic vulnerabilities are and why they’re hard to find

When I explain a business logic vulnerability, I describe it as a gap between what an application is supposed to allow and what its server actually permits. SQL injection and cross-site scripting often involve input being interpreted in an unintended way. A business logic flaw can be much quieter: every field may have the right data type, the request may pass validation, and the response may look normal. The problem is that the application has accepted an action that breaks a rule of the product—for example, using a one-time discount twice or activating a subscription without a confirmed payment.

Here is the distinction I want you to remember. Input validation asks, ‘Is this value well-formed?’ Business-rule validation asks, ‘Is this user allowed to perform this action, with this value, at this point in the workflow?’ A price such as 0.01 is syntactically valid. It is still wrong if the catalogue price is $299.99 and the server has no legitimate reason to accept the lower amount. The server must derive sensitive values from trusted records and verify the user’s state before changing anything important.

This is also why I don’t promise that every business logic finding is automatically High or Critical. Severity depends on what an attacker can actually achieve, which accounts are affected, whether exploitation is repeatable, and the real financial or functional impact. A reproducible unauthorised discount may be Medium; a reliable way to obtain paid functionality without payment can be much more serious. In a report, I show evidence and let the programme’s impact model determine the final rating.

Automated scanners can’t find these because they have no model of what the application is “supposed” to do. A scanner testing for SQL injection knows that ' OR '1'='1 is unexpected input. It has no way to know that price=0.01 is unexpected input in a checkout request, because that’s a valid number — the rule that it should equal the catalog price exists only in the developer’s intent.

What makes business logic findings high-value for bug bounty is that they’re often directly quantifiable financial impact. “An attacker can purchase any item for $0.01” is a business impact that programme managers and developers understand immediately. The severity floors at High on most programmes when the financial impact is real.

🧠 EXERCISE 1 — THINK LIKE A HACKER (10 MIN · NO TOOLS)

Before I open Burp, I want you to reason about the rules. Read each scenario and write down the expected server-side check, the request you would inspect in the authorised lab, and the evidence that would prove the rule was not enforced.

  1. An e-commerce checkout sends this request when you click “Place Order”:
    POST /checkout
    {"cart_id": "abc123", "items": [{"product_id": "P001", "quantity": 1,
    "price": 29.99}], "total": 29.99}

    What two modifications would you try first, and why? What would you expect to happen if each one works?
  2. A SaaS platform shows a “Upgrade to Pro” button. When you click it, the flow is: (1) choose plan, (2) enter payment card, (3) payment processed, (4) pro features activated. How would you test whether step 4 can be reached without completing step 3? What would the HTTP request look like for step 4, and how would you replay it?
  3. A food delivery app allows a “first order free” promo code. The code applies a 100% discount to your first order. After using it on one order, you try it again and get an error “code already used.” What are three different ways this restriction could be bypassed?
✅ What I want you to take away: start with the rule, identify the parameter or state transition that enforces it, and test one assumption at a time. Price, payment state, and coupon eligibility should be derived or verified by the server. Account variations are useful only when the lab or programme authorises them; don’t create throwaway accounts to evade a real service’s promotion rules.
📸 Write your answers for #day-35-business-logic before continuing.

Mapping application flows

I start business logic testing by drawing the application’s journeys before changing a single parameter. Turn on Burp Proxy, use the application normally, and record each meaningful action: creating a cart, applying a discount, checking out, upgrading a plan, claiming a reward, or activating a trial. For each journey, note the request that changes state and the response that confirms the change. This gives me a baseline of what a normal user can do.

Next, I mark the values that influence business decisions. These might include product_id, quantity, coupon_code, plan_id, account_id, payment_status, or a referral identifier. A parameter is not vulnerable simply because it appears in a request. It becomes interesting when the server appears to trust a client-controlled value that should instead be checked against a server-side record. I compare the request with the UI, the response, and—where the lab exposes it—the resulting account or order state.

I keep a small flow notebook: action, endpoint, important parameters, expected state change, and evidence. That simple habit stops me from replaying requests blindly. It also helps me spot dependencies: perhaps the confirmation endpoint only works after a payment intent is marked successful, or perhaps a coupon’s usage count changes only after an order is finalised. When I understand those dependencies, I can design a focused test instead of guessing.

BUSINESS FLOW MAPPING — WHAT TO CAPTURE IN BURP
# Walk through each flow with Burp Proxy enabled and note:
# 1. CHECKOUT FLOW
– Which request carries price or total?
– Is price in the request body or only in a server-side session?
– Is quantity in the request or only in the cart ID?
– What request completes the order? Can it be replayed?
# 2. DISCOUNT/COUPON FLOW
– What request applies the coupon? What parameters does it send?
– Is the discount amount in the follow-up request?
– Is the usage count checked at application or at coupon creation?
# 3. ACCOUNT UPGRADE FLOW
– What request activates the premium features?
– Does the payment confirmation trigger the activation, or does a separate request?
– Can the activation request be sent without a valid payment token?
# 4. REFERRAL/REWARD FLOW
– Can you refer yourself (self-referral)?
– Can the referral bonus be claimed multiple times?

Price manipulation and parameter tampering

Price manipulation is the clearest example of trusting the wrong source of truth. Imagine the browser sends a product ID, quantity, unit price, and total. If the server calculates the charge using the submitted price, a user may be able to alter the amount. The secure design is different: the client sends the product identifier and requested quantity; the server retrieves the current price from its own catalogue, checks availability and eligibility, calculates tax and discounts, and creates the payable amount itself. A payment provider should receive that server-calculated amount—not a number the browser gets to choose.

In a permitted training lab, I capture the checkout request in Burp and compare the original request with the lab’s expected result. I change one field at a time so I can identify which control is missing. If I alter a price and the lab confirms an order at the altered amount, I have evidence that the server trusted client-side pricing. I do not use this technique against a live merchant or complete a real underpriced purchase. On an authorised programme, I follow its rules and use a sandbox or an explicitly approved test account; if a test order is created, I stop and coordinate cancellation or reversal as required.

I also inspect the response and resulting state rather than treating an HTTP 200 as proof. A response might accept the request but later recalculate the total, reject payment, or mark the order as pending. The finding is confirmed only when the protected business outcome actually changes in the unauthorised way. I preserve the original and modified requests, redact secrets, and record the expected catalogue price alongside the observed lab result.

PRICE MANIPULATION TESTING — BURP REPEATER
# STEP 1: Add item to cart and proceed to checkout
# Intercept the final checkout/order submission request in Burp
# Original request
POST /api/checkout HTTP/1.1
Content-Type: application/json
{“items”:[{“id”:”PROD-123″,”qty”:1,”price”:299.99}],”total”:299.99}
# STEP 2: Modify price to $0.01 — send in Repeater
{“items”:[{“id”:”PROD-123″,”qty”:1,”price”:0.01}],”total”:0.01}
# STEP 3: Try negative price (may apply as a credit)
{“items”:[{“id”:”PROD-123″,”qty”:1,”price”:-299.99}],”total”:-299.99}
# STEP 4: Keep quantity at 1 but add a second item at price=0
{“items”:[{“id”:”PROD-123″,”qty”:1,”price”:299.99},{“id”:”PROD-456″,”qty”:1,”price”:0}]}
# CONFIRMATION OF VULNERABILITY: order confirmation with manipulated price
# Response: {“order_id”:”ORD-7891″,”status”:”confirmed”,”total_charged”:0.01}
# IMMEDIATELY: cancel the test order before any goods are shipped
💡 My next check is quantity: when the lab has already shown that price is calculated server-side, I still inspect quantity boundaries. The server should reject negative, zero, fractional (where unsupported), and excessive quantities before calculating a total. A negative line item in a lab can reveal a missing validation rule, but never test this by placing a manipulated order with a real merchant.

Coupon and discount abuse

I treat a coupon as a small state machine, not just a text field. A promotion may be limited to one use per account, one use per customer, one use per order, a particular product category, a date range, or a minimum spend. Those restrictions are separate rules, and I test them separately in a lab. First I learn the intended rule from the interface or programme description; then I observe when the server records the coupon as consumed.

For example, replaying an apply-coupon request may reveal whether the same discount is added repeatedly to one cart. Testing a second authorised test account can reveal whether a supposedly global single-use code is actually scoped only to the first account. Case and whitespace variations can reveal inconsistent normalisation, while submitting two codes can test whether stacking rules are enforced on the server. I change one condition at a time and check the final order calculation, not merely the message displayed beside the coupon field.

There is an important distinction between a logic flaw and a race condition. If two simultaneous requests both redeem a one-time coupon because the usage check and update are not atomic, that is a concurrency problem as well as a business-rule failure. We cover race conditions on Day 36. For today’s tests, keep requests sequential unless the lab specifically asks you to investigate concurrency; that makes the result easier to understand and reproduce.

COUPON ABUSE TEST CASES
# TEST 1: Replay the discount request multiple times on the same cart
POST /api/apply-coupon
{“cart_id”:”CART-123″,”code”:”SAVE20″}
# Replay in Burp Repeater 3-5 times
# Check if total decreases by 20% each time (cumulative discount = 100%)
# TEST 2: Use a “single-use” code from Account A on Account B
# Apply code on Account A, complete checkout
# Apply same code on Account B — if accepted, code is not truly single-use globally
# TEST 3: Case and encoding variations on “used” code
{“code”:”SAVE20″} # Used, rejected
{“code”:”save20″} # Lowercase — does backend normalize?
{“code”:”SAVE%2020″} # URL encoded space
{“code”:” SAVE20″} # Leading space — is it trimmed or treated as new code?
# TEST 4: Apply multiple discount codes simultaneously
{“cart_id”:”CART-123″,”codes”:[“SAVE20″,”WELCOME10″,”NEWUSER15”]}
# Or: submit code parameter multiple times in the same request
# TEST 5: Self-referral (refer yourself for referral bonus)
# Sign up with referral link from your own account
# Check if referral bonus applied to both referrer and referee = same account

Workflow bypass

A workflow bypass happens when the server lets a user reach a later state without satisfying the conditions that should come first. The browser may display four screens—choose a plan, enter payment details, process payment, activate the plan—but the browser’s order is not a security boundary. Every state-changing endpoint must independently verify that the required earlier state exists and belongs to the same user, cart, and transaction.

My method is to complete the normal flow once in a lab and label the requests in Burp Proxy history. I identify which request performs the final state change and what proof of payment or authorisation it carries. Then I reset the lab or start a fresh test transaction and check whether the final endpoint rejects an incomplete flow. A secure endpoint should verify a server-side payment record or signed provider confirmation; it should not trust a client-supplied payment_status=success value or the fact that someone visited a success URL.

I pay close attention to transaction binding. A valid payment for cart A must not authorise cart B, and a confirmation token from one account must not activate another account’s subscription. I also check whether the final action is idempotent: replaying a legitimate completion request should not create duplicate orders, credits, or entitlements. In a real programme, I use only the approved test environment and never attempt to obtain goods, services, or premium access without payment.

WORKFLOW BYPASS — TESTING STEP SKIP
# STEP 1: Complete the flow once legitimately and capture ALL requests in Burp
# Label each step clearly in Burp Proxy history
# Identify the step sequence:
Step 1: POST /checkout/cart-review
Step 2: POST /checkout/payment-info
Step 3: POST /checkout/process-payment
Step 4: POST /checkout/complete (activates order)
# STEP 2: Start a new session (new cart)
# Complete Step 1 and Step 2 (choose plan, enter payment info)
# SKIP Step 3 (payment processing)
# Replay Step 4 directly from Burp Repeater, updating session/cart tokens
# CONFIRMATION: order marked as complete without payment processed
# Response from Step 4: {“order_id”:”ORD-XYZ”,”status”:”complete”,”paid”:false}
# Also test: can you change order state via URL manipulation?
GET /checkout/success?order_id=ORD-XYZ&payment_status=success
# Does accessing the success URL directly activate the order?

Negative quantities and boundary conditions

Quantity handling deserves its own pass even when the application calculates prices on the server. The server should enforce a sensible integer range, reject zero or negative quantities where they make no business sense, check stock, and calculate the total using safe numeric types. If it simply multiplies a trusted price by an unchecked quantity, unexpected values can produce incorrect totals or inconsistent inventory changes.

I test boundaries methodically in the lab: the minimum allowed quantity, zero, a negative value, the maximum permitted quantity, a value just above that maximum, and—where the application accepts decimals—a fractional value. I also look for integer overflow or precision errors in the calculation path. The expected result is not always a particular error message; the important requirement is that the server rejects invalid quantities and leaves the cart, inventory, payment state, and account balance unchanged.

Be careful with the phrase ‘negative quantity bug’. A negative number in a request is only a test input, not proof of a vulnerability. Modern systems may reject it at schema validation, clamp it, or recalculate from trusted cart data. I confirm the issue only when the application produces an unauthorised financial or inventory state change. Never use a live order to see whether a negative total results in a credit.

NEGATIVE QUANTITY AND BOUNDARY TESTING
# TEST 1: Negative quantity on a cheap item to offset an expensive item
{“items”:[
{“id”:”EXPENSIVE-PROD”,”qty”:1,”price”:299.99},
{“id”:”CHEAP-PROD”,”qty”:-300,”price”:1.00}
]}
# Expected vulnerable total: 299.99 + (-300 × 1.00) = -$0.01
# Or floor at 0 → $0 total
# TEST 2: Integer overflow / large quantities
{“items”:[{“id”:”PROD-123″,”qty”:9999999999,”price”:0.01}]}
# Does qty × price overflow to a negative number or 0?
# TEST 3: Fractional quantity (if the field accepts decimals)
{“items”:[{“id”:”PROD-123″,”qty”:0.001,”price”:299.99}]}
# Total = 299.99 × 0.001 = $0.30 for a $299.99 item
# TEST 4: Zero quantity (get item at no charge)
{“items”:[{“id”:”PROD-123″,”qty”:0,”price”:299.99}]}
# Does the server allow an order with qty=0? Does it still ship?

⚡ EXERCISE 2 — BURP LAB (25 MIN)

I use these PortSwigger Web Security Academy exercises because they provide an isolated environment where you can safely observe the failure and learn how to prove it. Follow the lab instructions and keep the testing inside the lab instance.

  1. Open the PortSwigger Lab: Excessive trust in client-side controls. Use Burp to intercept the checkout request. Modify the price of a jacket to $1 and confirm the order goes through at the manipulated price. Work only in the PortSwigger lab instance; record the original and modified request and the lab response.
  2. Try the Flawed enforcement of business rules lab. The lab has two discount codes that can’t both be applied at the same time. Find the bypass that allows both to be applied repeatedly. Explain which discount rule is incomplete and capture the final lab total as evidence.
  3. Try the Low-level logic flaw lab. Use an integer overflow in the quantity field to bring the total below $0 and purchase a jacket for free. Keep this inside the lab and note how the application handles the boundary value.
✅ What I want you to notice: the three labs demonstrate different failures: trusting a client-side control, enforcing a business rule incompletely, and mishandling low-level numeric values. Don’t memorise only the payload. Explain which rule the application intended to enforce, which server-side check was missing, and what evidence proves the lab reached the unintended state.
📸 Screenshot of the $1 checkout confirmation for #day-35-business-logic.

Writing the report that pays

A strong business logic report tells a reviewer exactly which rule failed and how I proved it. I open with the intended behaviour, then describe the observed behaviour, and finally quantify the impact using evidence from the authorised lab or test environment. Avoid vague claims such as ‘checkout can be hacked’. State which endpoint accepted which unauthorised value, what the server returned, and what persisted afterwards.

I keep the reproduction sequence short and deterministic. Include the account role, test object, starting state, exact request fields changed, response, and final state. Attach a before-and-after comparison and redact session cookies, payment details, personal data, and other secrets. If the test created an order or entitlement, explain how it was safely cancelled or reset. A reviewer should be able to reproduce the behaviour without guessing what you clicked.

For impact, calculate the loss per affected transaction only when the evidence supports it. Do not multiply a single lab result across an entire catalogue and call that a confirmed loss. You can describe potential scale as a clearly labelled estimate, but distinguish it from observed impact. Severity should reflect realistic exploitability, prerequisites, affected users, and business consequences—not an inflated headline. Finish with a remediation that addresses the root cause: server-side price lookup, atomic coupon redemption, explicit workflow-state checks, transaction binding, and safe numeric validation.

BUG BOUNTY REPORT TEMPLATE — PRICE MANIPULATION
Title: Lab demonstration — checkout accepted a client-modified price

Severity: Assess according to the authorised programme’s policy and demonstrated impact; do not copy a severity score from a template.
Affected Endpoint: Use the exact endpoint from your PortSwigger lab or authorised test environment.

Summary: In the isolated lab, the checkout flow accepted a price supplied by the client instead of deriving the amount from trusted server-side product data. This allowed the lab transaction to complete with a modified total.

Steps to Reproduce:
1. Start from the lab’s documented initial state.
2. Add the lab product to the cart and intercept the checkout request in Burp.
3. Record the original product identifier, quantity, and price fields.
4. Modify only the price field as instructed by the lab and forward the request.
5. Record the response and verify the resulting state in the lab interface.
[Attach: redacted original request, modified request, response, and lab-state evidence]

Impact: Describe only the impact demonstrated in the lab. For a real authorised programme, quantify potential exposure only when the scope and evidence support the estimate. Do not place or complete a real underpriced order.

Remediation: Treat the server-side product catalogue as the source of truth. Accept product identifiers and permitted quantities from the client, retrieve prices on the server, calculate discounts and totals server-side, and bind the payment confirmation to the exact cart and transaction.

⚡ EXERCISE 3 — WRITE THE REPORT (15 MIN)

Convert your PortSwigger lab finding into a full report:

  1. Write the price manipulation report using the PortSwigger lab as your finding. Use the actual endpoint, the actual request you modified, and the actual response. The PoC must be reproducible by the reviewer in under two minutes.
  2. Write the coupon bypass report separately for the alternating-code lab. Explain why the technical control (“can’t use two codes at once”) failed to enforce the business intent (“each code is single-use per session”). This is the kind of nuanced explanation that separates a hunter who understands the class from one who just found it by clicking.
  3. Rate both vulnerabilities. For the price manipulation: should it be High or Critical? For the coupon bypass: what financial damage per exploitation justifies the severity you assign? Defend your ratings.
✅ What you just learned: business logic reports require clear before/after states: what the application should do, what it actually does, and what the financial damage is per exploitation. Triage loves these findings because the impact is immediately obvious to non-technical stakeholders. A report with “you can buy a $299 item for $0.01” needs no security expertise to understand why it’s serious.
📸 Share your price manipulation PoC request for #day-35-business-logic.

💰 Quick check: a checkout endpoint validates that quantity is a positive integer and price matches the catalog exactly. The only user-controlled fields are product_id and quantity. What business logic test should you still try?




📋 Day 35 reference card

Modify “price”:299.99 → “price”:0.01Basic price manipulation test — does the server use the client-supplied price?
“qty”:-300 on a $1 itemNegative quantity to offset cart total — price × negative qty = negative line item
Replay coupon request 3–5× on same cartCoupon stacking test — does each replay apply another discount?
Skip payment step, replay confirmationWorkflow bypass — does the activation step verify payment was processed?
qty=9999999999 at price=0.01Integer overflow test — large qty × small price may overflow to 0 or negative
Coupon on Account B after using on Account ACross-account coupon scope test — is the single-use restriction per-account or global?
Total = catalog_price × -1 as creditNegative price test — applies as a store credit if flooring not enforced

✅ Mark Day 35 complete

By the end of this lesson, you should be able to map an e-commerce or SaaS workflow, identify the business rules behind price, quantity, coupons and payment state, test those rules safely in a lab, and write a report that separates observed evidence from estimated impact.

Tomorrow — Day 36: Race conditions — TOCTOU, concurrent requests, and the gift card double-spend that every programme has open somewhere.

❓ Frequently asked questions

Why can’t automated scanners find business logic vulnerabilities?
I don’t expect a scanner to understand every product rule. Most scanners look for known input patterns and response signatures. Business logic flaws often use ordinary values in an invalid context: a valid decimal price that does not match the catalogue, or a valid request sent before payment is complete. The tester has to learn the intended workflow and check whether the server enforces it.
What is the most common business logic finding in e-commerce?
A common pattern is trusting a price or discount value supplied by the browser. The secure implementation retrieves the product price and promotion rules from trusted server-side data, validates eligibility, and calculates the final amount on the server. The exact prevalence varies by technology and programme, so I avoid calling one pattern universally the most common.
What severity do business logic vulnerabilities get?
There is no fixed severity for the entire category. I assess the demonstrated financial or functional impact, prerequisites, affected users, repeatability, and programme policy. Unauthorised access to paid functionality may be more serious than a small, one-time discount. The report should justify the impact with reproducible evidence.
How do I test for workflow bypass?
In an authorised lab, I complete the normal flow once, label the requests, and identify the endpoint that performs the final state change. I then reset the lab or start a fresh test transaction and check whether that endpoint independently verifies the required earlier state. A secure server should verify a trusted payment record tied to the same user and transaction; a success URL or client-supplied status flag is not proof of payment.
Is it okay to test price manipulation on a real order?
Do not test this by completing a manipulated purchase on a real merchant. Use PortSwigger Academy, your own application, a payment sandbox, or a programme-approved test environment. Follow the programme’s rules, avoid receiving goods or premium access, and stop once you have sufficient evidence. If an authorised test creates an order, coordinate its cancellation or reset with the programme.
Can I find business logic bugs on SaaS platforms, not just e-commerce?
Yes. SaaS products have plan upgrades, free trials, seat limits, storage quotas, API usage limits, referral credits, and entitlement activation. I use the same method: identify the intended rule, map the state transition, and verify that the server checks the user’s entitlement before granting the action. Test only within an approved scope or a lab.
← Previous
Day 34: GraphQL Vulnerabilities
Next →
Day 36: Race Conditions

📚 Further reading

ME
Mr Elite
The lesson I want you to remember is that a workflow can look perfectly secure in the browser while the server is missing one critical check. When I review a flow, I ask three questions: what state should the user be in, what evidence proves that state, and does the next endpoint verify that evidence itself? A plan-selection request is not proof of payment. A success page is not proof that an order was paid. A coupon appearing in the cart is not proof that it was eligible or consumed only once. Draw the sequence, capture the requests, and test the assumptions in an isolated lab. The strongest business logic reports are rarely the ones with the most complicated payloads; they are the ones that explain one broken rule clearly and prove the resulting impact without causing real-world harm.

⚡
Join free to earn XP for reading this article Track your progress, build streaks and compete on the leaderboard.
Join Free
Lokesh N. Singh aka Mr Elite
Lokesh N. Singh aka Mr Elite
Founder, Securityelites · AI Red Team Educator
Founder of Securityelites and creator of the SE-ARTCP credential. Working penetration tester focused on AI red team, prompt injection research, and LLM security education.
About Lokesh ->

Leave a Comment

Your email address will not be published. Required fields are marked *