Optimization Guide
Shopify Charitable Donation Product Schema for AI Shopping Agents
AI shopping agents answer "products that donate to charity," "buy one give one shoes," and "1% for the planet certified" by reading structured data — not your product description or footer badge. Shopify includes zero donation signals in its default JSON-LD, making every impact claim invisible to AI shopping indexes.
additionalProperty blocks to your product Offer with propertyID values for charityBeneficiary, donationPercentage, and donationMechanism. Add a sponsor property linking to an Organization for the charity. For certified programs (1% for the Planet, B1G1, Pledge 1%), use hasCertification on the Product with issuedBy and a sameAs URL to the certifying body. Drive everything from product tags or metafields in Shopify Liquid.
The Social Impact Visibility Gap
Cause-marketing is one of the fastest-growing product differentiation signals in DTC e-commerce. Studies show that 66% of consumers prefer brands that donate to social causes, and "products that give back" is a rapidly growing query category across AI shopping platforms. Yet virtually every Shopify store that participates in charity programs — whether it's donating a percentage of sales, matching purchases with donations, or operating buy-one-give-one programs — stores this information exclusively in text: product descriptions, homepage banners, footer badges.
When ChatGPT Shopping, Perplexity Commerce, or Google AI Mode answers queries like "sustainable brands that donate to ocean cleanup" or "socks where buying helps the homeless," those AI agents are not reading your product description. They are scanning structured data — and without the right JSON-LD signals, your impact claims are invisible regardless of how prominently you display them.
Donation query types that require structured data
| Query type | Example | Required signal | AI shopping behavior |
|---|---|---|---|
| Products that donate to charity | "products that give back to veterans" | additionalProperty: charityBeneficiary |
Surfaces products with named charity beneficiary in structured data |
| Buy-one-give-one | "buy one give one shoes" | additionalProperty: donationMechanism: buy-one-give-one |
Matches donation mechanism type against known BOGO patterns |
| Percentage of profits | "candles that donate 10% to charity" | additionalProperty: donationPercentage: 10 |
Filters or compares products by donation rate |
| Certified programs | "1% for the planet certified products" | hasCertification with issuedBy Organization |
Verifies certification against known third-party program identifiers |
| Social impact category | "eco-friendly products that support reforestation" | sponsor Organization + charityCategory additionalProperty |
Combines cause category with charity linkage to surface cause-specific results |
Shopify default vs. donation-complete JSON-LD
{
"@type": "Offer",
"price": "45.00",
"priceCurrency": "USD",
"availability": "InStock"
// "10% to ocean cleanup"
// buried in description text
}
{
"@type": "Offer",
"price": "45.00",
"sponsor": {
"@type": "Organization",
"name": "Ocean Conservancy",
"url": "https://oceanconservancy.org"
},
"additionalProperty": [{
"propertyID":
"donationPercentage",
"value": "10"
}]
}
Donation JSON-LD Patterns
Minimum viable donation signal — percentage of sale
The simplest donation signal is a percentage-of-sale declaration. This handles the most common query type ("products that donate X% to charity") and is sufficient to appear in cause-driven recommendation results:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Organic Cotton Tote Bag",
"offers": {
"@type": "Offer",
"price": "28.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"sponsor": {
"@type": "Organization",
"name": "World Wildlife Fund",
"url": "https://www.worldwildlife.org",
"sameAs": "https://en.wikipedia.org/wiki/World_Wildlife_Fund"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "donationPercentage",
"name": "Donation percentage",
"value": "10"
},
{
"@type": "PropertyValue",
"propertyID": "charityBeneficiary",
"name": "Charity beneficiary",
"value": "World Wildlife Fund"
}
]
}
}
Buy-one-give-one (BOGO) donation model
For buy-one-give-one programs — where purchasing one unit triggers a donation of a product (not cash) to a person in need — declare the mechanism type explicitly. AI agents match "buy one give one" as a distinct donation model:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Merino Wool Socks 3-Pack",
"offers": {
"@type": "Offer",
"price": "38.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"sponsor": {
"@type": "Organization",
"name": "Bombas Giving",
"url": "https://bombas.com/pages/giving-back"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "donationMechanism",
"name": "Donation mechanism",
"value": "buy-one-give-one"
},
{
"@type": "PropertyValue",
"propertyID": "donationRecipient",
"name": "Donation recipient",
"value": "Homeless shelters and community organizations across the US"
},
{
"@type": "PropertyValue",
"propertyID": "donatedItem",
"name": "Donated item",
"value": "One pair of socks per purchase donated to a homeless shelter"
}
]
}
}
Certified 1% for the Planet program
For products participating in recognized impact certification programs, use hasCertification on the Product type alongside Offer-level donation signals. This gives AI agents two independent verification paths:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Reusable Water Bottle — 32oz",
"hasCertification": {
"@type": "Certification",
"name": "1% for the Planet Member",
"certificationStatus": "https://schema.org/CertificationActive",
"issuedBy": {
"@type": "Organization",
"name": "1% for the Planet",
"url": "https://www.onepercentfortheplanet.org",
"sameAs": "https://en.wikipedia.org/wiki/1%25_for_the_Planet"
},
"url": "https://www.onepercentfortheplanet.org/members"
},
"offers": {
"@type": "Offer",
"price": "34.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "donationPercentage",
"name": "Donation percentage",
"value": "1"
},
{
"@type": "PropertyValue",
"propertyID": "charityCategory",
"name": "Charity category",
"value": "Environmental conservation"
}
]
}
}
Fixed-amount per-sale donation
When your model donates a fixed dollar amount per sale rather than a percentage, use donationPerSale with a MonetaryAmount value. This enables queries like "products where $5 goes to charity":
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Handcrafted Beeswax Candle",
"offers": {
"@type": "Offer",
"price": "22.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"sponsor": {
"@type": "Organization",
"name": "Habitat for Humanity",
"url": "https://www.habitat.org",
"sameAs": "https://en.wikipedia.org/wiki/Habitat_for_Humanity"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "donationPerSale",
"name": "Donation per sale",
"value": {
"@type": "MonetaryAmount",
"value": "3.00",
"currency": "USD"
}
},
{
"@type": "PropertyValue",
"propertyID": "charityBeneficiary",
"name": "Charity beneficiary",
"value": "Habitat for Humanity"
}
]
}
}
Shopify Liquid implementation
Store donation data in product metafields under a donation namespace. Use product tags as a lightweight gate before injecting the JSON-LD block:
{% comment %}Donation structured data — driven by product.metafields.donation.*{% endcomment %}
{% assign has_donation = false %}
{% for tag in product.tags %}
{% if tag == 'gives-back' or tag == 'charity' or tag == 'bogo-donate' %}
{% assign has_donation = true %}
{% endif %}
{% endfor %}
{% if has_donation %}
{% assign donation_pct = product.metafields.donation.percentage | default: '' %}
{% assign donation_charity = product.metafields.donation.charity_name | default: '' %}
{% assign donation_url = product.metafields.donation.charity_url | default: '' %}
{% assign donation_mech = product.metafields.donation.mechanism | default: 'percentage-of-sale' %}
{% if donation_charity != '' %}
"sponsor": {
"@type": "Organization",
"name": {{ donation_charity | json }},
"url": {{ donation_url | json }}
},
"additionalProperty": [
{% if donation_pct != '' %}
{
"@type": "PropertyValue",
"propertyID": "donationPercentage",
"name": "Donation percentage",
"value": {{ donation_pct | json }}
},
{% endif %}
{
"@type": "PropertyValue",
"propertyID": "donationMechanism",
"name": "Donation mechanism",
"value": {{ donation_mech | json }}
},
{
"@type": "PropertyValue",
"propertyID": "charityBeneficiary",
"name": "Charity beneficiary",
"value": {{ donation_charity | json }}
}
]
{% endif %}
{% endif %}
Donation signal reference by program type
| Program type | Primary signal | Supporting signal | Certification body |
|---|---|---|---|
| Percentage of sale | donationPercentage additionalProperty |
charityBeneficiary + sponsor |
Self-declared (add verificationUrl for credibility) |
| Fixed amount per sale | donationPerSale MonetaryAmount |
sponsor Organization |
Self-declared |
| Buy-one-give-one | donationMechanism: buy-one-give-one |
donationRecipient + donatedItem |
B1G1 program (b1g1.com), brand-owned |
| 1% for the Planet | hasCertification with issuedBy |
donationPercentage: 1 |
1% for the Planet (onepercentfortheplanet.org) |
| Pledge 1% / B Corp | hasCertification B Corp |
charityCategory: community development |
B Lab (bcorporation.net) |
Common Mistakes
1. Donating in description text only
The most common pattern: "10% of every purchase goes to ocean cleanup" lives in the product description field or a product tab. AI agents parse additionalProperty and sponsor in structured JSON-LD — prose in description is used for text search scoring but not for cause-filter queries. Always add a structured signal alongside any text mention.
2. Using hasCertification without issuedBy
A bare hasCertification block without an issuedBy Organization is treated as a self-declared claim with no verification chain. AI agents that weight third-party certification (Perplexity Commerce weighs this heavily for trust) will score the claim as unverified. Always include issuedBy with the certifying body's URL and ideally a sameAs to a Wikipedia or verified profile.
3. Claiming hasCertification for lapsed or unverified membership
If your 1% for the Planet membership lapsed or you are using the certification badge without an active membership, adding hasCertification with certificationStatus: CertificationActive is a false claim. AI agents that cross-reference certification status against the issuing body's public member list will flag the mismatch. Only use CertificationActive for current, verifiable memberships.
4. Missing the sponsor linkage on BOGO products
For buy-one-give-one programs, the donationMechanism additionalProperty tells AI agents the mechanism — but without a sponsor Organization identifying the recipient program, there is no structured answer to "which BOGO products support veterans?" Always pair the mechanism with a named recipient organization.
5. Injecting donation signals on every product without a null-guard
If you add donation JSON-LD to your product.liquid template without checking whether a product actually participates in a charity program, non-donation products will silently inject empty or null donation signals. Use a product tag gate ({% for tag in product.tags %}{% if tag == 'gives-back' %}{% endif %}{% endfor %}) or check the metafield for a non-empty value before outputting the block.
Implementation Checklist
- Add
additionalProperty: charityBeneficiarywith the charity's name on every donation-linked product Offer - Add
sponsorOrganization to the Offer with the charity's URL and sameAs Wikipedia link - Choose the correct donation mechanism:
donationPercentage,donationPerSaleMonetaryAmount, ordonationMechanism: buy-one-give-one - For certified programs, add
hasCertificationon the Product withissuedByandcertificationStatus: CertificationActive - Store donation data in product metafields under a
donationnamespace - Gate injection with a product tag check to avoid empty signals on non-donation products
- Include a
charityCategoryadditionalProperty for cause-based query matching (environment, health, education, etc.) - For BOGO programs, add
donationRecipientanddonatedItemadditionalProperty for maximum AI agent coverage - Run CatalogScan to verify donation signals appear in your AI readiness report
Frequently Asked Questions
How do I add charity donation information to Shopify product structured data?
Use additionalProperty blocks on the Offer with propertyID values like charityBeneficiary, donationPercentage, and donationMechanism. Add a sponsor property on the Offer linking to an Organization representing the charity. Store values in Shopify product metafields under a donation namespace and inject conditionally in product.liquid via a product tag gate.
Does Shopify include charity or donation signals in its default product JSON-LD?
No. Shopify's default product JSON-LD outputs a basic Offer with price, availability, and currency — no donation or cause signals. Text in product descriptions, badges in footer areas, or trust seals on product pages are plain HTML — they are not machine-readable by AI shopping agents. You must add donation signals manually to product.liquid.
What is the difference between a sponsor and a charityBeneficiary additionalProperty?
The sponsor property is a first-class schema.org relationship linking the Offer to an Organization entity. It signals a formal partnership with a structured identity. The charityBeneficiary additionalProperty carries the beneficiary name as a string — useful for text matching. Use both: sponsor for structured linkage, additionalProperty for the parseable claim. AI agents weight the sponsor relationship more heavily than a string property.
How do I mark up buy-one-give-one (BOGO) products in structured data?
Add two additionalProperty blocks: donationMechanism with value buy-one-give-one and donationRecipient with the recipient organization name. If the donated product goes to a specific geography or demographic, add donationRegion or donationRecipientDescription as a third property. Pair with a sponsor Organization for the full structured signal.
Can I mark up multiple charity beneficiaries on a single product?
Yes. Use an array of additionalProperty blocks, one per charity, with distinct propertyID values (charityBeneficiary1, charityBeneficiary2). For the sponsor property, reference the primary charity. For secondary beneficiaries, use additionalProperty with a clear split description in the value string. Keep the donation percentage or amount for each beneficiary explicit.