Black Friday Home Page - Keep Nature Wild

What are you looking for?

UP TO 70% OFF SITEWIDE

Together we pick up one pound of trash for every product sold.

770,874
pounds picked up to date

770,874
pounds picked up to date

Black Friday Site Wide Deals

60-70% Off Doorcrasher Specials

60-70% Off

DOORCRASHER SPECIALS

DOORCRASHER SPECIALS

50% Off Tees, Tanks, + Crop Tops

50% Off

TEES, TANKS + CROP TOPS

TEES, TANKS + CROP TOPS

40% Off Headwear + Long Sleeve Tees

40% Off

HEADWEAR + LONG SLEEVE TEES

HEADWEAR + LONG SLEEVE TEES

30% Off Fanny Packs + More

30% Off

PULLOVERS, FANNY PACKS + MORE

PULLOVERS, FANNY PACKS + MORE

Black Friday Deals

60-70% Off Doorcrasher Specials

60-70% Off

DOORCRASHER SPECIALS

DOORCRASHER SPECIALS

50% Off Tees, Tanks, + Crop Tops

50% Off

TEES, TANKS + CROP TOPS

TEES, TANKS + CROP TOPS

40% Off Headwear + Long Sleeve Tees

40% Off

HEADWEAR + LONG SLEEVE TEES

HEADWEAR + LONG SLEEVE TEES

30% Off Fanny Packs + More

30% Off

PULLOVERS, FANNY PACKS + MORE

PULLOVERS, FANNY PACKS + MORE

Shop by Price

Gifts Under $75

Under $75

Gifts Under $50

Under $50

Under $30

Gifts Under $15

Under $15

KNW Classics - All on Sale!

The best deals of the year on our bestselling goods.

Sold out
Sold out
Sold out
Sold out
Sold out
Sold out

The KNW Gear Box

✓ We did the shopping for you!

✓ Features 6 KNW favorites

$45 Off (33% discount)

✓ One size fits all - for you or a friend

✓ 1 Gear Box = 5 pounds of trash removed

The KNW Gear Box

✓ We did the shopping for you!

✓ Features 6 KNW favorites

$45 Off (33% discount)

✓ One size fits all - for you or a friend

✓ 1 Gear Box = 5 pounds of trash removed

New Arrivals - 30-50% OFF

Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
SHOP ALL NEW ARRIVALS

5000+ Wild Reviews

I love all my stickers from here!

"All my stickers from Keep Nature Wild have always been beautiful and hold up to wear and tear!"

 

Alyssa S (May 2022)

Great hat!

"Love it, and it fits my small head. Love the mission of the company. Always nice to have both in a purchase."

 

Amanda (Aug 2022)

Perfect for our Disney vacation

"I love this bag! It is perfectly roomy, but not bulky. I love that you can wear it crossbody or as a traditional fanny pack."

 

Stephanie S. (Aug 2022)

I love all my stickers from here!

"All my stickers from Keep Nature Wild have always been beautiful and hold up to wear and tear!"

- Alyssa S (May 2022)

Great hat!

"Love it, and it fits my small head. Love the mission of the company. Always nice to have both in a purchase."

- Amanda (Aug 2022)

Perfect for our Disney vacation

"I love this bag! It is perfectly roomy, but not bulky. I love that you can wear it crossbody or as a traditional fanny pack."

- Stephanie S. (Aug 2022)

Gifts They'll Love

Gifts for Hikers

Gifts for Hikers

Gifts for Dog Lovers

Gifts For Dog Lovers

Gifts With Pride

Gifts With Pride

Gifts for Kids

Gifts for Kids

Purchase with Purpose this Holiday Season

STEP 1

You buy dope, nature-inspired goods and look fly AF.

STEP 2

We pledge to pick up one pound of trash for every product in your order.

STEP 3

Together with our community of 5000+, we pick up trash on your behalf.

Cleanup Kits & Equipment

Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out

Our Purpose

Learn why we pick up trash and how we fulfill our pound for pound promise.

LEARN MORE

Wild Keepers

Join our worldwide movement to keep our environment trash free! Become a Wild Keeper and make an impact right where you live.

LEARN MORE

Read Our Journal

Get inspired for your next adventure with stories and tips from our community.

LEARN MORE

IN EVERY ORDER

Free Keep Nature Wild Trash Bag

Your purchase has purpose! Each order comes with a biodegradable trash bag so you can get trashy in nature and clean up our planet—on the trail, at the park, in your community, wherever it is you love to wander. Your small bag of trash makes a big impact.

• Made from recycled plastic

• Biodegradable

IN EVERY ORDER

Free Keep Nature Wild Trash Bag

Your purchase has purpose! Each order comes with a biodegradable trash bag so you can get trashy in nature and clean up our planet—on the trail, at the park, in your community, wherever it is you love to wander. Your small bag of trash makes a big impact.

• Made from recycled plastic
• Biodegradable

New Stickers

Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
Sold out
SHOP ALL STICKERS
class Campaign def initialize(condition, *qualifiers) @condition = (condition.to_s + '?').to_sym @qualifiers = PostCartAmountQualifier ? [] : [] rescue qualifiers.compact @line_item_selector = qualifiers.last unless @line_item_selector qualifiers.compact.each do |qualifier| is_multi_select = qualifier.instance_variable_get(:@conditions).is_a?(Array) if is_multi_select qualifier.instance_variable_get(:@conditions).each do |nested_q| @post_amount_qualifier = nested_q if nested_q.is_a?(PostCartAmountQualifier) @qualifiers << qualifier end else @post_amount_qualifier = qualifier if qualifier.is_a?(PostCartAmountQualifier) @qualifiers << qualifier end end if @qualifiers.empty? end def qualifies?(cart) return true if @qualifiers.empty? @unmodified_line_items = cart.line_items.map do |item| new_item = item.dup new_item.instance_variables.each do |var| val = item.instance_variable_get(var) new_item.instance_variable_set(var, val.dup) if val.respond_to?(:dup) end new_item end if @post_amount_qualifier @qualifiers.send(@condition) do |qualifier| is_selector = false if qualifier.is_a?(Selector) || qualifier.instance_variable_get(:@conditions).any? { |q| q.is_a?(Selector) } is_selector = true end rescue nil if is_selector raise "Missing line item match type" if @li_match_type.nil? cart.line_items.send(@li_match_type) { |item| qualifier.match?(item) } else qualifier.match?(cart, @line_item_selector) end end end def run_with_hooks(cart) before_run(cart) if respond_to?(:before_run) run(cart) after_run(cart) end def after_run(cart) @discount.apply_final_discount if @discount && @discount.respond_to?(:apply_final_discount) revert_changes(cart) unless @post_amount_qualifier.nil? || @post_amount_qualifier.match?(cart) end def revert_changes(cart) cart.instance_variable_set(:@line_items, @unmodified_line_items) end end class ConditionalDiscount < Campaign def initialize(condition, customer_qualifier, cart_qualifier, line_item_selector, discount, max_discounts) super(condition, customer_qualifier, cart_qualifier) @line_item_selector = line_item_selector @discount = discount @items_to_discount = max_discounts == 0 ? nil : max_discounts end def run(cart) raise "Campaign requires a discount" unless @discount return unless qualifies?(cart) applicable_items = cart.line_items.select { |item| @line_item_selector.nil? || @line_item_selector.match?(item) } applicable_items = applicable_items.sort_by { |item| item.variant.price } applicable_items.each do |item| break if @items_to_discount == 0 if (!@items_to_discount.nil? && item.quantity > @items_to_discount) discounted_items = item.split(take: @items_to_discount) @discount.apply(discounted_items) cart.line_items << discounted_items @items_to_discount = 0 else @discount.apply(item) @items_to_discount -= item.quantity if !@items_to_discount.nil? end end end end class Qualifier def partial_match(match_type, item_info, possible_matches) match_type = (match_type.to_s + '?').to_sym if item_info.kind_of?(Array) possible_matches.any? do |possibility| item_info.any? do |search| search.send(match_type, possibility) end end else possible_matches.any? do |possibility| item_info.send(match_type, possibility) end end end def compare_amounts(compare, comparison_type, compare_to) case comparison_type when :greater_than return compare > compare_to when :greater_than_or_equal return compare >= compare_to when :less_than return compare < compare_to when :less_than_or_equal return compare <= compare_to when :equal_to return compare == compare_to else raise "Invalid comparison type" end end end class CountryCodeQualifier < Qualifier def initialize(match_type, country_codes) @invert = match_type == :not_one @country_codes = country_codes.map(&:upcase) end def match?(cart, selector = nil) shipping_address = cart.shipping_address return false if shipping_address&.country_code.nil? @invert ^ @country_codes.include?(shipping_address.country_code.upcase) end end class CartAmountQualifier < Qualifier def initialize(behaviour, comparison_type, amount) @behaviour = behaviour @comparison_type = comparison_type @amount = Money.new(cents: amount * 100) end def match?(cart, selector = nil) total = cart.subtotal_price if @behaviour == :item || @behaviour == :diff_item total = cart.line_items.reduce(Money.zero) do |total, item| total + (selector&.match?(item) ? item.line_price : Money.zero) end end case @behaviour when :cart, :item compare_amounts(total, @comparison_type, @amount) when :diff_cart compare_amounts(cart.subtotal_price_was - @amount, @comparison_type, total) when :diff_item original_line_total = cart.line_items.reduce(Money.zero) do |total, item| total + (selector&.match?(item) ? item.original_line_price : Money.zero) end compare_amounts(original_line_total - @amount, @comparison_type, total) end end end class AndSelector def initialize(*conditions) @conditions = conditions.compact end def match?(item, selector = nil) @conditions.all? do |condition| if selector condition.match?(item, selector) else condition.match?(item) end end end end class Selector def partial_match(match_type, item_info, possible_matches) match_type = (match_type.to_s + '?').to_sym if item_info.kind_of?(Array) possible_matches.any? do |possibility| item_info.any? do |search| search.send(match_type, possibility) end end else possible_matches.any? do |possibility| item_info.send(match_type, possibility) end end end end class LineItemPropertiesSelector < Selector def initialize(target_properties) @target_properties = target_properties end def match?(line_item) line_item_props = line_item.properties @target_properties.all? do |key, value| next unless line_item_props.has_key?(key) true if line_item_props[key].downcase == value.downcase end end end class VariantIdSelector < Selector def initialize(match_type, variant_ids) @invert = match_type == :not_one @variant_ids = variant_ids.map { |id| id.to_i } end def match?(line_item) @invert ^ @variant_ids.include?(line_item.variant.id) end end class PercentageDiscount def initialize(percent, message) @discount = (100 - percent) / 100.0 @message = message end def apply(line_item) line_item.change_line_price(line_item.line_price * @discount, message: @message) end end CAMPAIGNS = [ ConditionalDiscount.new( :all, nil, AndSelector.new( CountryCodeQualifier.new( :is_one, ["US"] ), CartAmountQualifier.new( :cart, :greater_than_or_equal, 50 ), nil ), AndSelector.new( LineItemPropertiesSelector.new( {"_attribution" => "Rebuy Tiered Progress Bar"} ), VariantIdSelector.new( :is_one, ["37457563648191"] ), nil ), PercentageDiscount.new( 100, "Free Gift for spending 50 ".gsub("", Input.cart.presentment_currency) ), 1 ), ConditionalDiscount.new( :all, nil, AndSelector.new( CountryCodeQualifier.new( :not_one, ["US"] ), CartAmountQualifier.new( :cart, :greater_than_or_equal, 50 ), nil ), AndSelector.new( LineItemPropertiesSelector.new( {"_attribution" => "Rebuy Tiered Progress Bar"} ), VariantIdSelector.new( :is_one, ["37457563648191"] ), nil ), PercentageDiscount.new( 100, "Free Gift for spending 50 ".gsub("", Input.cart.presentment_currency) ), 1 ) ].freeze CAMPAIGNS.each do |campaign| campaign.run_with_hooks(Input.cart) end Output.cart = Input.cart