CertNode integrates with your existing platform to automatically create cryptographic receipts for every transaction, delivery, or event.
Automatic
Set up once, receipts are created automatically via webhooks
Secure
Uses OAuth or API keys with automatic token refresh
Monitored
Dashboard shows all receipt creation activity in real-time
Stripe Integration
Automatically create receipts for every Stripe payment
Status: Live β’ Setup Time: 5 minutes β’ Type: OAuth + Webhooks
Connect Your Stripe Account
In your CertNode dashboard, navigate to Integrations β Stripe and click Connect with Stripe. This uses OAuth to securely connect your Stripe account.
What happens: CertNode receives read-only access to your payment intents and charges. We never access customer payment methods or bank details.
Configure Webhook (Automatic)
CertNode automatically registers a webhook endpoint with Stripe. No manual configuration needed.
Webhook URL:
https://certnode.io/webhooks/stripe/YOUR_ACCOUNT_IDEvents monitored: payment_intent.succeeded, charge.succeeded, charge.refunded
Test the Integration
Create a test payment in Stripe (using test mode) and verify that a receipt appears in your CertNode dashboard.
β Success! Every Stripe payment now automatically creates a cryptographic receipt with:
- β’ Amount, currency, customer info (hashed)
- β’ ES256 signature + RFC 3161 timestamp
- β’ RFC 3161 compliant proof of transaction
Advanced: Custom Receipt Data
Add custom metadata to your Stripe payments to include additional data in receipts:
// When creating Stripe payment
const paymentIntent = await stripe.paymentIntents.create({
amount: 29999,
currency: 'usd',
metadata: {
certnode_product_name: 'Annual Subscription',
certnode_subscription_id: 'sub_123',
certnode_customer_tier: 'premium'
}
})
// CertNode automatically includes metadata in receiptShopify Integration
Create receipts for Shopify orders with fulfillment tracking
Status: API Available β’ Setup Time: 10 minutes β’ Type: Shopify App + Webhooks
Install Shopify App
Visit the Shopify App Listing and click Install App. Approve the requested permissions.
Permissions Required: read_orders, read_customers (hashed), read_fulfillments
Configure Receipt Types
Choose which Shopify events should create receipts:
Test with Sample Order
Create a test order in Shopify and verify receipt creation:
Expected Receipt Chain:
Custom Integration
Integrate CertNode with any platform using our REST API
Setup Time: 30-60 minutes β’ Difficulty: Intermediate
Identify Receipt Creation Points
Determine where in your application you want to create receipts:
- β’ After payment processor confirms charge
- β’ When refund is issued
- β’ When subscription renews
- β’ When file is downloaded
- β’ When AI content is generated
- β’ When video is streamed
- β’ When API call is made
- β’ When critical event occurs
- β’ When compliance action taken
Create Receipt Helper Function
Create a reusable function to create receipts:
// lib/certnode.ts
import crypto from 'crypto'
export async function createReceipt(params: {
type: 'transaction' | 'content' | 'operations'
data: Record<string, any>
metadata?: Record<string, any>
parentId?: string
}) {
// Hash any PII before sending
const sanitizedData = {
...params.data,
customer_email_hash: params.data.customer_email
? crypto.createHash('sha256').update(params.data.customer_email).digest('hex')
: undefined,
}
delete sanitizedData.customer_email // Remove raw email
const response = await fetch('https://certnode.io/api/v1/receipts', {
method: 'POST',
headers: {
'X-API-Key': process.env.CERTNODE_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: params.type,
data: sanitizedData,
metadata: params.metadata,
parent_id: params.parentId,
}),
})
if (!response.ok) {
throw new Error(`Failed to create receipt: ${response.statusText}`)
}
return response.json()
}Call from Your Application
Use the helper function where needed:
// Example: After processing payment
async function processPayment(orderId: string) {
// 1. Process payment with your payment processor
const payment = await paymentProcessor.charge(...)
// 2. Create CertNode receipt
const receipt = await createReceipt({
type: 'transaction',
data: {
amount: payment.amount,
currency: payment.currency,
product: payment.product_name,
customer_email: payment.customer_email, // Will be hashed
order_id: orderId,
},
metadata: {
platform: 'custom_app',
payment_processor: 'stripe',
environment: process.env.NODE_ENV,
},
})
// 3. Store receipt ID for later reference
await db.orders.update(orderId, {
certnode_receipt_id: receipt.id,
certnode_verification_url: receipt.verification_url,
})
// 4. (Optional) Send verification URL to customer
await sendEmail(payment.customer_email, {
subject: 'Receipt for your purchase',
body: `Your cryptographic receipt: ${receipt.verification_url}`,
})
return receipt
}Handle Receipt Chains (Optional)
Link related receipts together:
// Example: Order β Fulfillment β Delivery chain
async function fulfillOrder(orderId: string) {
const order = await db.orders.findById(orderId)
// Create fulfillment receipt linked to order receipt
const fulfillmentReceipt = await createReceipt({
type: 'operations',
data: {
event: 'order_fulfilled',
order_id: orderId,
tracking_number: '1Z999AA10123456784',
shipped_date: new Date().toISOString(),
},
metadata: {
platform: 'custom_app',
},
parentId: order.certnode_receipt_id, // Link to order receipt
})
return fulfillmentReceipt
}Integration Best Practices
β οΈ Error Handling
Always handle receipt creation failures gracefully. A failed receipt should not block your core business logic.
try {
await createReceipt({ ... })
} catch (error) {
// Log error but don't fail the transaction
console.error('Receipt creation failed:', error)
await monitoring.logError('certnode_receipt_failure', error)
}π Retry Logic
Implement exponential backoff for transient failures. CertNode automatically retries timestamp requests, but network failures may need client-side retries.
π Monitoring
Monitor receipt creation rates and failures in your CertNode dashboard. Set up alerts for unusual patterns.
π§ͺ Testing
Use separate API keys for test and production environments. Test receipts are marked with metadata.environment = "test".